Changeset 5eeb4f in git


Ignore:
Timestamp:
Apr 18, 2018, 6:42:01 PM (5 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', '8e0ad00ce244dfd0756200662572aef8402f13d5')
Children:
65c1bd5b526a9447123bf85f32538aff3498501c
Parents:
83789eef751cc6cbd6f5106c113ccb43c6af36b0
Message:
opt: Z/p arithmetic revisited
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • factory/ffops.h

    r83789ee r5eeb4f  
    5353    long n = a % ff_prime;
    5454#if defined(i386) || defined(__x86_64__) || defined(NTL_AVOID_BRANCHING)
     55    #if SIZEOF_LONG==8
     56    n += (n >> 63) & ff_prime;
     57    #else
    5558    n += (n >> 31) & ff_prime;
     59    #endif
    5660    return n;
    5761#else
  • libpolys/coeffs/modulop.cc

    r83789ee r5eeb4f  
    170170static inline long InvMod(long a, const coeffs R)
    171171{
    172    long d, s, t;
     172   long s, t;
    173173
    174174#ifdef USE_NTL_XGCD
     175   long d;
    175176   XGCD(d, s, t, a, R->ch);
    176177   assume (d == 1);
     
    185186   {
    186187      q = u / v;
    187       r = u % v;
     188      //r = u % v;
     189      r = u - q*v;
    188190      u = v;
    189191      v = r;
     
    196198   s = u1;
    197199#endif
     200#ifdef HAVE_GENERIC_ADD
    198201   if (s < 0)
    199202      return s + R->ch;
    200203   else
    201204      return s;
     205#else
     206  #if SIZEOF_LONG == 8
     207  s += (s >> 63) & R->ch;
     208  #else
     209  s += (s >> 31) & R->ch;
     210  #endif
     211#endif
    202212}
    203213#endif
     
    206216{
    207217  n_Test(c, r);
    208 #ifndef HAVE_DIV_MOD
     218#if !defined(HAVE_MULT_MOD) && (!defined(HAVE_DIV_MOD))
    209219  number d = (number)(long)r->npExpTable[r->npPminus1M - r->npLogTable[(long)c]];
    210220#else
     
    212222  if (inv==0)
    213223  {
     224    #ifndef HAVE_MULT_MOD
     225    inv = (long)r->npExpTable[r->npPminus1M - r->npLogTable[(long)c]];
     226    #else
    214227    inv=InvMod((long)c,r);
     228    #endif
    215229    r->npInvTable[(long)c]=inv;
    216230  }
     
    219233  n_Test(d, r);
    220234  return d;
    221 
    222235}
    223236
     
    227240  n_Test(b, r);
    228241
    229 //#ifdef NV_OPS
    230 //  if (r->ch>NV_MAX_PRIME)
    231 //    return nvDiv(a,b);
    232 //#endif
    233   if ((long)a==0L)
    234     return (number)0L;
    235   number d;
    236 
    237 #ifndef HAVE_DIV_MOD
    238242  if ((long)b==0L)
    239243  {
     
    241245    return (number)0L;
    242246  }
    243 
     247  if ((long)a==0) return (number)0L;
     248
     249  number d;
     250#ifndef HAVE_DIV_MOD
    244251  int s = r->npLogTable[(long)a] - r->npLogTable[(long)b];
    245252  if (s < 0)
Note: See TracChangeset for help on using the changeset viewer.