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

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

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/engine/cplx.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
                      2: #include "ca.h"
                      3: #include "base.h"
                      4: #if PARI
                      5: #include "genpari.h"
                      6: void patori(GEN,Obj *);
                      7: void patori_i(GEN,N *);
                      8: void ritopa(Obj,GEN *);
                      9: void ritopa_i(N,int,GEN *);
                     10: #endif
                     11:
                     12: void toreim(a,rp,ip)
                     13: Num a;
                     14: Num *rp,*ip;
                     15: {
                     16:        if ( !a )
                     17:                *rp = *ip = 0;
                     18:        else if ( NID(a) <= N_B ) {
                     19:                *rp = a; *ip = 0;
                     20:        } else {
                     21:                *rp = ((C)a)->r; *ip = ((C)a)->i;
                     22:        }
                     23: }
                     24:
                     25: void reimtocplx(r,i,cp)
                     26: Num r,i;
                     27: Num *cp;
                     28: {
                     29:        C c;
                     30:
                     31:        if ( !i )
                     32:                *cp = r;
                     33:        else {
                     34:                NEWC(c); c->r = r; c->i = i; *cp = (Num)c;
                     35:        }
                     36: }
                     37:
                     38: void addcplx(a,b,c)
                     39: Num a,b;
                     40: Num *c;
                     41: {
                     42:        Num ar,ai,br,bi,cr,ci;
                     43:
                     44:        if ( !a )
                     45:                *c = b;
                     46:        else if ( !b )
                     47:                *c = a;
                     48:        else if ( (NID(a) <= N_B) && (NID(b) <= N_B ) )
                     49:                addnum(0,a,b,c);
                     50:        else {
                     51:                toreim(a,&ar,&ai); toreim(b,&br,&bi);
                     52:                addnum(0,ar,br,&cr); addnum(0,ai,bi,&ci);
                     53:                reimtocplx(cr,ci,c);
                     54:        }
                     55: }
                     56:
                     57: void subcplx(a,b,c)
                     58: Num a,b;
                     59: Num *c;
                     60: {
                     61:        Num ar,ai,br,bi,cr,ci;
                     62:
                     63:        if ( !a )
                     64:                chsgnnum(b,c);
                     65:        else if ( !b )
                     66:                *c = a;
                     67:        else if ( (NID(a) <= N_B) && (NID(b) <= N_B ) )
                     68:                subnum(0,a,b,c);
                     69:        else {
                     70:                toreim(a,&ar,&ai); toreim(b,&br,&bi);
                     71:                subnum(0,ar,br,&cr); subnum(0,ai,bi,&ci);
                     72:                reimtocplx(cr,ci,c);
                     73:        }
                     74: }
                     75:
                     76: void mulcplx(a,b,c)
                     77: Num a,b;
                     78: Num *c;
                     79: {
                     80:        Num ar,ai,br,bi,cr,ci,t,s;
                     81:
                     82:        if ( !a || !b )
                     83:                *c = 0;
                     84:        else if ( (NID(a) <= N_B) && (NID(b) <= N_B ) )
                     85:                mulnum(0,a,b,c);
                     86:        else {
                     87:                toreim(a,&ar,&ai); toreim(b,&br,&bi);
                     88:                mulnum(0,ar,br,&t); mulnum(0,ai,bi,&s); subnum(0,t,s,&cr);
                     89:                mulnum(0,ar,bi,&t); mulnum(0,ai,br,&s); addnum(0,t,s,&ci);
                     90:                reimtocplx(cr,ci,c);
                     91:        }
                     92: }
                     93:
                     94: void divcplx(a,b,c)
                     95: Num a,b;
                     96: Num *c;
                     97: {
                     98:        Num ar,ai,br,bi,cr,ci,t,s,u,w;
                     99:
                    100:        if ( !b )
                    101:                error("divcplx : division by 0");
                    102:        else if ( !a )
                    103:                *c = 0;
                    104:        else if ( (NID(a) <= N_B) && (NID(b) <= N_B ) )
                    105:                divnum(0,a,b,c);
                    106:        else {
                    107:                toreim(a,&ar,&ai); toreim(b,&br,&bi);
                    108:                mulnum(0,br,br,&t); mulnum(0,bi,bi,&s); addnum(0,t,s,&u);
                    109:                mulnum(0,ar,br,&t); mulnum(0,ai,bi,&s);
                    110:                addnum(0,t,s,&w); divnum(0,w,u,&cr);
                    111:                mulnum(0,ar,bi,&t); mulnum(0,ai,br,&s);
                    112:                subnum(0,s,t,&w); divnum(0,w,u,&ci);
                    113:                reimtocplx(cr,ci,c);
                    114:        }
                    115: }
                    116:
                    117: void pwrcplx(a,e,c)
                    118: Num a,e;
                    119: Num *c;
                    120: {
                    121:        int ei;
                    122:        Num t;
                    123:        extern long prec;
                    124:
                    125:        if ( !e )
                    126:                *c = (Num)ONE;
                    127:        else if ( !a )
                    128:                *c = 0;
                    129:        else if ( !INT(e) ) {
                    130: #if PARI
                    131:                GEN pa,pe,z;
                    132:                int ltop,lbot;
                    133:
                    134:                ltop = avma; ritopa((Obj)a,&pa); ritopa((Obj)e,&pe); lbot = avma;
                    135:                z = gerepile(ltop,lbot,gpui(pa,pe,prec));
                    136:                patori(z,(Obj *)c); cgiv(z);
                    137: #else
                    138:                error("pwrcplx : can't calculate a fractional power");
                    139: #endif
                    140:        } else {
                    141:                ei = SGN((Q)e)*QTOS((Q)e);
                    142:                pwrcplx0(a,ei,&t);
                    143:                if ( SGN((Q)e) < 0 )
                    144:                        divnum(0,(Num)ONE,t,c);
                    145:                else
                    146:                        *c = t;
                    147:        }
                    148: }
                    149:
                    150: void pwrcplx0(a,e,c)
                    151: Num a;
                    152: int e;
                    153: Num *c;
                    154: {
                    155:        Num t,s;
                    156:
                    157:        if ( e == 1 )
                    158:                *c = a;
                    159:        else {
                    160:                pwrcplx0(a,e/2,&t);
                    161:                if ( !(e%2) )
                    162:                        mulnum(0,t,t,c);
                    163:                else {
                    164:                        mulnum(0,t,t,&s); mulnum(0,s,a,c);
                    165:                }
                    166:        }
                    167: }
                    168:
                    169: void chsgncplx(a,c)
                    170: Num a,*c;
                    171: {
                    172:        Num r,i;
                    173:
                    174:        if ( !a )
                    175:                *c = 0;
                    176:        else if ( NID(a) <= N_B )
                    177:                chsgnnum(a,c);
                    178:        else {
                    179:                chsgnnum(((C)a)->r,&r); chsgnnum(((C)a)->i,&i);
                    180:                reimtocplx(r,i,c);
                    181:        }
                    182: }
                    183:
                    184: int cmpcplx(a,b)
                    185: Num a,b;
                    186: {
                    187:        Num ar,ai,br,bi;
                    188:        int s;
                    189:
                    190:        if ( !a ) {
                    191:                if ( !b || (NID(b)<=N_B) )
                    192:                        return compnum(0,a,b);
                    193:                else
                    194:                        return -1;
                    195:        } else if ( !b ) {
                    196:                if ( !a || (NID(a)<=N_B) )
                    197:                        return compnum(0,a,b);
                    198:                else
                    199:                        return 1;
                    200:        } else {
                    201:                toreim(a,&ar,&ai); toreim(b,&br,&bi);
                    202:                s = compnum(0,ar,br);
                    203:                if ( s )
                    204:                        return s;
                    205:                else
                    206:                        return compnum(0,ai,bi);
                    207:        }
                    208: }

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