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
|
#include <NTL/GF2XFactoring.h>
#include <NTL/GF2EXFactoring.h>
NTL_OPEN_NNS
void PlainMul(GF2EX&, const GF2EX&, const GF2EX&);
NTL_CLOSE_NNS
NTL_CLIENT
int main()
{
GF2X p;
BuildIrred(p, 200);
GF2E::init(p);
GF2EX f;
SetCoeff(f, 41);
SetCoeff(f, 1);
SetCoeff(f, 0);
GF2X a;
SetCoeff(a, 117);
SetCoeff(a, 10);
SetCoeff(a, 0);
GF2EX g, h;
SetX(g);
SetCoeff(g, 0, to_GF2E(a));
MinPolyMod(h, g, f);
f = h;
vec_pair_GF2EX_long u;
CanZass(u, f, 1);
cerr << "factorization pattern:";
long i;
for (i = 0; i < u.length(); i++) {
cerr << " ";
long k = u[i].b;
if (k > 1)
cerr << k << "*";
cerr << deg(u[i].a);
}
cerr << "\n\n\n";
GF2EX ff;
mul(ff, u);
if (f != ff || u.length() != 11) {
cerr << "GF2EXTest NOT OK\n";
return 1;
}
{
cerr << "multiplication test...\n";
BuildIrred(p, 512);
GF2E::init(p);
GF2EX A, B, C, C1;
random(A, 512);
random(B, 512);
double t;
long i;
t = GetTime();
for (i = 0; i < 10; i++) PlainMul(C, A, B);
t = GetTime() - t;
cerr << "time for plain mul of degree 511 over GF(2^512): " << (t/10) << "s\n";
t = GetTime();
for (i = 0; i < 10; i++) mul(C1, A, B);
t = GetTime() - t;
cerr << "time for karatsuba mul of degree 511 over GF(2^512): " << (t/10) << "s\n";
if (C != C1) {
cerr << "GF2EXTest NOT OK\n";
return 1;
}
}
{
cerr << "multiplication test...\n";
BuildIrred(p, 16);
GF2E::init(p);
GF2EX A, B, C, C1;
random(A, 512);
random(B, 512);
double t;
t = GetTime();
for (i = 0; i < 10; i++) PlainMul(C, A, B);
t = GetTime() - t;
cerr << "time for plain mul of degree 511 over GF(2^16): " << (t/10) << "s\n";
t = GetTime();
for (i = 0; i < 10; i++) mul(C1, A, B);
t = GetTime() - t;
cerr << "time for karatsuba mul of degree 511 over GF(2^16): " << (t/10) << "s\n";
if (C != C1) {
cerr << "GF2EXTest NOT OK\n";
return 1;
}
}
cerr << "GF2EXTest OK\n";
return 0;
}
|