bool FractionField::initialize_frac(const PolyRingFlat *R) { initialize_ring(R->charac(), R->get_degree_ring(), R->get_heft_vector()); R_ = R; _MINUS_ONE = R->from_int(-1); zeroV = from_int(0); oneV = from_int(1); minus_oneV = from_int(-1); if (R->n_quotients() > 0 || R->getCoefficients()->cast_to_FractionField() // disallowed in x-relem.cpp || R->getMonoid()->getNonTermOrderVariables()->len > 0) // disallowed in x-relem.cpp use_gcd_simplify = false; else use_gcd_simplify = true; #ifdef DEVELOPMENT #warning "frac simplify: doesn't handle towers of fracs" #endif declare_field(); return true; }
bool QQ::initialize_QQ() { initialize_ring(0); _elem_size = sizeof(mpq_t); _zero_elem = new_elem();// this sets the element to 0. #if 0 // trans_one = globalZZ->from_int(1); #endif declare_field(); zeroV = from_int(0); oneV = from_int(1); minus_oneV = from_int(-1); return true; }
bool Z_mod::initialize_Z_mod(int p) { initialize_ring(p); P = p; declare_field(); int i,j,q,n; if (P==2) _minus_one = 0; else _minus_one = (P-1)/2; if (P==2) _prim_root = 1; else { j=1; for (i=2; (i<P && j<P-1); i++) for (q=i,j=1; (q!=1 && j<P); q=(q*i)%P,j++); _prim_root = i-1; } // cerr << "z_mod_p: creating table for P = " << P << endl; _log_table = newarray_atomic(int,P); _exp_table = newarray_atomic(int,P); for (i=0, n=1; i<P-1; i++, n=(n*_prim_root)%P) { _log_table[n] = i; // i = log_(base _prim_root)(n) _exp_table[i] = n; // n = (_prim_root)^i } _ZERO = P-1; _exp_table[_ZERO] = 0; _log_table[0] = _ZERO; _P1 = P-1; zeroV = from_long(0); oneV = from_long(1); minus_oneV = from_long(-1); coeffR = new CoefficientRingZZp(P,_log_table, _exp_table); aringZZp = new M2::ARingZZp(P); // WARNING: this uses that the primitive element is the SAME as computed above!! // Remove this warning once Z_mod is not in existence any longer. return true; }
bool GF::initialize_GF(const RingElement *prim) { // set the GF ring tables. Returns false if there is an error. _primitive_element = prim; _originalR = prim->get_ring()->cast_to_PolynomialRing(); initialize_ring(_originalR->charac(), PolyRing::get_trivial_poly_ring()); declare_field(); int i,j; if (_originalR->n_quotients() != 1) { ERROR("rawGaloisField expected an element of a quotient ring of the form ZZ/p[x]/(f)"); return false; } ring_elem f = _originalR->quotient_element(0); Nterm *t = f; int n = _originalR->getMonoid()->primary_degree(t->monom); Q_ = P; for (i=1; i<n; i++) Q_ *= P; Qexp_ = n; Q1_ = Q_-1; _ZERO = 0; _ONE = Q1_; _MINUS_ONE = (P == 2 ? _ONE : Q1_/2); // Get ready to create the 'one_table' array<ring_elem> polys; polys.append(_originalR->from_int(0)); ring_elem primelem = prim->get_value(); polys.append(_originalR->copy(primelem)); ring_elem oneR = _originalR->one(); _x_exponent = -1; ring_elem x = _originalR->var(0); if (_originalR->is_equal(primelem, x)) _x_exponent = 1; for (i=2; i<Q_; i++) { ring_elem g = _originalR->mult(polys[i-1], primelem); polys.append(g); if (_originalR->is_equal(g, oneR)) break; if (_originalR->is_equal(g, x)) _x_exponent = i; } if (polys.length() != Q_) { ERROR("GF: primitive element expected"); return false; } assert(_x_exponent >= 0); // Set 'one_table'. _one_table = newarray_atomic(int,Q_); _one_table[0] = Q_-1; for (i=1; i<=Q_-1; i++) { if (system_interrupted()) return false; ring_elem f1 = _originalR->add(polys[i], oneR); for (j=1; j<=Q_-1; j++) if (_originalR->is_equal(f1, polys[j])) break; _one_table[i] = j; } // Create the Z/P ---> GF(Q) inclusion map _from_int_table = newarray_atomic(int,P); int a = _ONE; _from_int_table[0] = _ZERO; for (i=1; i<P; i++) { _from_int_table[i] = a; a = _one_table[a]; } zeroV = from_int(0); oneV = from_int(1); minus_oneV = from_int(-1); // M2::GaloisFieldTable G(*_originalR, primelem); // G.display(std::cout); return true; }