Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}