1 | |
---|
2 | #ifndef NTL_GF2X__H |
---|
3 | #define NTL_GF2X__H |
---|
4 | |
---|
5 | #include <NTL/vector.h> |
---|
6 | #include <NTL/ZZ.h> |
---|
7 | #include <NTL/WordVector.h> |
---|
8 | #include <NTL/vec_GF2.h> |
---|
9 | |
---|
10 | NTL_OPEN_NNS |
---|
11 | |
---|
12 | |
---|
13 | class GF2X { |
---|
14 | public: |
---|
15 | |
---|
16 | WordVector xrep; |
---|
17 | |
---|
18 | typedef vec_GF2 VectorBaseType; |
---|
19 | |
---|
20 | |
---|
21 | GF2X() { } |
---|
22 | ~GF2X() { } |
---|
23 | |
---|
24 | GF2X(INIT_SIZE_TYPE, long n); |
---|
25 | |
---|
26 | GF2X& operator=(const GF2X& a) { xrep = a.xrep; return *this; } |
---|
27 | |
---|
28 | inline GF2X& operator=(GF2 a); |
---|
29 | inline GF2X& operator=(long a); |
---|
30 | |
---|
31 | void normalize(); |
---|
32 | |
---|
33 | static const GF2X& zero(); |
---|
34 | |
---|
35 | void kill() { xrep.kill(); } |
---|
36 | |
---|
37 | void SetMaxLength(long n); |
---|
38 | |
---|
39 | static long HexOutput; |
---|
40 | |
---|
41 | inline GF2X(long i, GF2 c); |
---|
42 | inline GF2X(long i, long c); |
---|
43 | |
---|
44 | GF2X(GF2X& x, INIT_TRANS_TYPE) : xrep(x.xrep, INIT_TRANS) { } |
---|
45 | |
---|
46 | }; |
---|
47 | |
---|
48 | |
---|
49 | long IsZero(const GF2X& a); |
---|
50 | |
---|
51 | long IsOne(const GF2X& a); |
---|
52 | |
---|
53 | long IsX(const GF2X& a); |
---|
54 | |
---|
55 | GF2 coeff(const GF2X& a, long i); |
---|
56 | |
---|
57 | GF2 LeadCoeff(const GF2X& a); |
---|
58 | |
---|
59 | GF2 ConstTerm(const GF2X& a); |
---|
60 | |
---|
61 | |
---|
62 | inline void clear(GF2X& x) |
---|
63 | { x.xrep.ZeroLength(); } |
---|
64 | |
---|
65 | void set(GF2X& x); |
---|
66 | |
---|
67 | void SetX(GF2X& x); |
---|
68 | |
---|
69 | void SetCoeff(GF2X& x, long i); |
---|
70 | |
---|
71 | void SetCoeff(GF2X& x, long i, GF2 a); |
---|
72 | void SetCoeff(GF2X& x, long i, long a); |
---|
73 | |
---|
74 | inline GF2X::GF2X(long i, GF2 a) |
---|
75 | { SetCoeff(*this, i, a); } |
---|
76 | |
---|
77 | inline GF2X::GF2X(long i, long a) |
---|
78 | { SetCoeff(*this, i, a); } |
---|
79 | |
---|
80 | void swap(GF2X& a, GF2X& b); |
---|
81 | |
---|
82 | long deg(const GF2X& aa); |
---|
83 | |
---|
84 | long weight(const GF2X& a); |
---|
85 | |
---|
86 | long operator==(const GF2X& a, const GF2X& b); |
---|
87 | |
---|
88 | inline long operator!=(const GF2X& a, const GF2X& b) |
---|
89 | { return !(a == b); } |
---|
90 | |
---|
91 | long operator==(const GF2X& a, GF2 b); |
---|
92 | long operator==(const GF2X& a, long b); |
---|
93 | |
---|
94 | inline long operator==(GF2 a, const GF2X& b) { return b == a; } |
---|
95 | inline long operator==(long a, const GF2X& b) { return b == a; } |
---|
96 | |
---|
97 | inline long operator!=(const GF2X& a, GF2 b) { return !(a == b); } |
---|
98 | inline long operator!=(const GF2X& a, long b) { return !(a == b); } |
---|
99 | inline long operator!=(GF2 a, const GF2X& b) { return !(a == b); } |
---|
100 | inline long operator!=(long a, const GF2X& b) { return !(a == b); } |
---|
101 | |
---|
102 | |
---|
103 | |
---|
104 | |
---|
105 | void random(GF2X& x, long n); |
---|
106 | inline GF2X random_GF2X(long n) |
---|
107 | { GF2X x; random(x, n); NTL_OPT_RETURN(GF2X, x); } |
---|
108 | |
---|
109 | |
---|
110 | |
---|
111 | |
---|
112 | void add(GF2X& x, const GF2X& a, const GF2X& b); |
---|
113 | void add(GF2X& x, const GF2X& a, GF2 b); |
---|
114 | void add(GF2X& x, const GF2X& a, long b); |
---|
115 | |
---|
116 | inline void add(GF2X& x, GF2 a, const GF2X& b) { add(x, b, a); } |
---|
117 | inline void add(GF2X& x, long a, const GF2X& b) { add(x, b, a); } |
---|
118 | |
---|
119 | inline void sub(GF2X& x, const GF2X& a, const GF2X& b) { add(x, a, b); } |
---|
120 | inline void sub(GF2X& x, const GF2X& a, GF2 b) { add(x, a, b); } |
---|
121 | inline void sub(GF2X& x, const GF2X& a, long b) { add(x, a, b); } |
---|
122 | inline void sub(GF2X& x, GF2 a, const GF2X& b) { add(x, a, b); } |
---|
123 | inline void sub(GF2X& x, long a, const GF2X& b) { add(x, a, b); } |
---|
124 | |
---|
125 | inline void negate(GF2X& x, const GF2X& a) { x = a; } |
---|
126 | |
---|
127 | inline GF2X operator+(const GF2X& a, const GF2X& b) |
---|
128 | { GF2X x; add(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
129 | |
---|
130 | inline GF2X operator+(const GF2X& a, GF2 b) |
---|
131 | { GF2X x; add(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
132 | |
---|
133 | inline GF2X operator+(const GF2X& a, long b) |
---|
134 | { GF2X x; add(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
135 | |
---|
136 | inline GF2X operator+(GF2 a, const GF2X& b) |
---|
137 | { GF2X x; add(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
138 | |
---|
139 | inline GF2X operator+(long a, const GF2X& b) |
---|
140 | { GF2X x; add(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
141 | |
---|
142 | |
---|
143 | inline GF2X operator-(const GF2X& a, const GF2X& b) |
---|
144 | { GF2X x; sub(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
145 | |
---|
146 | inline GF2X operator-(const GF2X& a, GF2 b) |
---|
147 | { GF2X x; sub(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
148 | |
---|
149 | inline GF2X operator-(const GF2X& a, long b) |
---|
150 | { GF2X x; sub(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
151 | |
---|
152 | inline GF2X operator-(GF2 a, const GF2X& b) |
---|
153 | { GF2X x; sub(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
154 | |
---|
155 | inline GF2X operator-(long a, const GF2X& b) |
---|
156 | { GF2X x; sub(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
157 | |
---|
158 | |
---|
159 | inline GF2X& operator+=(GF2X& x, const GF2X& b) |
---|
160 | { add(x, x, b); return x; } |
---|
161 | |
---|
162 | inline GF2X& operator+=(GF2X& x, GF2 b) |
---|
163 | { add(x, x, b); return x; } |
---|
164 | |
---|
165 | inline GF2X& operator+=(GF2X& x, long b) |
---|
166 | { add(x, x, b); return x; } |
---|
167 | |
---|
168 | inline GF2X& operator-=(GF2X& x, const GF2X& b) |
---|
169 | { sub(x, x, b); return x; } |
---|
170 | |
---|
171 | inline GF2X& operator-=(GF2X& x, GF2 b) |
---|
172 | { sub(x, x, b); return x; } |
---|
173 | |
---|
174 | inline GF2X& operator-=(GF2X& x, long b) |
---|
175 | { sub(x, x, b); return x; } |
---|
176 | |
---|
177 | |
---|
178 | inline GF2X operator-(const GF2X& a) |
---|
179 | { GF2X x; negate(x, a); NTL_OPT_RETURN(GF2X, x); } |
---|
180 | |
---|
181 | inline GF2X& operator++(GF2X& x) { add(x, x, 1); return x; } |
---|
182 | inline void operator++(GF2X& x, int) { add(x, x, 1); } |
---|
183 | inline GF2X& operator--(GF2X& x) { sub(x, x, 1); return x; } |
---|
184 | inline void operator--(GF2X& x, int) { sub(x, x, 1); } |
---|
185 | |
---|
186 | |
---|
187 | void mul(GF2X& c, const GF2X& a, const GF2X& b); |
---|
188 | void OldMul(GF2X& c, const GF2X& a, const GF2X& b); |
---|
189 | |
---|
190 | void mul(GF2X& x, const GF2X& a, GF2 b); |
---|
191 | void mul(GF2X& x, const GF2X& a, long b); |
---|
192 | |
---|
193 | inline void mul(GF2X& x, GF2 a, const GF2X& b) { mul(x, b, a); } |
---|
194 | inline void mul(GF2X& x, long a, const GF2X& b) { mul(x, b, a); } |
---|
195 | |
---|
196 | void MulByX(GF2X& x, const GF2X& a); |
---|
197 | inline GF2X MulByX(const GF2X& a) |
---|
198 | { GF2X x; MulByX(x, a); NTL_OPT_RETURN(GF2X, x); } |
---|
199 | |
---|
200 | |
---|
201 | void sqr(GF2X& c, const GF2X& a); |
---|
202 | |
---|
203 | inline GF2X sqr(const GF2X& a) |
---|
204 | { GF2X x; sqr(x, a); NTL_OPT_RETURN(GF2X, x); } |
---|
205 | |
---|
206 | void trunc(GF2X& x, const GF2X& a, long m); |
---|
207 | inline GF2X trunc(const GF2X& a, long m) |
---|
208 | { GF2X x; trunc(x, a, m); NTL_OPT_RETURN(GF2X, x); } |
---|
209 | |
---|
210 | |
---|
211 | inline GF2X operator*(const GF2X& a, const GF2X& b) |
---|
212 | { GF2X x; mul(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
213 | |
---|
214 | inline GF2X operator*(const GF2X& a, GF2 b) |
---|
215 | { GF2X x; mul(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
216 | |
---|
217 | inline GF2X operator*(const GF2X& a, long b) |
---|
218 | { GF2X x; mul(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
219 | |
---|
220 | inline GF2X operator*(GF2 a, const GF2X& b) |
---|
221 | { GF2X x; mul(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
222 | |
---|
223 | inline GF2X operator*(long a, const GF2X& b) |
---|
224 | { GF2X x; mul(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
225 | |
---|
226 | inline GF2X& operator*=(GF2X& x, const GF2X& b) |
---|
227 | { mul(x, x, b); return x; } |
---|
228 | |
---|
229 | inline GF2X& operator*=(GF2X& x, GF2 b) |
---|
230 | { mul(x, x, b); return x; } |
---|
231 | |
---|
232 | inline GF2X& operator*=(GF2X& x, long b) |
---|
233 | { mul(x, x, b); return x; } |
---|
234 | |
---|
235 | void power(GF2X& x, const GF2X& a, long e); // x = a^e (e >= 0) |
---|
236 | inline GF2X power(const GF2X& a, long e) |
---|
237 | { GF2X x; power(x, a, e); NTL_OPT_RETURN(GF2X, x); } |
---|
238 | |
---|
239 | |
---|
240 | |
---|
241 | NTL_vector_decl(GF2X,vec_GF2X) |
---|
242 | |
---|
243 | NTL_eq_vector_decl(GF2X,vec_GF2X) |
---|
244 | |
---|
245 | |
---|
246 | void LeftShift(GF2X& c, const GF2X& a, long n); |
---|
247 | inline GF2X LeftShift(const GF2X& a, long n) |
---|
248 | { GF2X x; LeftShift(x, a, n); NTL_OPT_RETURN(GF2X, x); } |
---|
249 | |
---|
250 | void ShiftAdd(GF2X& c, const GF2X& a, long n); |
---|
251 | |
---|
252 | |
---|
253 | void RightShift(GF2X& c, const GF2X& a, long n); |
---|
254 | inline GF2X RightShift(const GF2X& a, long n) |
---|
255 | { GF2X x; RightShift(x, a, n); NTL_OPT_RETURN(GF2X, x); } |
---|
256 | |
---|
257 | |
---|
258 | #ifndef NTL_TRANSITION |
---|
259 | |
---|
260 | inline GF2X operator>>(const GF2X& a, long n) |
---|
261 | { GF2X x; RightShift(x, a, n); NTL_OPT_RETURN(GF2X, x); } |
---|
262 | |
---|
263 | inline GF2X operator<<(const GF2X& a, long n) |
---|
264 | { GF2X x; LeftShift(x, a, n); NTL_OPT_RETURN(GF2X, x); } |
---|
265 | |
---|
266 | inline GF2X& operator<<=(GF2X& x, long n) |
---|
267 | { LeftShift(x, x, n); return x; } |
---|
268 | |
---|
269 | inline GF2X& operator>>=(GF2X& x, long n) |
---|
270 | { RightShift(x, x, n); return x; } |
---|
271 | |
---|
272 | #endif |
---|
273 | |
---|
274 | |
---|
275 | |
---|
276 | void CopyReverse(GF2X& c, const GF2X& a, long hi); |
---|
277 | // c[0..hi] = reverse(a[0..hi]), with zero fill as necessary |
---|
278 | |
---|
279 | inline void reverse(GF2X& c, const GF2X& a, long hi) |
---|
280 | { CopyReverse(c, a, hi); } |
---|
281 | |
---|
282 | inline GF2X reverse(const GF2X& a, long hi) |
---|
283 | { GF2X x; reverse(x, a, hi); NTL_OPT_RETURN(GF2X, x); } |
---|
284 | |
---|
285 | inline void reverse(GF2X& c, const GF2X& a) |
---|
286 | { CopyReverse(c, a, deg(a)); } |
---|
287 | |
---|
288 | |
---|
289 | inline GF2X reverse(const GF2X& a) |
---|
290 | { GF2X x; reverse(x, a); NTL_OPT_RETURN(GF2X, x); } |
---|
291 | |
---|
292 | void InvTrunc(GF2X& c, const GF2X& a, long e); |
---|
293 | |
---|
294 | |
---|
295 | inline GF2X InvTrunc(const GF2X& a, long e) |
---|
296 | { GF2X x; InvTrunc(x, a, e); NTL_OPT_RETURN(GF2X, x); } |
---|
297 | |
---|
298 | |
---|
299 | class GF2XModulus { |
---|
300 | |
---|
301 | public: |
---|
302 | GF2XModulus(); |
---|
303 | ~GF2XModulus(); |
---|
304 | |
---|
305 | GF2XModulus(const GF2XModulus&); |
---|
306 | GF2XModulus& operator=(const GF2XModulus&); |
---|
307 | |
---|
308 | GF2XModulus(const GF2X& ff); |
---|
309 | |
---|
310 | GF2X f; // the modulus |
---|
311 | |
---|
312 | operator const GF2X& () const { return f; } |
---|
313 | const GF2X& val() const { return f; } |
---|
314 | |
---|
315 | long n; // deg(f) |
---|
316 | long sn; // f.xrep.length() |
---|
317 | long posn; // n - NTL_BITS_PER_LONG*(sn-1); |
---|
318 | |
---|
319 | long k3; // used for trinomials and pentanomials |
---|
320 | long k2; |
---|
321 | long k1; |
---|
322 | |
---|
323 | long size; // word length of residues |
---|
324 | |
---|
325 | long WordLength() const { return size; } |
---|
326 | |
---|
327 | _ntl_ulong msk; // mask of high bits of residues |
---|
328 | |
---|
329 | long method; |
---|
330 | |
---|
331 | vec_GF2X stab; |
---|
332 | _ntl_ulong **stab_ptr; |
---|
333 | long *stab_cnt; |
---|
334 | |
---|
335 | _ntl_ulong *stab1; |
---|
336 | |
---|
337 | GF2X h0, f0; |
---|
338 | |
---|
339 | vec_GF2 tracevec; |
---|
340 | |
---|
341 | }; |
---|
342 | |
---|
343 | |
---|
344 | inline long deg(const GF2XModulus& F) { return F.n; } |
---|
345 | |
---|
346 | |
---|
347 | void build(GF2XModulus& F, const GF2X& f); |
---|
348 | |
---|
349 | void rem(GF2X& r, const GF2X& a, const GF2XModulus& F); |
---|
350 | |
---|
351 | void DivRem(GF2X& q, GF2X& r, const GF2X& a, const GF2XModulus& F); |
---|
352 | |
---|
353 | void div(GF2X& q, const GF2X& a, const GF2XModulus& F); |
---|
354 | |
---|
355 | void PlainDivRem(GF2X& q, GF2X& r, const GF2X& a, const GF2X& b); |
---|
356 | void PlainDiv(GF2X& q, const GF2X& a, const GF2X& b); |
---|
357 | void PlainRem(GF2X& r, const GF2X& a, const GF2X& b); |
---|
358 | |
---|
359 | |
---|
360 | void MulMod(GF2X& c, const GF2X& a, const GF2X& b, const GF2XModulus& F); |
---|
361 | inline GF2X MulMod(const GF2X& a, const GF2X& b, const GF2XModulus& F) |
---|
362 | { GF2X x; MulMod(x, a, b, F); NTL_OPT_RETURN(GF2X, x); } |
---|
363 | |
---|
364 | void SqrMod(GF2X& c, const GF2X& a, const GF2XModulus& F); |
---|
365 | inline GF2X SqrMod(const GF2X& a, const GF2XModulus& F) |
---|
366 | { GF2X x; SqrMod(x, a, F); NTL_OPT_RETURN(GF2X, x); } |
---|
367 | |
---|
368 | void MulByXMod(GF2X& c, const GF2X& a, const GF2XModulus& F); |
---|
369 | inline GF2X MulByXMod(const GF2X& a, const GF2XModulus& F) |
---|
370 | { GF2X x; MulByXMod(x, a, F); NTL_OPT_RETURN(GF2X, x); } |
---|
371 | |
---|
372 | |
---|
373 | |
---|
374 | void MulMod(GF2X& c, const GF2X& a, const GF2X& b, const GF2X& f); |
---|
375 | inline GF2X MulMod(const GF2X& a, const GF2X& b, const GF2X& f) |
---|
376 | { GF2X x; MulMod(x, a, b, f); NTL_OPT_RETURN(GF2X, x); } |
---|
377 | |
---|
378 | void SqrMod(GF2X& c, const GF2X& a, const GF2X& f); |
---|
379 | inline GF2X SqrMod(const GF2X& a, const GF2X& f) |
---|
380 | { GF2X x; SqrMod(x, a, f); NTL_OPT_RETURN(GF2X, x); } |
---|
381 | |
---|
382 | void MulByXMod(GF2X& c, const GF2X& a, const GF2X& f); |
---|
383 | inline GF2X MulByXMod(const GF2X& a, const GF2X& f) |
---|
384 | { GF2X x; MulByXMod(x, a, f); NTL_OPT_RETURN(GF2X, x); } |
---|
385 | |
---|
386 | |
---|
387 | void InvMod(GF2X& c, const GF2X& a, const GF2X& f); |
---|
388 | inline GF2X InvMod(const GF2X& a, const GF2X& f) |
---|
389 | { GF2X x; InvMod(x, a, f); NTL_OPT_RETURN(GF2X, x); } |
---|
390 | |
---|
391 | long InvModStatus(GF2X& c, const GF2X& a, const GF2X& f); |
---|
392 | |
---|
393 | inline long InvModStatus(GF2X& c, const GF2X& a, const GF2XModulus& F) |
---|
394 | { return InvModStatus(c, a, F.f); } |
---|
395 | |
---|
396 | |
---|
397 | void PowerMod(GF2X& h, const GF2X& g, const ZZ& e, const GF2XModulus& F); |
---|
398 | inline void PowerMod(GF2X& x, const GF2X& g, long e, const GF2XModulus& F) |
---|
399 | { PowerMod(x, g, ZZ_expo(e), F); } |
---|
400 | |
---|
401 | void PowerXMod(GF2X& hh, const ZZ& e, const GF2XModulus& F); |
---|
402 | inline void PowerXMod(GF2X& x, long e, const GF2XModulus& F) |
---|
403 | { PowerXMod(x, ZZ_expo(e), F); } |
---|
404 | |
---|
405 | inline GF2X PowerMod(const GF2X& g, const ZZ& e, const GF2XModulus& F) |
---|
406 | { GF2X x; PowerMod(x, g, e, F); NTL_OPT_RETURN(GF2X, x); } |
---|
407 | |
---|
408 | inline GF2X PowerMod(const GF2X& g, long e, const GF2XModulus& F) |
---|
409 | { GF2X x; PowerMod(x, g, e, F); NTL_OPT_RETURN(GF2X, x); } |
---|
410 | |
---|
411 | inline GF2X PowerXMod(const ZZ& e, const GF2XModulus& F) |
---|
412 | { GF2X x; PowerXMod(x, e, F); NTL_OPT_RETURN(GF2X, x); } |
---|
413 | |
---|
414 | inline GF2X PowerXMod(long e, const GF2XModulus& F) |
---|
415 | { GF2X x; PowerXMod(x, e, F); NTL_OPT_RETURN(GF2X, x); } |
---|
416 | |
---|
417 | |
---|
418 | |
---|
419 | inline GF2X operator%(const GF2X& a, const GF2XModulus& F) |
---|
420 | { GF2X x; rem(x, a, F); NTL_OPT_RETURN(GF2X, x); } |
---|
421 | |
---|
422 | inline GF2X& operator%=(GF2X& x, const GF2XModulus& F) |
---|
423 | { rem(x, x, F); return x; } |
---|
424 | |
---|
425 | |
---|
426 | inline GF2X operator/(const GF2X& a, const GF2XModulus& F) |
---|
427 | { GF2X x; div(x, a, F); NTL_OPT_RETURN(GF2X, x); } |
---|
428 | |
---|
429 | inline GF2X& operator/=(GF2X& x, const GF2XModulus& F) |
---|
430 | { div(x, x, F); return x; } |
---|
431 | |
---|
432 | |
---|
433 | |
---|
434 | void DivRem(GF2X& q, GF2X& r, const GF2X& a, const GF2X& b); |
---|
435 | |
---|
436 | void div(GF2X& q, const GF2X& a, const GF2X& b); |
---|
437 | |
---|
438 | void div(GF2X& q, const GF2X& a, GF2 b); |
---|
439 | void div(GF2X& q, const GF2X& a, long b); |
---|
440 | |
---|
441 | void rem(GF2X& r, const GF2X& a, const GF2X& b); |
---|
442 | |
---|
443 | |
---|
444 | |
---|
445 | |
---|
446 | inline GF2X operator/(const GF2X& a, const GF2X& b) |
---|
447 | { GF2X x; div(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
448 | |
---|
449 | inline GF2X operator/(const GF2X& a, GF2 b) |
---|
450 | { GF2X x; div(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
451 | |
---|
452 | inline GF2X operator/(const GF2X& a, long b) |
---|
453 | { GF2X x; div(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
454 | |
---|
455 | inline GF2X& operator/=(GF2X& x, GF2 b) |
---|
456 | { div(x, x, b); return x; } |
---|
457 | |
---|
458 | inline GF2X& operator/=(GF2X& x, long b) |
---|
459 | { div(x, x, b); return x; } |
---|
460 | |
---|
461 | inline GF2X& operator/=(GF2X& x, const GF2X& b) |
---|
462 | { div(x, x, b); return x; } |
---|
463 | |
---|
464 | |
---|
465 | inline GF2X operator%(const GF2X& a, const GF2X& b) |
---|
466 | { GF2X x; rem(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
467 | |
---|
468 | inline GF2X& operator%=(GF2X& x, const GF2X& b) |
---|
469 | { rem(x, x, b); return x; } |
---|
470 | |
---|
471 | |
---|
472 | void GCD(GF2X& d, const GF2X& a, const GF2X& b); |
---|
473 | inline GF2X GCD(const GF2X& a, const GF2X& b) |
---|
474 | { GF2X x; GCD(x, a, b); NTL_OPT_RETURN(GF2X, x); } |
---|
475 | |
---|
476 | void OldGCD(GF2X& d, const GF2X& a, const GF2X& b); |
---|
477 | |
---|
478 | |
---|
479 | void XGCD(GF2X& d, GF2X& s, GF2X& t, const GF2X& a, const GF2X& b); |
---|
480 | |
---|
481 | void OldXGCD(GF2X& d, GF2X& s, GF2X& t, const GF2X& a, const GF2X& b); |
---|
482 | |
---|
483 | |
---|
484 | void diff(GF2X& c, const GF2X& a); |
---|
485 | inline GF2X diff(const GF2X& a) |
---|
486 | { GF2X x; diff(x, a); NTL_OPT_RETURN(GF2X, x); } |
---|
487 | |
---|
488 | void conv(GF2X& c, long a); |
---|
489 | void conv(GF2X& c, GF2 a); |
---|
490 | void conv(GF2X& x, const vec_GF2& a); |
---|
491 | inline void conv(GF2X& x, const ZZ& a) |
---|
492 | { conv(x, to_GF2(a)); } |
---|
493 | |
---|
494 | void conv(vec_GF2& x, const GF2X& a); |
---|
495 | |
---|
496 | inline GF2X to_GF2X(long a) |
---|
497 | { GF2X x; conv(x, a); NTL_OPT_RETURN(GF2X, x); } |
---|
498 | |
---|
499 | inline GF2X to_GF2X(GF2 a) |
---|
500 | { GF2X x; conv(x, a); NTL_OPT_RETURN(GF2X, x); } |
---|
501 | |
---|
502 | inline GF2X to_GF2X(const vec_GF2& a) |
---|
503 | { GF2X x; conv(x, a); NTL_OPT_RETURN(GF2X, x); } |
---|
504 | |
---|
505 | inline GF2X to_GF2X(const ZZ& a) |
---|
506 | { GF2X x; conv(x, a); NTL_OPT_RETURN(GF2X, x); } |
---|
507 | |
---|
508 | inline vec_GF2 to_vec_GF2(const GF2X& a) |
---|
509 | { vec_GF2 x; conv(x, a); NTL_OPT_RETURN(vec_GF2, x); } |
---|
510 | |
---|
511 | inline GF2X& GF2X::operator=(long a) |
---|
512 | { conv(*this, a); return *this; } |
---|
513 | |
---|
514 | inline GF2X& GF2X::operator=(GF2 a) |
---|
515 | { conv(*this, a); return *this; } |
---|
516 | |
---|
517 | void VectorCopy(vec_GF2& x, const GF2X& a, long n); |
---|
518 | |
---|
519 | inline vec_GF2 VectorCopy(const GF2X& a, long n) |
---|
520 | { vec_GF2 x; VectorCopy(x, a, n); NTL_OPT_RETURN(vec_GF2, x); } |
---|
521 | |
---|
522 | |
---|
523 | void MulTrunc(GF2X& c, const GF2X& a, const GF2X& b, long n); |
---|
524 | inline GF2X MulTrunc(const GF2X& a, const GF2X& b, long n) |
---|
525 | { GF2X x; MulTrunc(x, a, b, n); NTL_OPT_RETURN(GF2X, x); } |
---|
526 | |
---|
527 | void SqrTrunc(GF2X& c, const GF2X& a, long n); |
---|
528 | inline GF2X SqrTrunc(const GF2X& a, long n) |
---|
529 | { GF2X x; SqrTrunc(x, a, n); NTL_OPT_RETURN(GF2X, x); } |
---|
530 | |
---|
531 | long divide(GF2X& q, const GF2X& a, const GF2X& b); |
---|
532 | |
---|
533 | long divide(const GF2X& a, const GF2X& b); |
---|
534 | |
---|
535 | |
---|
536 | /*** modular composition routines and data structures ***/ |
---|
537 | |
---|
538 | struct GF2XArgument { |
---|
539 | vec_GF2X H; |
---|
540 | }; |
---|
541 | |
---|
542 | |
---|
543 | void CompMod(GF2X& x, const GF2X& g, |
---|
544 | const GF2XArgument& A, const GF2XModulus& F); |
---|
545 | |
---|
546 | inline GF2X CompMod(const GF2X& g, |
---|
547 | const GF2XArgument& A, const GF2XModulus& F) |
---|
548 | { GF2X x; CompMod(x, g, A, F); NTL_OPT_RETURN(GF2X, x); } |
---|
549 | |
---|
550 | void build(GF2XArgument& A, const GF2X& h, const GF2XModulus& F, long m); |
---|
551 | |
---|
552 | void CompMod(GF2X& x, const GF2X& g, const GF2X& h, const GF2XModulus& F); |
---|
553 | inline GF2X CompMod(const GF2X& g, const GF2X& h, const GF2XModulus& F) |
---|
554 | { GF2X x; CompMod(x, g, h, F); NTL_OPT_RETURN(GF2X, x); } |
---|
555 | |
---|
556 | void Comp2Mod(GF2X& x1, GF2X& x2, const GF2X& g1, const GF2X& g2, |
---|
557 | const GF2X& h, const GF2XModulus& F); |
---|
558 | |
---|
559 | void Comp3Mod(GF2X& x1, GF2X& x2, GF2X& x3, |
---|
560 | const GF2X& g1, const GF2X& g2, const GF2X& g3, |
---|
561 | const GF2X& h, const GF2XModulus& F); |
---|
562 | |
---|
563 | |
---|
564 | void MinPolySeq(GF2X& h, const vec_GF2& a, long m); |
---|
565 | inline GF2X MinPolySeq(const vec_GF2& a, long m) |
---|
566 | { GF2X x; MinPolySeq(x, a, m); NTL_OPT_RETURN(GF2X, x); } |
---|
567 | |
---|
568 | void ProbMinPolyMod(GF2X& hh, const GF2X& g, const GF2XModulus& F); |
---|
569 | inline GF2X ProbMinPolyMod(const GF2X& g, const GF2XModulus& F) |
---|
570 | { GF2X x; ProbMinPolyMod(x, g, F); NTL_OPT_RETURN(GF2X, x); } |
---|
571 | |
---|
572 | void ProbMinPolyMod(GF2X& hh, const GF2X& g, const GF2XModulus& F, long m); |
---|
573 | inline GF2X ProbMinPolyMod(const GF2X& g, const GF2XModulus& F, long m) |
---|
574 | { GF2X x; ProbMinPolyMod(x, g, F, m); NTL_OPT_RETURN(GF2X, x); } |
---|
575 | |
---|
576 | void MinPolyMod(GF2X& hh, const GF2X& g, const GF2XModulus& F); |
---|
577 | inline GF2X MinPolyMod(const GF2X& g, const GF2XModulus& F) |
---|
578 | { GF2X x; MinPolyMod(x, g, F); NTL_OPT_RETURN(GF2X, x); } |
---|
579 | |
---|
580 | void MinPolyMod(GF2X& hh, const GF2X& g, const GF2XModulus& F, long m); |
---|
581 | inline GF2X MinPolyMod(const GF2X& g, const GF2XModulus& F, long m) |
---|
582 | { GF2X x; MinPolyMod(x, g, F, m); NTL_OPT_RETURN(GF2X, x); } |
---|
583 | |
---|
584 | void IrredPolyMod(GF2X& h, const GF2X& g, const GF2XModulus& F); |
---|
585 | inline GF2X IrredPolyMod(const GF2X& g, const GF2XModulus& F) |
---|
586 | { GF2X x; IrredPolyMod(x, g, F); NTL_OPT_RETURN(GF2X, x); } |
---|
587 | |
---|
588 | void IrredPolyMod(GF2X& h, const GF2X& g, const GF2XModulus& F, long m); |
---|
589 | inline GF2X IrredPolyMod(const GF2X& g, const GF2XModulus& F, long m) |
---|
590 | { GF2X x; IrredPolyMod(x, g, F, m); NTL_OPT_RETURN(GF2X, x); } |
---|
591 | |
---|
592 | |
---|
593 | // undocumented stuff: |
---|
594 | |
---|
595 | void MinPolyInternal(GF2X& h, const GF2X& x, long m); |
---|
596 | |
---|
597 | void OldMinPolyInternal(GF2X& h, const GF2X& x, long m); |
---|
598 | |
---|
599 | |
---|
600 | |
---|
601 | struct GF2XTransMultiplier { |
---|
602 | GF2X f0, fbi, b; |
---|
603 | long shamt, shamt_fbi, shamt_b; |
---|
604 | }; |
---|
605 | |
---|
606 | void build(GF2XTransMultiplier& B, const GF2X& b, const GF2XModulus& F); |
---|
607 | |
---|
608 | void UpdateMap(vec_GF2& x, const vec_GF2& a, const GF2XTransMultiplier& B, |
---|
609 | const GF2XModulus& F); |
---|
610 | |
---|
611 | inline vec_GF2 UpdateMap(const vec_GF2& a, |
---|
612 | const GF2XTransMultiplier& B, const GF2XModulus& F) |
---|
613 | { vec_GF2 x; UpdateMap(x, a, B, F); NTL_OPT_RETURN(vec_GF2, x); } |
---|
614 | |
---|
615 | inline void project(GF2& x, const vec_GF2& a, const GF2X& b) |
---|
616 | { x = to_GF2(InnerProduct(a.rep, b.xrep)); } |
---|
617 | |
---|
618 | inline GF2 project(const vec_GF2& a, const GF2X& b) |
---|
619 | { return to_GF2(InnerProduct(a.rep, b.xrep)); } |
---|
620 | |
---|
621 | |
---|
622 | void ProjectPowers(vec_GF2& x, const vec_GF2& a, long k, |
---|
623 | const GF2XArgument& H, const GF2XModulus& F); |
---|
624 | |
---|
625 | inline vec_GF2 ProjectPowers(const vec_GF2& a, long k, |
---|
626 | const GF2XArgument& H, const GF2XModulus& F) |
---|
627 | { vec_GF2 x; ProjectPowers(x, a, k, H, F); |
---|
628 | NTL_OPT_RETURN(vec_GF2, x); } |
---|
629 | |
---|
630 | void ProjectPowers(vec_GF2& x, const vec_GF2& a, long k, const GF2X& h, |
---|
631 | const GF2XModulus& F); |
---|
632 | |
---|
633 | inline vec_GF2 ProjectPowers(const vec_GF2& a, long k, |
---|
634 | const GF2X& H, const GF2XModulus& F) |
---|
635 | { vec_GF2 x; ProjectPowers(x, a, k, H, F); |
---|
636 | NTL_OPT_RETURN(vec_GF2, x); } |
---|
637 | |
---|
638 | void TraceVec(vec_GF2& S, const GF2X& f); |
---|
639 | |
---|
640 | inline vec_GF2 TraceVec(const GF2X& f) |
---|
641 | { vec_GF2 x; TraceVec(x, f); NTL_OPT_RETURN(vec_GF2, x); } |
---|
642 | |
---|
643 | |
---|
644 | void TraceMod(GF2& x, const GF2X& a, const GF2XModulus& F); |
---|
645 | |
---|
646 | inline GF2 TraceMod(const GF2X& a, const GF2XModulus& F) |
---|
647 | { GF2 x; TraceMod(x, a, F); return x; } |
---|
648 | |
---|
649 | void TraceMod(GF2& x, const GF2X& a, const GF2X& f); |
---|
650 | |
---|
651 | inline GF2 TraceMod(const GF2X& a, const GF2X& f) |
---|
652 | { GF2 x; TraceMod(x, a, f); return x; } |
---|
653 | |
---|
654 | |
---|
655 | |
---|
656 | void GF2XFromBytes(GF2X& x, const unsigned char *p, long n); |
---|
657 | inline GF2X GF2XFromBytes(const unsigned char *p, long n) |
---|
658 | { GF2X x; GF2XFromBytes(x, p, n); NTL_OPT_RETURN(GF2X, x); } |
---|
659 | |
---|
660 | void BytesFromGF2X(unsigned char *p, const GF2X& a, long n); |
---|
661 | |
---|
662 | inline long NumBits(const GF2X& a) |
---|
663 | { return deg(a) + 1; } |
---|
664 | |
---|
665 | inline long NumBytes(const GF2X& a) |
---|
666 | { return (NumBits(a) + 7)/8; } |
---|
667 | |
---|
668 | |
---|
669 | NTL_CLOSE_NNS |
---|
670 | |
---|
671 | #endif |
---|