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

◆ initialize_GF()

bool GF::initialize_GF ( const RingElement * prim)
protected

Definition at line 39 of file GF.cpp.

40{
41 // set the GF ring tables. Returns false if there is an error.
42 _primitive_element = prim;
44 initialize_ring(_originalR->characteristic(),
46
48
49 int i, j;
50
51 if (_originalR->n_quotients() != 1)
52 {
53 throw exc::engine_error(
54 "rawGaloisField expected an element of a quotient ring of the form "
55 "ZZ/p[x]/(f)");
56 }
57 ring_elem f = _originalR->quotient_element(0);
58 Nterm *t = f;
59 int n = _originalR->getMonoid()->primary_degree(t->monom);
60
61 Q_ = static_cast<int>(characteristic());
62 for (i = 1; i < n; i++) Q_ *= static_cast<int>(characteristic());
63
64 Qexp_ = n;
65 Q1_ = Q_ - 1;
66 _ZERO = 0;
67 _ONE = Q1_;
68 _MINUS_ONE = (characteristic() == 2 ? _ONE : Q1_ / 2);
69
70 // Get ready to create the 'one_table'
71 VECTOR(ring_elem) polys;
72 polys.push_back(_originalR->from_long(0));
73 ring_elem primelem = prim->get_value();
74 polys.push_back(_originalR->copy(primelem));
75
76 ring_elem oneR = _originalR->one();
77
78 _x_exponent = -1;
79 ring_elem x = _originalR->var(0);
80 if (_originalR->is_equal(primelem, x)) _x_exponent = 1;
81 for (i = 2; i < Q_; i++)
82 {
83 ring_elem g = _originalR->mult(polys[i - 1], primelem);
84 polys.push_back(g);
85 if (_originalR->is_equal(g, oneR)) break;
86 if (_originalR->is_equal(g, x)) _x_exponent = i;
87 }
88
89 if (polys.size() != Q_)
90 {
91 throw exc::engine_error("GF: primitive element expected");
92 }
93
94 assert(_x_exponent >= 0);
95
96 // Set 'one_table'.
98 _one_table[0] = Q_ - 1;
99 for (i = 1; i <= Q_ - 1; i++)
100 {
101 if (system_interrupted()) return false;
102 ring_elem f1 = _originalR->add(polys[i], oneR);
103 for (j = 1; j <= Q_ - 1; j++)
104 if (_originalR->is_equal(f1, polys[j])) break;
105 _one_table[i] = j;
106 }
107
108 // Create the Z/P ---> GF(Q) inclusion map
110 int a = _ONE;
112 for (i = 1; i < characteristic(); i++)
113 {
114 _from_int_table[i] = a;
115 a = _one_table[a];
116 }
117
118 zeroV = from_long(0);
119 oneV = from_long(1);
120 minus_oneV = from_long(-1);
121
122 return true;
123}
int _x_exponent
Definition GF.hpp:67
int * _one_table
Definition GF.hpp:76
const RingElement * _primitive_element
Definition GF.hpp:66
int _MINUS_ONE
Definition GF.hpp:74
int * _from_int_table
Definition GF.hpp:77
int Q_
Definition GF.hpp:69
int Qexp_
Definition GF.hpp:70
int Q1_
Definition GF.hpp:71
const PolynomialRing * _originalR
Definition GF.hpp:64
virtual ring_elem from_long(long n) const
Definition GF.cpp:208
int _ONE
Definition GF.hpp:73
int _ZERO
Definition GF.hpp:72
static const PolyRing * get_trivial_poly_ring()
Definition poly.cpp:35
ring_elem minus_oneV
Definition ring.hpp:131
void initialize_ring(long charac, const PolynomialRing *DR=nullptr, const std::vector< int > &heft_vec={})
Definition ring.cpp:30
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
long characteristic() const
Definition ring.hpp:159
ring_elem oneV
Definition ring.hpp:130
bool declare_field()
Definition ring.cpp:69
ring_elem zeroV
Definition ring.hpp:129
ring_elem get_value() const
Definition relem.hpp:79
const Ring * get_ring() const
Definition relem.hpp:81
bool system_interrupted()
#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 _from_int_table, _MINUS_ONE, _ONE, _one_table, _originalR, _primitive_element, _x_exponent, _ZERO, Ring::cast_to_PolynomialRing(), Ring::characteristic(), Ring::declare_field(), from_long(), RingElement::get_ring(), PolyRing::get_trivial_poly_ring(), RingElement::get_value(), Ring::initialize_ring(), Ring::minus_oneV, Nterm::monom, newarray_atomic, Ring::oneV, Q1_, Q_, Qexp_, system_interrupted(), VECTOR, x, and Ring::zeroV.