Changeset ef1632 in git


Ignore:
Timestamp:
Apr 3, 2018, 3:01:22 PM (5 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', '8e0ad00ce244dfd0756200662572aef8402f13d5')
Children:
f67afed8d454f54035cff586aa3cf35a06a7280e
Parents:
414cce519189e70ffda5ff4b972038335e5df374
Message:
fix: arith in Z/2^m
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpolys/coeffs/rmodulo2m.cc

    r414cce5 ref1632  
    2525#ifdef HAVE_RINGS
    2626
     27#ifdef LDEBUG
     28BOOLEAN nr2mDBTest(number a, const char *f, const int l, const coeffs r)
     29{
     30  if (((long)a<0L) || ((long)a>(long)r->mod2mMask))
     31  {
     32    Print("wrong mod 2^n number %ld at %s,%d\n",(long)a,f,l);
     33    return FALSE;
     34  }
     35  return TRUE;
     36}
     37#endif
     38
     39
    2740static inline number nr2mMultM(number a, number b, const coeffs r)
    2841{
    2942  return (number)
    30     ((((unsigned long) a) * ((unsigned long) b)) & ((unsigned long)r->mod2mMask));
     43    ((((unsigned long) a) * ((unsigned long) b)) & r->mod2mMask);
    3144}
    3245
     
    3447{
    3548  return (number)
    36     ((((unsigned long) a) + ((unsigned long) b)) & ((unsigned long)r->mod2mMask));
     49    ((((unsigned long) a) + ((unsigned long) b)) & r->mod2mMask);
    3750}
    3851
     
    4053{
    4154  return (number)((unsigned long)a < (unsigned long)b ?
    42                        r->mod2mMask - (unsigned long)b + (unsigned long)a + 1:
     55                       r->mod2mMask+1 - (unsigned long)b + (unsigned long)a:
    4356                       (unsigned long)a - (unsigned long)b);
    4457}
    4558
    46 #define nr2mNegM(A,r) (number)((r->mod2mMask - (unsigned long)(A) + 1) & r->mod2mMask)
     59#define nr2mNegM(A,r) (number)((r->mod2mMask+1 - (unsigned long)(A)) & r->mod2mMask)
    4760#define nr2mEqualM(A,B)  ((A)==(B))
    4861
     
    8295static coeffs nr2mQuot1(number c, const coeffs r)
    8396{
    84     coeffs rr;
    85     long ch = r->cfInt(c, r);
    86     mpz_t a,b;
    87     mpz_init_set(a, r->modNumber);
    88     mpz_init_set_ui(b, ch);
    89     mpz_ptr gcd;
    90     gcd = (mpz_ptr) omAlloc(sizeof(mpz_t));
    91     mpz_init(gcd);
    92     mpz_gcd(gcd, a,b);
    93     if(mpz_cmp_ui(gcd, 1) == 0)
    94         {
    95             WerrorS("constant in q-ideal is coprime to modulus in ground ring");
    96             WerrorS("Unable to create qring!");
    97             return NULL;
    98         }
    99     if(mpz_cmp_ui(gcd, 2) == 0)
     97  coeffs rr;
     98  long ch = r->cfInt(c, r);
     99  mpz_t a,b;
     100  mpz_init_set(a, r->modNumber);
     101  mpz_init_set_ui(b, ch);
     102  mpz_ptr gcd;
     103  gcd = (mpz_ptr) omAlloc(sizeof(mpz_t));
     104  mpz_init(gcd);
     105  mpz_gcd(gcd, a,b);
     106  if(mpz_cmp_ui(gcd, 1) == 0)
     107  {
     108    WerrorS("constant in q-ideal is coprime to modulus in ground ring");
     109    WerrorS("Unable to create qring!");
     110    return NULL;
     111  }
     112  if(mpz_cmp_ui(gcd, 2) == 0)
     113  {
     114    rr = nInitChar(n_Zp, (void*)2);
     115  }
     116  else
     117  {
     118    int kNew = 1;
     119    mpz_t baseTokNew;
     120    mpz_init(baseTokNew);
     121    mpz_set(baseTokNew, r->modBase);
     122    while(mpz_cmp(gcd, baseTokNew) > 0)
    100123    {
    101         rr = nInitChar(n_Zp, (void*)2);
     124      kNew++;
     125      mpz_mul(baseTokNew, baseTokNew, r->modBase);
    102126    }
    103     else
    104     {
    105         int kNew = 1;
    106         mpz_t baseTokNew;
    107         mpz_init(baseTokNew);
    108         mpz_set(baseTokNew, r->modBase);
    109         while(mpz_cmp(gcd, baseTokNew) > 0)
    110         {
    111           kNew++;
    112           mpz_mul(baseTokNew, baseTokNew, r->modBase);
    113         }
    114         mpz_clear(baseTokNew);
    115         rr = nInitChar(n_Z2m, (void*)(long)kNew);
    116     }
    117     return(rr);
     127    mpz_clear(baseTokNew);
     128    rr = nInitChar(n_Z2m, (void*)(long)kNew);
     129  }
     130  return(rr);
    118131}
    119132
     
    131144static number nr2mMult(number a, number b, const coeffs r)
    132145{
     146  number n;
    133147  if (((unsigned long)a == 0) || ((unsigned long)b == 0))
    134148    return (number)0;
    135149  else
    136     return nr2mMultM(a, b, r);
     150    n=nr2mMultM(a, b, r);
     151  n_Test(n,r);
     152  return n;
    137153}
    138154
     
    340356static long nr2mInt(number &n, const coeffs r)
    341357{
    342   unsigned long nn = (unsigned long)(unsigned long)n & r->mod2mMask;
     358  unsigned long nn = (unsigned long)n;
    343359  unsigned long l = r->mod2mMask >> 1; l++; /* now: l = 2^(m-1) */
    344360  if ((unsigned long)nn > l)
     
    350366static number nr2mAdd(number a, number b, const coeffs r)
    351367{
    352   return nr2mAddM(a, b, r);
     368  number n=nr2mAddM(a, b, r);
     369  n_Test(n,r);
     370  return n;
    353371}
    354372
    355373static number nr2mSub(number a, number b, const coeffs r)
    356374{
    357   return nr2mSubM(a, b, r);
     375  number n=nr2mSubM(a, b, r);
     376  n_Test(n,r);
     377  return n;
    358378}
    359379
     
    411431    }
    412432  }
    413   return (number)nr2mMult(a, nr2mInversM(b,r),r);
     433  number n=(number)nr2mMult(a, nr2mInversM(b,r),r);
     434  n_Test(n,r);
     435  return n;
    414436}
    415437
     
    578600{
    579601  if ((unsigned long)c == 0) return c;
    580   return nr2mNegM(c, r);
     602  number n=nr2mNegM(c, r);
     603  n_Test(n,r);
     604  return n;
    581605}
    582606
    583607static number nr2mMapMachineInt(number from, const coeffs /*src*/, const coeffs dst)
    584608{
    585   unsigned long i = ((unsigned long)from) % dst->mod2mMask ;
     609  unsigned long i = ((unsigned long)from) % (dst->mod2mMask + 1) ;
    586610  return (number)i;
    587611}
     
    711735    WarnS("nr2mInitExp unexpectedly called with m = 1 (we continue with Z/2^2");
    712736}
    713 
    714 #ifdef LDEBUG
    715 static BOOLEAN nr2mDBTest (number a, const char *, const int, const coeffs r)
    716 {
    717   //if ((unsigned long)a < 0) return FALSE; // is unsigned!
    718   if (((unsigned long)a & r->mod2mMask) != (unsigned long)a) return FALSE;
    719   return TRUE;
    720 }
    721 #endif
    722737
    723738static void nr2mWrite (number a, const coeffs r)
Note: See TracChangeset for help on using the changeset viewer.