[BACK]Return to bf.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Annotation of OpenXM_contrib2/asir2000/engine/bf.c, Revision 1.1.1.1

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/engine/bf.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
                      2: #include "ca.h"
                      3: #if PARI
                      4: #include "base.h"
                      5: #include <math.h>
                      6: #include "genpari.h"
                      7:
                      8: extern long prec;
                      9:
                     10: void ritopa(Obj,GEN *);
                     11: void patori(GEN,Obj *);
                     12:
                     13: void addbf(a,b,c)
                     14: Num a,b;
                     15: Num *c;
                     16: {
                     17:        GEN pa,pb,z;
                     18:        long ltop,lbot;
                     19:
                     20:        if ( !a )
                     21:                *c = b;
                     22:        else if ( !b )
                     23:                *c = a;
                     24:        else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )
                     25:                (*addnumt[MIN(NID(a),NID(b))])(a,b,c);
                     26:        else {
                     27:                ltop = avma; ritopa((Obj)a,&pa);
                     28:                ritopa((Obj)b,&pb); lbot = avma;
                     29:                z = gerepile(ltop,lbot,gadd(pa,pb));
                     30:                patori(z,(Obj *)c); cgiv(z);
                     31:        }
                     32: }
                     33:
                     34: void subbf(a,b,c)
                     35: Num a,b;
                     36: Num *c;
                     37: {
                     38:        GEN pa,pb,z;
                     39:        long ltop,lbot;
                     40:
                     41:        if ( !a )
                     42:                (*chsgnnumt[NID(b)])(b,c);
                     43:        else if ( !b )
                     44:                *c = a;
                     45:        else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )
                     46:                (*subnumt[MIN(NID(a),NID(b))])(a,b,c);
                     47:        else {
                     48:                ltop = avma; ritopa((Obj)a,&pa); ritopa((Obj)b,&pb); lbot = avma;
                     49:                z = gerepile(ltop,lbot,gsub(pa,pb));
                     50:                patori(z,(Obj *)c); cgiv(z);
                     51:        }
                     52: }
                     53:
                     54: void mulbf(a,b,c)
                     55: Num a,b;
                     56: Num *c;
                     57: {
                     58:        GEN pa,pb,z;
                     59:        long ltop,lbot;
                     60:
                     61:        if ( !a || !b )
                     62:                *c = 0;
                     63:        else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )
                     64:                (*mulnumt[MIN(NID(a),NID(b))])(a,b,c);
                     65:        else {
                     66:                ltop = avma; ritopa((Obj)a,&pa); ritopa((Obj)b,&pb); lbot = avma;
                     67:                z = gerepile(ltop,lbot,gmul(pa,pb));
                     68:                patori(z,(Obj *)c); cgiv(z);
                     69:        }
                     70: }
                     71:
                     72: void divbf(a,b,c)
                     73: Num a,b;
                     74: Num *c;
                     75: {
                     76:        GEN pa,pb,z;
                     77:        long ltop,lbot;
                     78:
                     79:        if ( !b )
                     80:                error("divbf : division by 0");
                     81:        else if ( !a )
                     82:                *c = 0;
                     83:        else if ( (NID(a) <= N_A) && (NID(b) <= N_A ) )
                     84:                (*divnumt[MIN(NID(a),NID(b))])(a,b,c);
                     85:        else {
                     86:                ltop = avma; ritopa((Obj)a,&pa); ritopa((Obj)b,&pb); lbot = avma;
                     87:                z = gerepile(ltop,lbot,gdiv(pa,pb));
                     88:                patori(z,(Obj *)c); cgiv(z);
                     89:        }
                     90: }
                     91:
                     92: void pwrbf(a,e,c)
                     93: Num a,e;
                     94: Num *c;
                     95: {
                     96:        GEN pa,pe,z;
                     97:        long ltop,lbot;
                     98:
                     99:        if ( !e )
                    100:                *c = (Num)ONE;
                    101:        else if ( !a )
                    102:                *c = 0;
                    103:        else {
                    104:                ltop = avma; ritopa((Obj)a,&pa); ritopa((Obj)e,&pe); lbot = avma;
                    105:                z = gerepile(ltop,lbot,gpui(pa,pe,prec));
                    106:                patori(z,(Obj *)c); cgiv(z);
                    107:        }
                    108: }
                    109:
                    110: void chsgnbf(a,c)
                    111: Num a,*c;
                    112: {
                    113:        BF t;
                    114:        GEN z;
                    115:        int s;
                    116:
                    117:        if ( !a )
                    118:                *c = 0;
                    119:        else if ( NID(a) <= N_A )
                    120:                (*chsgnnumt[NID(a)])(a,c);
                    121:        else {
                    122:                z = (GEN)((BF)a)->body; s = lg(z); NEWBF(t,s);
                    123:                bcopy((char *)a,(char *)t,sizeof(struct oBF)+((s-1)*sizeof(long)));
                    124:                z = (GEN)((BF)t)->body; setsigne(z,-signe(z));
                    125:                *c = (Num)t;
                    126:        }
                    127: }
                    128:
                    129: int cmpbf(a,b)
                    130: Num a,b;
                    131: {
                    132:        GEN pa,pb;
                    133:        int s;
                    134:
                    135:        if ( !a ) {
                    136:                if ( !b || (NID(b)<=N_A) )
                    137:                        return (*cmpnumt[NID(b)])(a,b);
                    138:                else
                    139:                        return -signe(((BF)b)->body);
                    140:        } else if ( !b ) {
                    141:                if ( !a || (NID(a)<=N_A) )
                    142:                        return (*cmpnumt[NID(a)])(a,b);
                    143:                else
                    144:                        return signe(((BF)a)->body);
                    145:        } else {
                    146:                ritopa((Obj)a,&pa); ritopa((Obj)b,&pb);
                    147:                s = gcmp(pa,pb); cgiv(pb); cgiv(pa);
                    148:                return s;
                    149:        }
                    150: }
                    151: #endif /* PARI */

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