This file is indexed.

/usr/include/fplll/nr/nr_Z.inl is in libfplll-dev 5.0.3-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
/*********************
 *   Integer Class
 *********************/

#ifndef FPLLL_NR_Z_H
#define FPLLL_NR_Z_H

FPLLL_BEGIN_NAMESPACE

/* declaration FP_NR */
template<class F> class FP_NR;


/**
 * Z_NR stores integers. This template provides a uniform interface 
 *  for doing integer computations with several underlying types
 *  (long, double and mpz_t). 
 */
template<class Z>
class Z_NR
{

  Z data;

public:

  /**
   * Constructors.
   */
  inline Z_NR<Z>();
  inline Z_NR<Z>(const Z_NR<Z>& z);
  inline ~Z_NR<Z>();

  /** get data */

  /**
   * Returns the internal representation of the data.
   */
  inline Z& get_data()             {return data;}

  /**
   * Returns the internal representation of the data.
   */
  inline const Z& get_data() const {return data;}

  /**
   * Converts this object to a double. If it does not fit in 
   *  a double, the result is undefined.
   */
  inline double get_d() const;

  /**
   * Converts this object to a long double. If it does not fit in 
   * a long double, the result is undefined.
   */
#ifdef FPLLL_WITH_LONG_DOUBLE
  inline long double get_ld() const;
#endif

  /**
   * Converts this object to a long. If it does not fit in a long,
   * the result is undefined. 
   */
  inline long get_si() const;

  /**
   * Converts this object to a mpz. 
   */
  inline void get_mpz(mpz_t r) const;

  /**
   * Returns the smallest non-negative expo such that |value| < 2^expo. 
   */
  inline long exponent() const;

  /**
   * Computes f and expo such that 0.5 <= f < 1 and value ~= 2^expo * f.
   *   The rounding direction is undefined.
   *   This function is implemented only for native floating-point types
   *   (double and long double), otherwise the behaviour is undefined. 
   */
  template<class F> inline void get_f_exp(F& f, long& expo);

  /** set data */

  /**
   * Sets the value to x. When FT=mpfr_t, x is rounded to the nearest 
   * integer and if the fractional part of x is 0.5, the even integer 
   * is chosen when. Otherwise, the rounding direction is undefined.
   */
  template<class F> inline void set_f(const FP_NR<F>& f);

  /**
   * Sets the value to s, signed integer in basis 10. 
   */
  inline void set_str(const char* s);

  /** comparison */

  /**
   * 3-way comparison. Returns a positive number if *this > m, a 
   * negative number if *this &lt; m or zero is *this == m. 
   */
  inline int cmp(const Z_NR<Z>& m) const;

  /**
   * Sign. Returns a positive number, a negative number or zero 
   * if the value of this object is respectively positive, 
   * negative or null. 
   */
  inline int sgn() const;

  /**
   * Operator
   */
  inline void operator=(const Z_NR<Z>& z);
  inline void operator=(const mpz_t& z);
  inline void operator=(long i);
  inline bool operator<(const Z_NR<Z>& a) const;
  inline bool operator<(long a) const;
  inline bool operator>(const Z_NR<Z>& a) const;
  inline bool operator>(long a) const;
  inline bool operator<=(const Z_NR<Z>& a) const;
  inline bool operator<=(long a) const;
  inline bool operator>=(const Z_NR<Z>& a) const;
  inline bool operator>=(long a) const;
  inline bool operator==(const Z_NR<Z>& a) const;
  inline bool operator==(long a) const;
  inline bool operator!=(const Z_NR<Z>& a) const;
  inline bool operator!=(long a) const;

  /**
   * max between a and b
   */
  inline Z_NR& max_z(Z_NR<Z>& b) {
    if ((*this)<=b)
      return b;
    else
      return (*this);
  }

  /**
   * Returns non-zero if the current value is zero, 0 otherwise.
   */
  inline bool is_zero() const {return *this == 0;}

  /** arithmetic */

  /**
   * value := a + b. 
   */
  inline void add(const Z_NR<Z>& a, const Z_NR<Z>& b);
  inline void add_ui(const Z_NR<Z>& a, unsigned int b);
  /**
   * value := a - b. 
   */
  inline void sub(const Z_NR<Z>& a, const Z_NR<Z>& b);
  inline void sub_ui(const Z_NR<Z>& a, unsigned int b);

  /**
   * value := -a. 
   */
  inline void neg(const Z_NR<Z>& a);

  /**
   * value := a * b. 
   */
  inline void mul(const Z_NR<Z>& a, const Z_NR<Z>& b);

  /**
   * value := a * b. 
   */
  inline void mul_si(const Z_NR<Z>& a, long b);
  inline void mul_ui(const Z_NR<Z>& a, unsigned long b);

  /**
   * value := a * 2^b.
   * if Z=long and |b| >= size_in_bits(a), the result is undefined.
   */
  inline void mul_2si(const Z_NR<Z>& a, long b);

  /**
   * value := a / 2^b.
   * if Z=long and |b| >= size_in_bits(a), the result is undefined.
   */
  inline void div_2si(const Z_NR<Z>& a, long b);

  /**
   * value := value + a * b. 
   */
  inline void addmul(const Z_NR<Z>& a, const Z_NR<Z>& b);
  inline void addmul_ui(const Z_NR<Z>& a, unsigned long b);
  inline void addmul_si(const Z_NR<Z>& a, long b);

  /**
   * value := value - a * b. 
   */
  inline void submul(const Z_NR<Z>& a, const Z_NR<Z>& b);
  inline void submul_ui(const Z_NR<Z>& a, unsigned long b);

  /**
   * value := absolute value of a. 
   */
  inline void abs(const Z_NR<Z>& a);

  /**
   * Efficiently swaps the values of two Z_NR.
   */
  inline void swap(Z_NR<Z>& a);

  /**
   * Generates random integer between 0 and 2^bits-1. 
   */
  inline void randb(int bits);
  inline void randb_si(int bits);

  /**
   * Generates random integer between 0 and max - 1  
   */
  inline void randm(const Z_NR<Z>& max);
  inline void randm_si(const Z_NR<Z>& max);

  /**	 
   * Generates smallest prime number above nbr 
  */
  inline void nextprime(const Z_NR<Z>& nbr);

};


/**
 * LDConvHelper provides conversion functions between mpz_t and
 * long double which are not (yet) in GMP. It uses mpfr so it is slow.
 */
#ifdef FPLLL_WITH_LONG_DOUBLE

class LDConvHelper {
public:
  /** Converts op to a long double with rounding to nearest. */
  static long double mpz_get_ld(const mpz_t op) {
    init_temp();
    mpfr_set_z(temp, op, GMP_RNDN);
    return mpfr_get_ld(temp, GMP_RNDN); // exact
  }

  static void free() {
    free_temp();
  }

  /**
   * Returns d and sets exp such that 0.5 <= |d| < 1 and d * 2^exp is equal
   * to op rounded to the nearest long double.
   */
  static long double mpz_get_ld_2exp(long* exp, const mpz_t op) {
    init_temp();
    mpfr_set_z(temp, op, GMP_RNDN);
    return mpfr_get_ld_2exp(exp, temp, GMP_RNDN); // exact
  }

  /** Sets the value of rop from op. */
  static void mpz_set_ld(mpz_t rop, long double op) {
    init_temp();
    mpfr_set_ld(temp, op, GMP_RNDN); // exact
    mpfr_get_z(rop, temp, GMP_RNDN);
  }

private:
  static inline void init_temp() {
    if (!temp_initialized) {
      mpfr_init2(temp, numeric_limits<long double>::digits);
      temp_initialized = true;
    }
  }

  static inline void free_temp() {
    if (temp_initialized) {
      mpfr_clear(temp);
      temp_initialized = false;
    }
  }

  // These static members are initialized in util.cpp
  static mpfr_t temp;
  static bool temp_initialized;
};

#endif


/** overloading stream operators */

/**
 * Prints x on stream os. 
 */
template<class T> 
ostream& operator<<(ostream& os, const Z_NR<T>& x);

/**
 * Reads x from stream is.
 */
template<class T>
istream& operator>>(istream& is, Z_NR<T>& x);


FPLLL_END_NAMESPACE

#endif