[BACK]Return to level1.h CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / pari-2.2 / src / kernel / none

Annotation of OpenXM_contrib/pari-2.2/src/kernel/none/level1.h, Revision 1.1.1.1

1.1       noro        1: /* $Id: level1.h,v 1.11 2001/06/13 12:59:33 karim Exp $
                      2:
                      3: Copyright (C) 2000  The PARI group.
                      4:
                      5: This file is part of the PARI/GP package.
                      6:
                      7: PARI/GP is free software; you can redistribute it and/or modify it under the
                      8: terms of the GNU General Public License as published by the Free Software
                      9: Foundation. It is distributed in the hope that it will be useful, but WITHOUT
                     10: ANY WARRANTY WHATSOEVER.
                     11:
                     12: Check the License for details. You should have received a copy of it, along
                     13: with the package; see the file 'COPYING'. If not, write to the Free Software
                     14: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
                     15:
                     16: /* This file defines some "level 1" kernel functions                 */
                     17: /* These functions can be inline, with gcc                           */
                     18: /* If not gcc, they are defined externally with "level1.c"           */
                     19:
                     20: /* level1.c includes this file and never needs to be changed         */
                     21: /* The following seven lines are necessary for level0.c and level1.c */
                     22: #ifdef LEVEL1
                     23: #  undef  INLINE
                     24: #  define INLINE
                     25: #endif
                     26: #ifdef LEVEL0
                     27: #  undef  INLINE
                     28: #endif
                     29:
                     30: #ifndef INLINE
                     31: void   addsii(long x, GEN y, GEN z);
                     32: long   addssmod(long a, long b, long p);
                     33: void   addssz(long x, long y, GEN z);
                     34: void   affii(GEN x, GEN y);
                     35: void   affsi(long s, GEN x);
                     36: void   affsr(long s, GEN x);
                     37: GEN    cgetg(long x, long y);
                     38: GEN    cgeti(long x);
                     39: GEN    cgetr(long x);
                     40: int    cmpir(GEN x, GEN y);
                     41: int    cmpsr(long x, GEN y);
                     42: int    divise(GEN x, GEN y);
                     43: long   divisii(GEN x, long y, GEN z);
                     44: void   divisz(GEN x, long y, GEN z);
                     45: void   divrrz(GEN x, GEN y, GEN z);
                     46: void   divsiz(long x, GEN y, GEN z);
                     47: GEN    divss(long x, long y);
                     48: long   divssmod(long a, long b, long p);
                     49: void   divssz(long x, long y, GEN z);
                     50: void   dvmdiiz(GEN x, GEN y, GEN z, GEN t);
                     51: GEN    dvmdis(GEN x, long y, GEN *z);
                     52: void   dvmdisz(GEN x, long y, GEN z, GEN t);
                     53: GEN    dvmdsi(long x, GEN y, GEN *z);
                     54: void   dvmdsiz(long x, GEN y, GEN z, GEN t);
                     55: GEN    dvmdss(long x, long y, GEN *z);
                     56: void   dvmdssz(long x, long y, GEN z, GEN t);
                     57: long   evallg(long x);
                     58: long   evallgef(long x);
                     59: long   evalvalp(long x);
                     60: long   evalexpo(long x);
                     61: long   expi(GEN x);
                     62: double gtodouble(GEN x);
                     63: GEN    icopy(GEN x);
                     64: GEN    icopy_av(GEN x, GEN y);
                     65: long   itos(GEN x);
                     66: GEN    modis(GEN x, long y);
                     67: GEN    mpabs(GEN x);
                     68: GEN    mpadd(GEN x, GEN y);
                     69: void   mpaff(GEN x, GEN y);
                     70: int    mpcmp(GEN x, GEN y);
                     71: GEN    mpcopy(GEN x);
                     72: GEN    mpdiv(GEN x, GEN y);
                     73: int    mpdivis(GEN x, GEN y, GEN z);
                     74: int    mpdivisis(GEN x, long y, GEN z);
                     75: GEN    mpmul(GEN x, GEN y);
                     76: GEN    mpneg(GEN x);
                     77: GEN    mpsub(GEN x, GEN y);
                     78: void   mulsii(long x, GEN y, GEN z);
                     79: long   mulssmod(ulong a, ulong b, ulong c);
                     80: void   mulssz(long x, long y, GEN z);
                     81: GEN    new_chunk(long x);
                     82: GEN    realun(long prec);
                     83: GEN    realzero(long prec);
                     84: void   resiiz(GEN x, GEN y, GEN z);
                     85: GEN    resis(GEN x, long y);
                     86: GEN    ressi(long x, GEN y);
                     87: GEN    shiftr(GEN x, long n);
                     88: long   smodis(GEN x, long y);
                     89: GEN    stoi(long x);
                     90: GEN    subii(GEN x, GEN y);
                     91: GEN    subir(GEN x, GEN y);
                     92: GEN    subri(GEN x, GEN y);
                     93: GEN    subrr(GEN x, GEN y);
                     94: GEN    subsi(long x, GEN y);
                     95: GEN    subsr(long x, GEN y);
                     96: long   subssmod(long a, long b, long p);
                     97: GEN    utoi(ulong x);
                     98: long   vali(GEN x);
                     99:
                    100: #else /* defined(INLINE) */
                    101: INLINE long
                    102: evallg(long x)
                    103: {
                    104:   if (x & ~LGBITS) err(errlg);
                    105:   return m_evallg(x);
                    106: }
                    107:
                    108: INLINE long
                    109: evallgef(long x)
                    110: {
                    111:   if (x & ~LGEFBITS) err(errlgef);
                    112:   return m_evallgef(x);
                    113: }
                    114:
                    115: INLINE long
                    116: evalvalp(long x)
                    117: {
                    118:   const long v = m_evalvalp(x);
                    119:   if (v & ~VALPBITS) err(errvalp);
                    120:   return v;
                    121: }
                    122:
                    123: INLINE long
                    124: evalexpo(long x)
                    125: {
                    126:   const long v = m_evalexpo(x);
                    127:   if (v & ~EXPOBITS) err(errexpo);
                    128:   return v;
                    129: }
                    130:
                    131: INLINE GEN
                    132: new_chunk(long x)
                    133: {
                    134:   const GEN z = ((GEN) avma) - x;
                    135:   if ((ulong)x > (ulong)((GEN)avma-(GEN)bot)) err(errpile);
                    136: #ifdef MEMSTEP
                    137:   checkmemory(z);
                    138: #endif
                    139: #ifdef _WIN32
                    140:   if (win32ctrlc) dowin32ctrlc();
                    141: #endif
                    142:   avma = (long)z; return z;
                    143: }
                    144:
                    145: /* THE FOLLOWING ONES ARE IN mp.s */
                    146: #  ifndef __M68K__
                    147:
                    148: INLINE GEN
                    149: cgetg(long x, long y)
                    150: {
                    151:   const GEN z = new_chunk(x);
                    152:   z[0] = evaltyp(y) | evallg(x);
                    153:   return z;
                    154: }
                    155:
                    156: INLINE GEN
                    157: cgeti(long x)
                    158: {
                    159:   const GEN z = new_chunk(x);
                    160:   z[0] = evaltyp(t_INT) | evallg(x);
                    161:   return z;
                    162: }
                    163:
                    164: INLINE GEN
                    165: cgetr(long x)
                    166: {
                    167:   const GEN z = new_chunk(x);
                    168:   z[0] = evaltyp(t_REAL) | evallg(x);
                    169:   return z;
                    170: }
                    171: #  endif /* __M68K__ */
                    172:
                    173: /* cannot do memcpy because sometimes x and y overlap */
                    174: INLINE GEN
                    175: mpcopy(GEN x)
                    176: {
                    177:   register long lx = lg(x);
                    178:   const GEN y = new_chunk(lx);
                    179:
                    180:   while (--lx >= 0) y[lx]=x[lx];
                    181:   return y;
                    182: }
                    183:
                    184: INLINE GEN
                    185: icopy(GEN x)
                    186: {
                    187:   register long lx = lgefint(x);
                    188:   const GEN y = cgeti(lx);
                    189:
                    190:   while (--lx > 0) y[lx]=x[lx];
                    191:   return y;
                    192: }
                    193:
                    194: /* copy integer x as if we had avma = av */
                    195: INLINE GEN
                    196: icopy_av(GEN x, GEN y)
                    197: {
                    198:   register long lx = lgefint(x);
                    199:
                    200:   y -= lx; while (--lx >= 0) y[lx]=x[lx];
                    201:   return y;
                    202: }
                    203:
                    204: INLINE GEN
                    205: mpneg(GEN x)
                    206: {
                    207:   const GEN y=mpcopy(x);
                    208:   setsigne(y,-signe(x)); return y;
                    209: }
                    210:
                    211: INLINE GEN
                    212: mpabs(GEN x)
                    213: {
                    214:   const GEN y=mpcopy(x);
                    215:   if (signe(x)<0) setsigne(y,1);
                    216:   return y;
                    217: }
                    218:
                    219: INLINE long
                    220: smodis(GEN x, long y)
                    221: {
                    222:   const long av=avma; divis(x,y); avma=av;
                    223:   if (!hiremainder) return 0;
                    224:   return (signe(x)>0) ? hiremainder: labs(y)+hiremainder;
                    225: }
                    226:
                    227: INLINE GEN
                    228: utoi(ulong x)
                    229: {
                    230:   GEN y;
                    231:
                    232:   if (!x) return gzero;
                    233:   y=cgeti(3); y[1] = evalsigne(1) | evallgefint(3); y[2] = x;
                    234:   return y;
                    235: }
                    236:
                    237: INLINE GEN stoi(long);
                    238: INLINE GEN realzero(long);
                    239:
                    240: INLINE GEN
                    241: stosmall(long x)
                    242: {
                    243:   if (labs(x) & SMALL_MASK) return stoi(x);
                    244:   return (GEN) (1 | (x<<1));
                    245: }
                    246:
                    247: #  ifndef __M68K__
                    248: INLINE GEN
                    249: stoi(long x)
                    250: {
                    251:   GEN y;
                    252:
                    253:   if (!x) return gzero;
                    254:   y=cgeti(3);
                    255:   if (x>0) { y[1] = evalsigne(1) | evallgefint(3); y[2] = x; }
                    256:   else { y[1] = evalsigne(-1) | evallgefint(3); y[2] = -x; }
                    257:   return y;
                    258: }
                    259:
                    260: INLINE long
                    261: itos(GEN x)
                    262: {
                    263:   const long s=signe(x);
                    264:   long p1;
                    265:
                    266:   if (!s) return 0;
                    267:   if (lgefint(x)>3) err(affer2);
                    268:   p1=x[2]; if (p1 < 0) err(affer2);
                    269:   return (s>0) ? p1 : -(long)p1;
                    270: }
                    271:
                    272: INLINE void
                    273: affii(GEN x, GEN y)
                    274: {
                    275:   long lx;
                    276:
                    277:   if (x==y) return;
                    278:   lx=lgefint(x); if (lg(y)<lx) err(affer3);
                    279:   while (--lx) y[lx]=x[lx];
                    280: }
                    281:
                    282: INLINE void
                    283: affsi(long s, GEN x)
                    284: {
                    285:   if (!s) { x[1]=2; return; }
                    286:   if (lg(x)<3) err(affer1);
                    287:   if (s>0) { x[1] = evalsigne(1) | evallgefint(3); x[2] = s; }
                    288:   else { x[1] = evalsigne(-1) | evallgefint(3); x[2] = -s; }
                    289: }
                    290:
                    291: INLINE void
                    292: affsr(long s, GEN x)
                    293: {
                    294:   long l;
                    295:
                    296:   if (!s)
                    297:   {
                    298:     l = -bit_accuracy(lg(x));
                    299:     x[1]=evalexpo(l); x[2]=0; return;
                    300:   }
                    301:   if (s<0) { x[1] = evalsigne(-1); s = -s; }
                    302:   else x[1] = evalsigne(1);
                    303:   l=bfffo(s); x[1] |= evalexpo((BITS_IN_LONG-1)-l);
                    304:   x[2] = s<<l; for (l=3; l<lg(x); l++) x[l]=0;
                    305: }
                    306:
                    307: INLINE void
                    308: mpaff(GEN x, GEN y)
                    309: {
                    310:   if (typ(x)==t_INT)
                    311:    { if (typ(y)==t_INT) affii(x,y); else affir(x,y); }
                    312:   else
                    313:    { if (typ(y)==t_INT) affri(x,y); else affrr(x,y); }
                    314: }
                    315:
                    316: INLINE GEN
                    317: shiftr(GEN x, long n)
                    318: {
                    319:   const long e = evalexpo(expo(x)+n);
                    320:   const GEN y = rcopy(x);
                    321:
                    322:   if (e & ~EXPOBITS) err(shier2);
                    323:   y[1] = (y[1]&~EXPOBITS) | e; return y;
                    324: }
                    325:
                    326: INLINE int
                    327: cmpir(GEN x, GEN y)
                    328: {
                    329:   long av;
                    330:   GEN z;
                    331:
                    332:   if (!signe(x)) return -signe(y);
                    333:   av=avma; z=cgetr(lg(y)); affir(x,z); avma=av;
                    334:   return cmprr(z,y); /* cmprr does no memory adjustment */
                    335: }
                    336:
                    337: INLINE int
                    338: cmpsr(long x, GEN y)
                    339: {
                    340:   long av;
                    341:   GEN z;
                    342:
                    343:   if (!x) return -signe(y);
                    344:   av=avma; z=cgetr(3); affsr(x,z); avma=av;
                    345:   return cmprr(z,y);
                    346: }
                    347:
                    348: INLINE void
                    349: addssz(long x, long y, GEN z)
                    350: {
                    351:   if (typ(z)==t_INT) gops2ssz(addss,x,y,z);
                    352:   else
                    353:   {
                    354:     const long av=avma;
                    355:     const GEN p1=cgetr(lg(z));
                    356:
                    357:     affsr(x,p1); affrr(addrs(p1,y),z); avma=av;
                    358:   }
                    359: }
                    360:
                    361: INLINE GEN
                    362: subii(GEN x, GEN y)
                    363: {
                    364:   const long s=signe(y);
                    365:   GEN z;
                    366:
                    367:   if (x==y) return gzero;
                    368:   setsigne(y,-s); z=addii(x,y);
                    369:   setsigne(y, s); return z;
                    370: }
                    371:
                    372: INLINE GEN
                    373: subrr(GEN x, GEN y)
                    374: {
                    375:   const long s=signe(y);
                    376:   GEN z;
                    377:
                    378:   if (x==y) return realzero(lg(x)+2);
                    379:   setsigne(y,-s); z=addrr(x,y);
                    380:   setsigne(y, s); return z;
                    381: }
                    382:
                    383: INLINE GEN
                    384: subir(GEN x, GEN y)
                    385: {
                    386:   const long s=signe(y);
                    387:   GEN z;
                    388:
                    389:   setsigne(y,-s); z=addir(x,y);
                    390:   setsigne(y, s); return z;
                    391: }
                    392:
                    393: INLINE GEN
                    394: subri(GEN x, GEN y)
                    395: {
                    396:   const long s=signe(y);
                    397:   GEN z;
                    398:
                    399:   setsigne(y,-s); z=addir(y,x);
                    400:   setsigne(y, s); return z;
                    401: }
                    402:
                    403: INLINE GEN
                    404: subsi(long x, GEN y)
                    405: {
                    406:   const long s=signe(y);
                    407:   GEN z;
                    408:
                    409:   setsigne(y,-s); z=addsi(x,y);
                    410:   setsigne(y, s); return z;
                    411: }
                    412:
                    413: INLINE GEN
                    414: subsr(long x, GEN y)
                    415: {
                    416:   const long s=signe(y);
                    417:   GEN z;
                    418:
                    419:   setsigne(y,-s); z=addsr(x,y);
                    420:   setsigne(y, s); return z;
                    421: }
                    422:
                    423: INLINE void
                    424: mulssz(long x, long y, GEN z)
                    425: {
                    426:   if (typ(z)==t_INT) gops2ssz(mulss,x,y,z);
                    427:   else
                    428:   {
                    429:     const long av=avma;
                    430:     const GEN p1=cgetr(lg(z));
                    431:
                    432:     affsr(x,p1); mpaff(mulsr(y,p1),z); avma=av;
                    433:   }
                    434: }
                    435:
                    436: INLINE void
                    437: mulsii(long x, GEN y, GEN z)
                    438: {
                    439:   const long av=avma;
                    440:   affii(mulsi(x,y),z); avma=av;
                    441: }
                    442:
                    443: INLINE void
                    444: addsii(long x, GEN y, GEN z)
                    445: {
                    446:   const long av=avma;
                    447:   affii(addsi(x,y),z); avma=av;
                    448: }
                    449:
                    450: INLINE long
                    451: divisii(GEN x, long y, GEN z)
                    452: {
                    453:   const long av=avma;
                    454:   affii(divis(x,y),z); avma=av; return hiremainder;
                    455: }
                    456:
                    457: INLINE long
                    458: vali(GEN x)
                    459: {
                    460:   long lx,i;
                    461:
                    462:   if (!signe(x)) return -1;
                    463:   i = lx = lgefint(x)-1; while (!x[i]) i--;
                    464:   return ((lx-i)<<TWOPOTBITS_IN_LONG) + vals(x[i]);
                    465: }
                    466:
                    467: INLINE GEN
                    468: divss(long x, long y)
                    469: {
                    470:   long p1;
                    471:   LOCAL_HIREMAINDER;
                    472:
                    473:   if (!y) err(diver1);
                    474:   hiremainder=0; p1 = divll((ulong)labs(x),(ulong)labs(y));
                    475:   if (x<0) { hiremainder = -((long)hiremainder); p1 = -p1; }
                    476:   if (y<0) p1 = -p1;
                    477:   SAVE_HIREMAINDER; return stoi(p1);
                    478: }
                    479:
                    480: INLINE GEN
                    481: dvmdss(long x, long y, GEN *z)
                    482: {
                    483:   const GEN p1=divss(x,y);
                    484:   *z = stoi(hiremainder); return p1;
                    485: }
                    486:
                    487: INLINE GEN
                    488: dvmdsi(long x, GEN y, GEN *z)
                    489: {
                    490:   const GEN p1=divsi(x,y);
                    491:   *z = stoi(hiremainder); return p1;
                    492: }
                    493:
                    494: INLINE GEN
                    495: dvmdis(GEN x, long y, GEN *z)
                    496: {
                    497:   const GEN p1=divis(x,y);
                    498:   *z=stoi(hiremainder); return p1;
                    499: }
                    500:
                    501: INLINE void
                    502: dvmdssz(long x, long y, GEN z, GEN t)
                    503: {
                    504:   const long av=avma;
                    505:   const GEN p1=divss(x,y);
                    506:
                    507:   affsi(hiremainder,t); mpaff(p1,z); avma=av;
                    508: }
                    509:
                    510: INLINE void
                    511: dvmdsiz(long x, GEN y, GEN z, GEN t)
                    512: {
                    513:   const long av=avma;
                    514:   const GEN p1=divsi(x,y);
                    515:
                    516:   affsi(hiremainder,t); mpaff(p1,z); avma=av;
                    517: }
                    518:
                    519: INLINE void
                    520: dvmdisz(GEN x, long y, GEN z, GEN t)
                    521: {
                    522:   const long av=avma;
                    523:   const GEN p1=divis(x,y);
                    524:
                    525:   affsi(hiremainder,t); mpaff(p1,z); avma=av;
                    526: }
                    527:
                    528: INLINE void
                    529: dvmdiiz(GEN x, GEN y, GEN z, GEN t)
                    530: {
                    531:   const long av=avma;
                    532:   GEN p;
                    533:
                    534:   mpaff(dvmdii(x,y,&p),z); mpaff(p,t); avma=av;
                    535: }
                    536:
                    537: INLINE GEN
                    538: modis(GEN x, long y)
                    539: {
                    540:   return stoi(smodis(x,y));
                    541: }
                    542:
                    543: INLINE GEN
                    544: ressi(long x, GEN y)
                    545: {
                    546:   const long av=avma;
                    547:   divsi(x,y); avma=av; return stoi(hiremainder);
                    548: }
                    549:
                    550: INLINE GEN
                    551: resis(GEN x, long y)
                    552: {
                    553:   const long av=avma;
                    554:   divis(x,y); avma=av; return stoi(hiremainder);
                    555: }
                    556:
                    557: INLINE void
                    558: divisz(GEN x, long y, GEN z)
                    559: {
                    560:   if (typ(z)==t_INT) gops2gsz(divis,x,y,z);
                    561:   else
                    562:   {
                    563:     const long av=avma;
                    564:     const GEN p1=cgetr(lg(z));
                    565:
                    566:     affir(x,p1); affrr(divrs(p1,y),z); avma=av;
                    567:   }
                    568: }
                    569:
                    570: INLINE void
                    571: divsiz(long x, GEN y, GEN z)
                    572: {
                    573:   const long av=avma;
                    574:
                    575:   if (typ(z)==t_INT) gaffect(divsi(x,y),z);
                    576:   else
                    577:   {
                    578:     const long lz=lg(z);
                    579:     const GEN p1=cgetr(lz), p2=cgetr(lz);
                    580:
                    581:     affsr(x,p1); affir(y,p2);
                    582:     affrr(divrr(p1,p2),z);
                    583:   }
                    584:   avma=av;
                    585: }
                    586:
                    587: INLINE void
                    588: divssz(long x, long y, GEN z)
                    589: {
                    590:   const long av=avma;
                    591:
                    592:   if (typ(z)==t_INT) gaffect(divss(x,y),z);
                    593:   else
                    594:   {
                    595:     const GEN p1=cgetr(lg(z));
                    596:
                    597:     affsr(x,p1); affrr(divrs(p1,y),z);
                    598:   }
                    599:   avma=av;
                    600: }
                    601:
                    602: INLINE void
                    603: divrrz(GEN x, GEN y, GEN z)
                    604: {
                    605:   const long av=avma;
                    606:   mpaff(divrr(x,y),z); avma=av;
                    607: }
                    608:
                    609: INLINE void
                    610: resiiz(GEN x, GEN y, GEN z)
                    611: {
                    612:   const long av=avma;
                    613:   affii(resii(x,y),z); avma=av;
                    614: }
                    615:
                    616: INLINE int
                    617: divise(GEN x, GEN y)
                    618: {
                    619:   const long av=avma;
                    620:   const GEN p1=resii(x,y);
                    621:   avma=av; return p1 == gzero;
                    622: }
                    623:
                    624: INLINE int
                    625: mpcmp(GEN x, GEN y)
                    626: {
                    627:   if (typ(x)==t_INT)
                    628:     return (typ(y)==t_INT) ? cmpii(x,y) : cmpir(x,y);
                    629:   return (typ(y)==t_INT) ? -cmpir(y,x) : cmprr(x,y);
                    630: }
                    631:
                    632: INLINE GEN
                    633: mpadd(GEN x, GEN y)
                    634: {
                    635:   if (typ(x)==t_INT)
                    636:     return (typ(y)==t_INT) ? addii(x,y) : addir(x,y);
                    637:   return (typ(y)==t_INT) ? addir(y,x) : addrr(x,y);
                    638: }
                    639:
                    640: INLINE GEN
                    641: mpsub(GEN x, GEN y)
                    642: {
                    643:   if (typ(x)==t_INT)
                    644:     return (typ(y)==t_INT) ? subii(x,y) : subir(x,y);
                    645:   return (typ(y)==t_INT) ? subri(x,y) : subrr(x,y);
                    646: }
                    647:
                    648: INLINE GEN
                    649: mpmul(GEN x, GEN y)
                    650: {
                    651:   if (typ(x)==t_INT)
                    652:     return (typ(y)==t_INT) ? mulii(x,y) : mulir(x,y);
                    653:   return (typ(y)==t_INT) ? mulir(y,x) : mulrr(x,y);
                    654: }
                    655:
                    656: INLINE GEN
                    657: mpdiv(GEN x, GEN y)
                    658: {
                    659:   if (typ(x)==t_INT)
                    660:     return (typ(y)==t_INT) ? divii(x,y) : divir(x,y);
                    661:   return (typ(y)==t_INT) ? divri(x,y) : divrr(x,y);
                    662: }
                    663:
                    664: INLINE int
                    665: mpdivis(GEN x, GEN y, GEN z)
                    666: {
                    667:   const long av=avma;
                    668:   GEN p2;
                    669:   const GEN p1=dvmdii(x,y,&p2);
                    670:
                    671:   if (signe(p2)) { avma=av; return 0; }
                    672:   affii(p1,z); avma=av; return 1;
                    673: }
                    674:
                    675: /* THE FOLLOWING ONES ARE NOT IN mp.s */
                    676: #  endif /* !defined(__M68K__) */
                    677:
                    678: INLINE int
                    679: mpdivisis(GEN x, long y, GEN z)
                    680: {
                    681:   const ulong av = avma;
                    682:   GEN p1 = divis(x,y);
                    683:   if (hiremainder) { avma = av; return 0; }
                    684:   affii(p1,z); avma = av; return 1;
                    685: }
                    686:
                    687: INLINE double
                    688: gtodouble(GEN x)
                    689: {
                    690:   static long reel4[4]={ evaltyp(t_REAL) | m_evallg(4),0,0,0 };
                    691:
                    692:   if (typ(x)==t_REAL) return rtodbl(x);
                    693:   gaffect(x,(GEN)reel4); return rtodbl((GEN)reel4);
                    694: }
                    695:
                    696: INLINE GEN
                    697: realzero(long prec)
                    698: {
                    699:   GEN x=cgetr(3);
                    700:   x[1]=evalexpo(-bit_accuracy(prec));
                    701:   x[2]=0; return x;
                    702: }
                    703:
                    704: INLINE GEN
                    705: realun(long prec)
                    706: {
                    707:   GEN x=cgetr(prec); affsr(1,x);
                    708:   return x;
                    709: }
                    710:
                    711: INLINE long
                    712: addssmod(long a, long b, long p)
                    713: {
                    714:   ulong res = a + b;
                    715:   return (res >= (ulong)p) ? res - p : res;
                    716: }
                    717:
                    718: INLINE long
                    719: subssmod(long a, long b, long p)
                    720: {
                    721:   long res = a - b;
                    722:   return (res >= 0) ? res : res + p;
                    723: }
                    724:
                    725: INLINE long
                    726: mulssmod(ulong a, ulong b, ulong c)
                    727: {
                    728:   LOCAL_HIREMAINDER;
                    729:   {
                    730:     register ulong x = mulll(a,b);
                    731:
                    732:     /* alter the doubleword by a multiple of c: */
                    733:     if (hiremainder>=c) hiremainder %= c;
                    734:     (void)divll(x,c);
                    735:   }
                    736:   return hiremainder;
                    737: }
                    738:
                    739: INLINE long
                    740: divssmod(long a, long b, long p)
                    741: {
                    742:   long v1 = 0, v2 = 1, v3, r, oldp = p;
                    743:
                    744:   while (b > 1)
                    745:   {
                    746:     v3 = v1 - (p / b) * v2; v1 = v2; v2 = v3;
                    747:     r = p % b; p = b; b = r;
                    748:   }
                    749:
                    750:   if (v2 < 0) v2 += oldp;
                    751:   return mulssmod(a, v2, oldp);
                    752: }
                    753:
                    754: INLINE long
                    755: expi(GEN x)
                    756: {
                    757:   const long lx=lgefint(x);
                    758:   return lx==2? -HIGHEXPOBIT: bit_accuracy(lx)-bfffo(x[2])-1;
                    759: }
                    760:
                    761: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>