source: git/ntl/include/NTL/GF2X.h @ 26e030

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