예제 #1
0
파일: GF.cpp 프로젝트: ChristineJost/M2
void GF::internal_add_to(ring_elem &f, ring_elem &g) const
{
  if (g == _ZERO) return;
  if (f == _ZERO)
    f = g;
  else
    {
      int a = f.int_val;
      int b = g.int_val;
      int n = a-b;
      if (n > 0)
        {
          if (n == _MINUS_ONE)
            f = _ZERO;
          else
            f = modulus_add(b, _one_table[n], Q1_);
        }
      else if (n < 0)
        {
          if (-n == _MINUS_ONE)
            f = _ZERO;
          else
            f = modulus_add(a, _one_table[-n], Q1_);
        }
      else
        {
          if (P == 2)
            f = _ZERO;
          else
            f = modulus_add(a, _one_table[_ONE], Q1_);
        }
    }
}
예제 #2
0
 void add(elem &result, elem a, elem b) const
 {
   if (a == 0) result = b;
   else if (b == 0) result = a;
   else 
     {
       int n=a-b;
       if (n > 0)
         {
           if (n == mGF.minusOne())
             result = 0;
           else
             result = modulus_add(b, mGF.oneTable(n), mGF.orderMinusOne());
         }
       else if (n < 0)
         {
           if (-n == mGF.minusOne())
             result = 0;
           else
             result = modulus_add(a, mGF.oneTable(-n), mGF.orderMinusOne());
         }
       else
         {
           if (mGF.characteristic() == 2)
             result = 0;
           else
             result = modulus_add(a, mGF.oneTable(mGF.one()), mGF.orderMinusOne());
         }
     }
 }
예제 #3
0
파일: GF.cpp 프로젝트: ChristineJost/M2
void GF::internal_subtract_to(ring_elem &f, ring_elem &g) const
{
  if (g == _ZERO) return;
  if (f.int_val == g.int_val) { f = _ZERO; return; }
  ring_elem g1 = modulus_add(g, _MINUS_ONE, Q1_);  // f = -g
  internal_add_to(f, g1);
}
예제 #4
0
 void mult(elem &result, elem a, elem b) const
 {
   if (a == zero || b == zero)
     result = zero;
   else
     result = modulus_add(a,b,p1);
 }
예제 #5
0
 void mult(elem &result, elem a, elem b) const
 {
   if (a == 0 || b == 0)
     result = 0;
   else
     result = modulus_add(a,b,p1);
 }
예제 #6
0
 void subtract(elem &result, elem a, elem b) const
 {
   result = a;
   if (b == 0) return;
   elem c = modulus_add(b, mGF.minusOne(), mGF.orderMinusOne()); // c = -b
   add(result,a,c);
 }
예제 #7
0
 void negate(elem &result, elem a) const
 {
   if (a != 0)
     result = modulus_add(a, mGF.minusOne(), mGF.orderMinusOne());
   else
     result = 0;
 }
예제 #8
0
파일: ZZp.cpp 프로젝트: AlessandroOneto/M2
ring_elem Z_mod::add(const ring_elem f, const ring_elem g) const
{
  if (g == _ZERO)  return f;
  if (f == _ZERO)  return g;

  int n = modulus_add(_exp_table[f.int_val], _exp_table[g.int_val], P);
  return _log_table[n];
}
예제 #9
0
 void subtract(elem &result, elem a, elem b) const
 {
   if (b == zero) result = a;
   else if (a == zero) result = modulus_add(b, minus_one, p1);
   else
     {
       int n = modulus_sub(exp_table[a], exp_table[b], p);
       result = log_table[n];
     }
 }
예제 #10
0
 void add(elem &result, elem a, elem b) const
 {
   if (a == zero) result = b;
   else if (b == zero) result = a;
   else
     {
       int n = modulus_add(exp_table[a], exp_table[b], p);
       result = log_table[n];
     }
 }
예제 #11
0
파일: ZZp.cpp 프로젝트: AlessandroOneto/M2
void Z_mod::internal_add_to(ring_elem &f, ring_elem &g) const
{
  if (g == _ZERO) return;
  if (f == _ZERO)
    f = g;
  else
    {
      int n = modulus_add(_exp_table[f.int_val], _exp_table[g.int_val], P);
      f = _log_table[n];
    }
}
예제 #12
0
 void subtract_multiple(elem &result, elem a, elem b) const
 {
   // we assume: a, b are NONZERO!!
   // result -= a*b
   elem ab = modulus_add(a,b,p1);
   subtract(result, result, ab);
   return;
   // if (result==zero)
   //   result = ab;
   // else
   //   {
   //  int n = modulus_sub(exp_table[result], exp_table[ab], p);
   //  result = log_table[n];
   //   }
 }
예제 #13
0
파일: GF.cpp 프로젝트: ChristineJost/M2
ring_elem GF::mult(const ring_elem f, const ring_elem g) const
{
  if (f == _ZERO || g == _ZERO) return _ZERO;
  return modulus_add(f, g, Q1_);
}
예제 #14
0
파일: GF.cpp 프로젝트: ChristineJost/M2
void GF::internal_negate_to(ring_elem &f) const
{
  if (f.get_int() != _ZERO)
    f = modulus_add(f.get_int(), _MINUS_ONE, Q1_);
}
예제 #15
0
파일: ZZp.cpp 프로젝트: AlessandroOneto/M2
ring_elem Z_mod::mult(const ring_elem f, const ring_elem g) const
{
  if (f == _ZERO || g == _ZERO) return _ZERO;
  return modulus_add(f, g, _P1);
}
예제 #16
0
파일: ZZp.cpp 프로젝트: AlessandroOneto/M2
void Z_mod::internal_negate_to(ring_elem &f) const
{
  if (f != _ZERO)
    f = modulus_add(f, _minus_one, _P1);
}