Changeset 0461f0 in git for libpolys/coeffs/modulop.cc


Ignore:
Timestamp:
Jul 21, 2011, 10:00:44 PM (13 years ago)
Author:
Oleksandr Motsak <motsak@…>
Branches:
(u'spielwiese', '17f1d200f27c5bd38f5dfc6e8a0879242279d1d8')
Children:
bc1fdba5e0c00a808f45922f0d0fe8c4ec086e88
Parents:
a778e6518804aecf7bb83784c8936b0868f52943
git-author:
Oleksandr Motsak <motsak@mathematik.uni-kl.de>2011-07-21 22:00:44+02:00
git-committer:
Mohamed Barakat <mohamed.barakat@rwth-aachen.de>2011-11-09 12:53:31+01:00
Message:
ADD: added sainity tests inside modulop
CHG: 'npInt' returns the internal value, now result is in [0,p) and NOT in (-p/2..p/2]!
ADD: Usage of n_Neg: n = n_Neg(n,r) - no copy is returned (TODO: change this?)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpolys/coeffs/modulop.cc

    ra778e6 r0461f0  
    3131BOOLEAN npGreaterZero (number k, const coeffs r)
    3232{
     33  assume( n_Test(k, r) );
     34 
    3335  int h = (int)((long) k);
    3436  return ((int)h !=0) && (h <= (r->npPrimeM>>1));
     
    4547number npMult (number a,number b, const coeffs r)
    4648{
     49  assume( n_Test(a, r) );
     50  assume( n_Test(b, r) );
     51
    4752  if (((long)a == 0) || ((long)b == 0))
    4853    return (number)0;
    49   else
    50     return npMultM(a,b, r);
     54  number c = npMultM(a,b, r);
     55  assume( n_Test(c, r) );
     56  return c; 
    5157}
    5258
     
    5763{
    5864  long ii=i;
    59   long p=(long)ABS(r->ch);
    60   while (ii <  0L)             ii += p;
    61   while ((ii>1L) && (ii >= p)) ii -= p;
    62   return (number)ii;
    63 }
    64 
     65  while (ii <  0L)                         ii += (long)r->ch;
     66  while ((ii>1L) && (ii >= ((long)r->ch))) ii -= (long)r->ch;
     67 
     68  number c = (number)ii;
     69  assume( n_Test(c, r) );
     70  return c;
     71 
     72}
     73
     74
     75#if 0
    6576/*2
    66 * convert a number to an int in (-p/2 .. p/2]
    67 */
     77 * convert a number to an int in (-p/2 .. p/2]
     78 * BUG: InConsistent: nInit(nInt(a)) != a, for a in (p/2, p)
     79 */
    6880int npInt(number &n, const coeffs r)
    6981{
     82  assume( n_Test(n, r) );
     83 
    7084  if ((long)n > (((long)r->ch) >>1)) return (int)((long)n -((long)r->ch));
    7185  else                               return (int)((long)n);
    7286}
     87#else
     88/*2
     89 * convert a number to an int in [0 .. p)
     90 */
     91int npInt(number &n, const coeffs r)
     92{
     93  assume( n_Test(n, r) );
     94 
     95  return (int)(long)n;
     96}
     97#endif
    7398
    7499number npAdd (number a, number b, const coeffs r)
    75100{
    76   return npAddM(a,b, r);
     101  assume( n_Test(a, r) );
     102  assume( n_Test(b, r) );
     103 
     104  number c = npAddM(a,b, r);
     105
     106  assume( n_Test(c, r) );
     107 
     108  return c;
    77109}
    78110
    79111number npSub (number a, number b, const coeffs r)
    80112{
    81   return npSubM(a,b,r);
    82 }
    83 
    84 BOOLEAN npIsZero (number  a, const coeffs)
    85 {
     113  assume( n_Test(a, r) );
     114  assume( n_Test(b, r) );
     115 
     116  number c = npSubM(a,b,r);
     117
     118  assume( n_Test(c, r) );
     119
     120  return c;
     121}
     122
     123BOOLEAN npIsZero (number  a, const coeffs r)
     124{
     125  assume( n_Test(a, r) );
     126 
    86127  return 0 == (long)a;
    87128}
    88129
    89 BOOLEAN npIsOne (number a, const coeffs)
    90 {
     130BOOLEAN npIsOne (number a, const coeffs r)
     131{
     132  assume( n_Test(a, r) );
     133 
    91134  return 1 == (long)a;
    92135}
     
    94137BOOLEAN npIsMOne (number a, const coeffs r)
    95138{
     139  assume( n_Test(a, r) );
     140 
    96141  return ((r->npPminus1M == (long)a)&&((long)1!=(long)a));
    97142}
     
    144189inline number npInversM (number c, const coeffs r)
    145190{
     191  assume( n_Test(c, r) );
    146192#ifndef HAVE_DIV_MOD
    147   return (number)(long)r->npExpTable[r->npPminus1M - r->npLogTable[(long)c]];
     193  number d = (number)(long)r->npExpTable[r->npPminus1M - r->npLogTable[(long)c]];
    148194#else
    149195  long inv=(long)r->npInvTable[(long)c];
     
    153199    r->npInvTable[(long)c]=inv;
    154200  }
    155   return (number)inv;
    156 #endif
     201  number d = (number)inv;
     202#endif
     203  assume( n_Test(d, r) );
     204  return d;
     205
    157206}
    158207
    159208number npDiv (number a,number b, const coeffs r)
    160209{
     210  assume( n_Test(a, r) );
     211  assume( n_Test(b, r) );
     212
    161213//#ifdef NV_OPS
    162214//  if (npPrimeM>NV_MAX_PRIME)
     
    165217  if ((long)a==0)
    166218    return (number)0;
     219  number d;
     220 
    167221#ifndef HAVE_DIV_MOD
    168222  if ((long)b==0)
     
    171225    return (number)0;
    172226  }
    173   else
    174   {
    175     int s = r->npLogTable[(long)a] - r->npLogTable[(long)b];
    176     if (s < 0)
    177       s += r->npPminus1M;
    178     return (number)(long)r->npExpTable[s];
    179   }
     227 
     228  int s = r->npLogTable[(long)a] - r->npLogTable[(long)b];
     229  if (s < 0)
     230    s += r->npPminus1M;
     231  d = (number)(long)r->npExpTable[s];
    180232#else
    181233  number inv=npInversM(b,r);
    182   return npMultM(a,inv,r);
    183 #endif
     234  d = npMultM(a,inv,r);
     235#endif
     236
     237  assume( n_Test(d, r) );
     238  return d;
     239 
    184240}
    185241number  npInvers (number c, const coeffs r)
    186242{
     243  assume( n_Test(c, r) );
     244 
    187245  if ((long)c==0)
    188246  {
     
    190248    return (number)0;
    191249  }
    192   return npInversM(c,r);
     250  number d = npInversM(c,r);
     251 
     252  assume( n_Test(d, r) );
     253  return d;
     254 
    193255}
    194256
    195257number npNeg (number c, const coeffs r)
    196258{
     259  assume( n_Test(c, r) );
     260 
    197261  if ((long)c==0) return c;
    198   return npNegM(c,r);
    199 }
    200 
    201 BOOLEAN npGreater (number a,number b, const coeffs)
    202 {
     262
     263#if 0 
     264  number d = npNegM(c,r); 
     265  assume( n_Test(d, r) );
     266  return d;
     267#else
     268  c = npNegM(c,r); 
     269  assume( n_Test(c, r) );
     270  return c;
     271#endif 
     272}
     273
     274BOOLEAN npGreater (number a,number b, const coeffs r)
     275{
     276  assume( n_Test(a, r) );
     277  assume( n_Test(b, r) );
     278
    203279  //return (long)a != (long)b;
    204280  return (long)a > (long)b;
     
    207283BOOLEAN npEqual (number a,number b, const coeffs r)
    208284{
     285  assume( n_Test(a, r) );
     286  assume( n_Test(b, r) );
     287 
    209288//  return (long)a == (long)b;
     289 
    210290  return npEqualM(a,b,r);
    211291}
     
    213293void npWrite (number &a, const coeffs r)
    214294{
     295  assume( n_Test(a, r) );
     296 
    215297  if ((long)a>(((long)r->ch) >>1)) StringAppend("-%d",(int)(((long)r->ch)-((long)a)));
    216298  else                             StringAppend("%d",(int)((long)a));
     
    219301void npPower (number a, int i, number * result, const coeffs r)
    220302{
     303  assume( n_Test(a, r) );
     304
    221305  if (i==0)
    222306  {
     
    281365    }
    282366  }
     367  assume( n_Test(*a, r) );
    283368  return s;
    284369}
Note: See TracChangeset for help on using the changeset viewer.