[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     ! 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>