Macaulay2 Engine
Loading...
Searching...
No Matches

◆ GaloisFieldTable()

M2::GaloisFieldTable::GaloisFieldTable ( const PolynomialRing & R,
const ring_elem prim )

R should be the ring of the element prim. preferably, prim is the generator of R, but it is allowed to be something else as well.

Definition at line 18 of file aring-m2-gf.cpp.

20 : mCharac(static_cast<int>(R.characteristic())),
23{
24 assert(mOriginalRing.n_quotients() == 1);
25
27 ring_elem f = mOriginalRing.quotient_element(0);
28 Nterm *t = f;
29 mDimension = mOriginalRing.getMonoid()->primary_degree(t->monom);
31 for (int i = 1; i < mDimension; i++) mOrder *= mCharac;
32 mOne = mOrder - 1; // representation for the number 1: p^n - 1.
33 mOrderMinusOne = mOne; // p^n - 1
34 mMinusOne = (mCharac == 2 ? mOne : mOne / 2);
35
36 // Get ready to create mOneTable.
37 VECTOR(ring_elem) polys;
38 polys.push_back(mOriginalRing.from_long(0));
39 polys.push_back(mOriginalRing.copy(mPrimitiveElement));
40
41 ring_elem oneR = mOriginalRing.from_long(1);
42
43 mGeneratorExponent = static_cast<GFElement>(-1);
44 ring_elem x = mOriginalRing.var(0);
46 for (GFElement i = 2; i <= mOne; i++)
47 {
48 ring_elem g = mOriginalRing.mult(polys[i - 1], mPrimitiveElement);
49 polys.push_back(g);
50 if (mOriginalRing.is_equal(g, oneR)) break;
51 if (mOriginalRing.is_equal(g, x)) mGeneratorExponent = i;
52 }
53
54#if 0
55 for (size_t i = 0; i < polys.size(); i++)
56 {
57 std::cerr << i << " ";
58 dringelem(&R, polys[i]);
59 std::cerr << "\n";
60 }
61#endif
62 assert(polys.size() == mOrder);
63 assert(mGeneratorExponent != static_cast<GFElement>(-1));
64
65 // Set 'one_table'.
68
69 for (GFElement i = 1; i <= mOrderMinusOne; i++)
70 {
72 {
73 // first clean up?
74 return;
75 }
76 ring_elem f1 = mOriginalRing.add(polys[i], oneR);
77 GFElement j;
78 for (j = 0; j <= mOrderMinusOne; j++)
79 if (mOriginalRing.is_equal(f1, polys[j])) break;
80 if (j > mOrderMinusOne)
81 {
82 std::cout << "oops: didn't find element " << i << " !!" << std::endl;
83 }
84 mOneTable[i] = j;
85 }
86
87 // Create the ZZ/P ---> GF(Q) inclusion map
89 GFElement a = mOne;
90 ;
91 mFromIntTable[0] = 0;
92 for (GFElement i = 1; i < mCharac; i++)
93 {
94 mFromIntTable[i] = a;
95 a = mOneTable[a];
96 }
97}
void dringelem(const Ring *R, const ring_elem f)
Definition debug.cpp:73
const ring_elem mPrimitiveElement
GFElement * mFromIntTable
const RingElement * mGenerator
const PolynomialRing & mOriginalRing
long characteristic() const
Definition ring.hpp:159
virtual ring_elem copy(const ring_elem f) const =0
static RingElement * make_raw(const Ring *R, ring_elem f)
Definition relem.cpp:20
bool system_interrupted()
int GFElement
#define VECTOR(T)
Definition newdelete.hpp:78
#define newarray_atomic(T, len)
Definition newdelete.hpp:91
volatile int x
int monom[1]
Definition ringelem.hpp:160

References characteristic(), Ring::copy(), dringelem(), RingElement::make_raw(), mCharac, mDimension, mFromIntTable, mGenerator, mGeneratorExponent, mMinusOne, mOne, mOneTable, Nterm::monom, mOrder, mOrderMinusOne, mOriginalRing, mPrimitiveElement, newarray_atomic, system_interrupted(), VECTOR, and x.