Annotation of OpenXM_contrib2/asir2000/engine/pari.c, Revision 1.1
1.1 ! noro 1: /* $OpenXM: OpenXM/src/asir99/engine/pari.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: #if defined(THINK_C)
! 9: void patori(GEN,Obj *);
! 10: void patori_i(GEN,N *);
! 11: void ritopa(Obj,GEN *);
! 12: void ritopa_i(N,int,GEN *);
! 13: #else
! 14: void patori();
! 15: void patori_i();
! 16: void ritopa();
! 17: void ritopa_i();
! 18: #endif
! 19:
! 20: extern long prec;
! 21: extern int paristack;
! 22:
! 23: void risa_pari_init() {
! 24: char buf[BUFSIZ];
! 25: int i;
! 26:
! 27: pari_init(paristack,2);
! 28: prec = 4;
! 29: }
! 30:
! 31: void create_pari_variable(index)
! 32: int index;
! 33: {
! 34: static int max_varn;
! 35: int i;
! 36: char name[BUFSIZ];
! 37:
! 38: if ( index > max_varn ) {
! 39: for ( i = max_varn+1; i <= index; i++ ) {
! 40: sprintf(name,"x%d",i);
! 41: fetch_named_var(name,0);
! 42: }
! 43: max_varn = index;
! 44: }
! 45: }
! 46:
! 47: int get_lg(a)
! 48: GEN a;
! 49: {
! 50: return lg(a);
! 51: }
! 52:
! 53: void ritopa(a,rp)
! 54: Obj a;
! 55: GEN *rp;
! 56: {
! 57: long ltop;
! 58: GEN pnm,z,w;
! 59: DCP dc;
! 60: int i,j,l,row,col;
! 61: VL vl;
! 62: V v;
! 63:
! 64: if ( !a ) {
! 65: *rp = gzero; return;
! 66: }
! 67: switch ( OID(a) ) {
! 68: case O_N:
! 69: switch ( NID(a) ) {
! 70: case N_Q:
! 71: ltop = avma; ritopa_i(NM((Q)a),SGN((Q)a),&pnm);
! 72: if ( INT((Q)a) )
! 73: *rp = pnm;
! 74: else {
! 75: *rp = z = cgetg(3,4); z[1] = (long)pnm;
! 76: ritopa_i(DN((Q)a),1,(GEN *)&z[2]);
! 77: }
! 78: break;
! 79: case N_R:
! 80: *rp = dbltor(BDY((Real)a)); break;
! 81: case N_B:
! 82: *rp = gcopy((GEN)BDY(((BF)a))); break;
! 83: case N_C:
! 84: z = cgetg(3,6);
! 85: ritopa((Obj)((C)a)->r,(GEN *)&z[1]); ritopa((Obj)((C)a)->i,(GEN *)&z[2]);
! 86: *rp = z;
! 87: break;
! 88: default:
! 89: error("ritopa : not implemented"); break;
! 90: }
! 91: break;
! 92: case O_P:
! 93: l = UDEG((P)a); *rp = z = cgetg(l+3,10);
! 94: setsigne(z,1);
! 95: for ( i = 0, vl = CO, v = VR((P)a); vl->v != v;
! 96: vl = NEXT(vl), i++ );
! 97: create_pari_variable(i);
! 98: setvarn(z,i);
! 99: setlgef(z,l+3);
! 100: for ( i = l+2; i >= 2; i-- )
! 101: z[i] = (long)gzero;
! 102: for ( dc = DC((P)a); dc; dc = NEXT(dc) )
! 103: ritopa((Obj)COEF(dc),(GEN *)&z[QTOS(DEG(dc))+2]);
! 104: break;
! 105: case O_VECT:
! 106: l = ((VECT)a)->len; z = cgetg(l+1,17);
! 107: for ( i = 0; i < l; i++ )
! 108: ritopa((Obj)BDY((VECT)a)[i],(GEN *)&z[i+1]);
! 109: *rp = z;
! 110: break;
! 111: case O_MAT:
! 112: row = ((MAT)a)->row; col = ((MAT)a)->col; z = cgetg(col+1,19);
! 113: for ( j = 0; j < col; j++ ) {
! 114: w = cgetg(row+1,18);
! 115: for ( i = 0; i < row; i++ )
! 116: ritopa((Obj)BDY((MAT)a)[i][j],(GEN *)&w[i+1]);
! 117: z[j+1] = (long)w;
! 118: }
! 119: *rp = z;
! 120: break;
! 121: default:
! 122: error("ritopa : not implemented"); break;
! 123: }
! 124: }
! 125:
! 126: void patori(a,rp)
! 127: GEN a;
! 128: Obj *rp;
! 129: {
! 130: Q q,qnm,qdn;
! 131: BF r;
! 132: C c;
! 133: VECT v;
! 134: MAT m;
! 135: N n,nm,dn;
! 136: DCP dc0,dc;
! 137: P t;
! 138: int s,i,j,l,row,col;
! 139: GEN b;
! 140: VL vl;
! 141:
! 142: if ( gcmp0(a) )
! 143: *rp = 0;
! 144: else {
! 145: switch ( typ(a) ) {
! 146: case 1: /* integer */
! 147: patori_i(a,&n); NTOQ(n,(char)signe(a),q); *rp = (Obj)q;
! 148: break;
! 149: case 2: /* real */
! 150: NEWBF(r,lg(a)); bcopy((char *)a,(char *)BDY(r),lg(a)*sizeof(long));
! 151: *rp = (Obj)r;
! 152: break;
! 153: case 4: /* rational; reduced */
! 154: patori_i((GEN)a[1],&nm); patori_i((GEN)a[2],&dn);
! 155: s = signe(a[1])*signe(a[2]);
! 156: if ( UNIN(dn) )
! 157: NTOQ(nm,s,q);
! 158: else
! 159: NDTOQ(nm,dn,s,q);
! 160: *rp = (Obj)q;
! 161: break;
! 162: case 5: /* rational; not necessarily reduced */
! 163: patori_i((GEN)a[1],&nm); patori_i((GEN)a[2],&dn);
! 164: s = signe(a[1])*signe(a[2]);
! 165: NTOQ(nm,s,qnm); NTOQ(dn,1,qdn); divq(qnm,qdn,(Q *)rp);
! 166: break;
! 167: case 6: /* complex */
! 168: if ( gcmp0((GEN)a[2]) )
! 169: patori((GEN)a[1],rp);
! 170: else {
! 171: NEWC(c); patori((GEN)a[1],(Obj *)&c->r); patori((GEN)a[2],(Obj *)&c->i);
! 172: *rp = (Obj)c;
! 173: }
! 174: break;
! 175: case 10: /* polynomial */
! 176: for ( i = lgef(a)-1, dc0 = 0; i >= 2; i-- )
! 177: if ( !gcmp0((GEN)a[i]) ) {
! 178: NEXTDC(dc0,dc);
! 179: patori((GEN)a[i],(Obj *)&COEF(dc)); STOQ(i-2,DEG(dc));
! 180: }
! 181: if ( !dc0 )
! 182: *rp = 0;
! 183: else {
! 184: /* assuming that CO has not changed. */
! 185: for ( s = varn(a), i = 0, vl = CO; i != s;
! 186: i++, vl = NEXT(vl) );
! 187: NEXT(dc) = 0; MKP(vl->v,dc0,t); *rp = (Obj)t;
! 188: }
! 189: break;
! 190: case 17: /* row vector */
! 191: case 18: /* column vector */
! 192: l = lg(a)-1; MKVECT(v,l);
! 193: for ( i = 0; i < l; i++ )
! 194: patori((GEN)a[i+1],(Obj *)&BDY(v)[i]);
! 195: *rp = (Obj)v;
! 196: break;
! 197: case 19: /* matrix */
! 198: col = lg(a)-1; row = lg(a[1])-1; MKMAT(m,row,col);
! 199: for ( j = 0; j < col; j++ )
! 200: for ( i = 0, b = (GEN)a[j+1]; i < row; i++ )
! 201: patori((GEN)b[i+1],(Obj *)&BDY(m)[i][j]);
! 202: *rp = (Obj)m;
! 203: break;
! 204: default:
! 205: error("patori : not implemented");
! 206: break;
! 207: }
! 208: }
! 209: }
! 210:
! 211: #if defined(LONG_IS_32BIT)
! 212: void ritopa_i(a,s,rp)
! 213: N a;
! 214: int s;
! 215: GEN *rp;
! 216: {
! 217: int j,l;
! 218: unsigned int *b;
! 219: GEN z;
! 220:
! 221: l = PL(a); b = (unsigned int *)BD(a);
! 222: z = cgeti(l+2);
! 223: bzero((char *)&z[2],l*sizeof(int));
! 224: for ( j = 0; j < l; j++ )
! 225: z[l-j+1] = b[j];
! 226: s = s>0?1:-1;
! 227: setsigne(z,s);
! 228: setlgefint(z,lg(z));
! 229: *rp = z;
! 230: }
! 231:
! 232: void patori_i(g,rp)
! 233: GEN g;
! 234: N *rp;
! 235: {
! 236: int j,l;
! 237: unsigned int *a,*b;
! 238: N z;
! 239:
! 240: l = lgef(g)-2;
! 241: a = (unsigned int *)g;
! 242: *rp = z = NALLOC(l); PL(z) = l;
! 243: for ( j = 0, b = (unsigned int *)BD(z); j < l; j++ )
! 244: b[l-j-1] = ((unsigned int *)g)[j+2];
! 245: }
! 246: #endif
! 247:
! 248: #if defined(LONG_IS_64BIT)
! 249: void ritopa_i(a,s,rp)
! 250: N a;
! 251: int s;
! 252: GEN *rp;
! 253: {
! 254: int j,l,words;
! 255: unsigned int *b;
! 256: GEN z;
! 257:
! 258: l = PL(a); b = BD(a);
! 259: words = (l+1)/2;
! 260: z = cgeti(words+2);
! 261: bzero((char *)&z[2],words*sizeof(long));
! 262: for ( j = 0; j < words; j++ )
! 263: z[words-j+1] = ((unsigned long)b[2*j])
! 264: |(((unsigned long)(2*j+1<l?b[2*j+1]:0))<<32);
! 265: s = s>0?1:-1;
! 266: setsigne(z,s);
! 267: setlgefint(z,lg(z));
! 268: *rp = z;
! 269: }
! 270:
! 271: void patori_i(g,rp)
! 272: GEN g;
! 273: N *rp;
! 274: {
! 275: int j,l,words;
! 276: unsigned long t;
! 277: unsigned long *a;
! 278: unsigned int *b;
! 279: N z;
! 280:
! 281: words = lgef(g)-2;
! 282: l = 2*words;
! 283: a = (unsigned long *)g;
! 284: *rp = z = NALLOC(l); PL(z) = l;
! 285: for ( j = 0, b = BD(z); j < words; j++ ) {
! 286: t = a[words+1-j];
! 287: b[2*j] = t&0xffffffff;
! 288: b[2*j+1] = t>>32;
! 289: }
! 290: PL(z) = b[l-1] ? l : l-1;
! 291: }
! 292: #endif
! 293:
! 294: void strtobf(s,rp)
! 295: char *s;
! 296: BF *rp;
! 297: {
! 298: GEN z;
! 299:
! 300: z = lisexpr(s); patori(z,(Obj *)rp); cgiv(z);
! 301: }
! 302: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>