38 Array<Array<int> > GF::alphapow;
39 Array<Array<int> > GF::logalpha;
40 ivec GF::q =
"1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536";
45 m =
static_cast<char>(
round_i(::
log2(static_cast<double>(qvalue))));
46 it_assert((1 << m) == qvalue,
"GF::setsize : q is not a power of 2");
47 it_assert((m > 0) && (m <= 16),
"GF::setsize : q must be positive and "
48 "less than or equal to 2^16");
54 const int reducetable[] = {3, 3, 3, 5, 3, 9, 29, 17, 9, 5, 83, 27, 43, 3, 4107};
56 if (alphapow.
size() < (m + 1)) {
61 if (alphapow(m).
size() == 0) {
72 reduce = reducetable[m-2];
74 for (n = 1; n < (1 << m) - 1; n++) {
75 temp = alphapow(m)(n - 1);
78 alphapow(m)(n) = (temp & ~(1 << m)) ^ reduce;
80 alphapow(m)(n) = temp;
86 for (n = 0;n < (1 << m) - 1;n++)
87 logalpha(m)(alphapow(m)(n)) = n;
98 os <<
"alpha^" << ingf.value;
106 for (
int i = 0; i < ingfx.degree + 1; i++) {
107 if (ingfx.coeffs(i) !=
GF(ingfx.q, -1)) {
108 if (terms != 0) os <<
" + ";
110 if (ingfx.coeffs(i) ==
GF(ingfx.q, 0)) {
114 os << ingfx.coeffs(i) <<
"*x^" << i;
118 if (terms == 0) os <<
"0";
131 int degreedif = tempdegree - gdegree;
132 if (degreedif < 0)
return GFX(q, 0);
133 GFX m(q, degreedif), divisor(q);
136 m[degreedif] = temp[tempdegree] / g[gdegree];
139 divisor[degreedif] = m[degreedif];
142 degreedif = tempdegree - gdegree;
158 if (degreedif < 0)
return temp;
159 GFX m(q, degreedif), divisor(q);
162 m[degreedif] = temp[tempdegree] / b[bdegree];
165 divisor[degreedif] = m[degreedif];