Annotation of OpenXM_contrib2/asir2000/engine/C.c, Revision 1.14
1.2 noro 1: /*
2: * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
3: * All rights reserved.
4: *
5: * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
6: * non-exclusive and royalty-free license to use, copy, modify and
7: * redistribute, solely for non-commercial and non-profit purposes, the
8: * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
9: * conditions of this Agreement. For the avoidance of doubt, you acquire
10: * only a limited right to use the SOFTWARE hereunder, and FLL or any
11: * third party developer retains all rights, including but not limited to
12: * copyrights, in and to the SOFTWARE.
13: *
14: * (1) FLL does not grant you a license in any way for commercial
15: * purposes. You may use the SOFTWARE only for non-commercial and
16: * non-profit purposes only, such as academic, research and internal
17: * business use.
18: * (2) The SOFTWARE is protected by the Copyright Law of Japan and
19: * international copyright treaties. If you make copies of the SOFTWARE,
20: * with or without modification, as permitted hereunder, you shall affix
21: * to all such copies of the SOFTWARE the above copyright notice.
22: * (3) An explicit reference to this SOFTWARE and its copyright owner
23: * shall be made on your publication or presentation in any form of the
24: * results obtained by use of the SOFTWARE.
25: * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
1.3 noro 26: * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
1.2 noro 27: * for such modification or the source code of the modified part of the
28: * SOFTWARE.
29: *
30: * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
31: * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
32: * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
33: * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
34: * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
35: * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
36: * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
37: * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
38: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
39: * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
40: * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
41: * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
42: * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
43: * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
44: * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
45: * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
46: * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
47: *
1.14 ! noro 48: * $OpenXM: OpenXM_contrib2/asir2000/engine/C.c,v 1.13 2003/01/04 09:06:17 noro Exp $
1.2 noro 49: */
1.1 noro 50: #include "ca.h"
51: #include "inline.h"
52: #include "base.h"
53:
54: V up_var;
55:
56: /* binary has at least 32 leading 0 chars. */
1.11 noro 57: void binaryton(char *binary,N *np)
1.1 noro 58: {
59: int i,w,len;
60: N n;
61: char buf[33];
62:
63: binary += strlen(binary)%32;
64: len = strlen(binary);
65: w = len/32; /* sufficient for holding binary */
66: n = NALLOC(w);
67: for ( i = 0; i < w; i++ ) {
68: strncpy(buf,binary+len-32*(i+1),32); buf[32] = 0;
69: n->b[i] = strtoul(buf,0,2);
70: }
71: for ( i = w-1; i >= 0 && !n->b[i]; i-- );
72: if ( i < 0 )
73: *np = 0;
74: else {
75: n->p = i+1;
76: *np = n;
77: }
78: }
79:
80: /* hex has at least 8 leading 0 chars. */
1.11 noro 81: void hexton(char *hex,N *np)
1.1 noro 82: {
83: int i,w,len;
84: N n;
85: char buf[9];
86:
87: hex += strlen(hex)%8;
88: len = strlen(hex);
89: w = len/8; /* sufficient for holding hex */
90: n = NALLOC(w);
91: for ( i = 0; i < w; i++ ) {
92: strncpy(buf,hex+len-8*(i+1),8); buf[8] = 0;
93: n->b[i] = strtoul(buf,0,16);
94: }
95: for ( i = w-1; i >= 0 && !n->b[i]; i-- );
96: if ( i < 0 )
97: *np = 0;
98: else {
99: n->p = i+1;
100: *np = n;
101: }
102: }
103:
1.11 noro 104: void ntobn(int base,N n,N *nrp)
1.1 noro 105: {
106: int i,d,plc;
107: unsigned int *c,*x,*w;
108: unsigned int r;
109: L m;
110: N nr;
111:
112: if ( !n ) {
113: *nrp = NULL;
114: return;
115: }
116:
117: d = PL(n);
118: w = BD(n);
119:
120: for ( i = 1, m = 1; m <= LBASE/(L)base; m *= base, i++ );
121:
122: c = (unsigned int *)W_ALLOC(d*i+1);
123: x = (unsigned int *)W_ALLOC(d+1);
124: for ( i = 0; i < d; i++ )
125: x[i] = w[i];
126: for ( plc = 0; d >= 1; plc++ ) {
127: for ( i = d - 1, r = 0; i >= 0; i-- ) {
128: DSAB((unsigned int)base,r,x[i],x[i],r)
129: }
130: c[plc] = r;
131: if ( !x[d-1] ) d--;
132: }
133:
134: *nrp = nr = NALLOC(plc); INITRC(nr);
135: PL(nr) = plc;
136: for ( i = 0; i < plc; i++ )
137: BD(nr)[i] = c[i];
138: }
139:
1.11 noro 140: void bnton(int base,N n,N *nrp)
1.1 noro 141: {
142: unsigned int carry;
143: unsigned int *x,*w;
144: int i,j,d,plc;
145: N nr;
146:
147: if ( !n ) {
148: *nrp = 0;
149: return;
150: }
151:
152: d = PL(n);
153: w = BD(n);
154: x = (unsigned int *)W_ALLOC(d + 1);
155:
156: for ( plc = 0, i = d - 1; i >= 0; i-- ) {
157: for ( carry = w[i],j = 0; j < plc; j++ ) {
158: DMA(x[j],(unsigned int)base,carry,carry,x[j])
159: }
160: if ( carry ) x[plc++] = carry;
161: }
162: *nrp = nr = NALLOC(plc); INITRC(nr);
163: PL(nr) = plc;
164: for ( i = 0; i < plc; i++ )
165: BD(nr)[i] = x[i];
166: }
167:
1.11 noro 168: void ptomp(int m,P p,P *pr)
1.1 noro 169: {
170: DCP dc,dcr,dcr0;
171: Q q;
172: unsigned int a,b;
173: P t;
174: MQ s;
175:
176: if ( !p )
177: *pr = 0;
178: else if ( NUM(p) ) {
179: q = (Q)p;
180: a = rem(NM(q),m);
181: if ( a && (SGN(q) < 0) )
182: a = m-a;
183: b = !DN(q)?1:rem(DN(q),m);
184: if ( !b )
185: error("ptomp : denominator = 0");
186: a = dmar(a,invm(b,m),0,m); STOMQ(a,s); *pr = (P)s;
187: } else {
188: for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
189: ptomp(m,COEF(dc),&t);
190: if ( t ) {
191: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
192: }
193: }
194: if ( !dcr0 )
195: *pr = 0;
196: else {
197: NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
198: }
199: }
200: }
201:
1.11 noro 202: void mptop(P f,P *gp)
1.1 noro 203: {
204: DCP dc,dcr,dcr0;
205: Q q;
206:
207: if ( !f )
208: *gp = 0;
209: else if ( NUM(f) )
210: STOQ(CONT((MQ)f),q),*gp = (P)q;
211: else {
212: for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {
213: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); mptop(COEF(dc),&COEF(dcr));
1.4 noro 214: }
215: NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);
216: }
217: }
218:
1.11 noro 219: void ptosfp(P p,P *pr)
1.7 noro 220: {
221: DCP dc,dcr,dcr0;
222: GFS a;
223: P t;
224:
225: if ( !p )
226: *pr = 0;
227: else if ( NUM(p) ) {
1.13 noro 228: if ( NID((Num)p) == N_GFS )
229: *pr = (P)p;
230: else {
231: qtogfs((Q)p,&a); *pr = (P)a;
232: }
1.7 noro 233: } else {
234: for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
235: ptosfp(COEF(dc),&t);
236: if ( t ) {
237: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
238: }
239: }
240: if ( !dcr0 )
241: *pr = 0;
242: else {
243: NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
244: }
245: }
246: }
247:
1.11 noro 248: void sfptop(P f,P *gp)
1.4 noro 249: {
250: DCP dc,dcr,dcr0;
251: Q q;
1.5 noro 252: MQ fq;
1.4 noro 253:
254: if ( !f )
255: *gp = 0;
256: else if ( NUM(f) ) {
1.5 noro 257: gfstomq((GFS)f,&fq);
258: STOQ(CONT(fq),q);
259: *gp = (P)q;
1.4 noro 260: } else {
261: for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {
262: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); sfptop(COEF(dc),&COEF(dcr));
1.14 ! noro 263: }
! 264: NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);
! 265: }
! 266: }
! 267:
! 268: void sfptopsfp(P f,V v,P *gp)
! 269: {
! 270: DCP dc,dcr,dcr0;
! 271: Q q;
! 272: P fq;
! 273:
! 274: if ( !f )
! 275: *gp = 0;
! 276: else if ( NUM(f) )
! 277: gfstopgfs((GFS)f,v,gp);
! 278: else {
! 279: for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {
! 280: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);
! 281: sfptopsfp(COEF(dc),v,&COEF(dcr));
1.1 noro 282: }
283: NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);
1.7 noro 284: }
285: }
286:
1.11 noro 287: void sf_galois_action(P p,Q e,P *pr)
1.7 noro 288: {
289: DCP dc,dcr,dcr0;
290: GFS a;
291: P t;
292:
293: if ( !p )
294: *pr = 0;
295: else if ( NUM(p) ) {
1.11 noro 296: gfs_galois_action((GFS)p,e,&a); *pr = (P)a;
1.7 noro 297: } else {
298: for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
299: sf_galois_action(COEF(dc),e,&t);
1.10 noro 300: if ( t ) {
301: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
302: }
303: }
304: if ( !dcr0 )
305: *pr = 0;
306: else {
307: NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
308: }
309: }
310: }
311:
312: /* GF(pn)={0,1,a,a^2,...} -> GF(pm)={0,1,b,b^2,..} ; a -> b^k */
313:
1.11 noro 314: void sf_embed(P p,int k,int pm,P *pr)
1.10 noro 315: {
316: DCP dc,dcr,dcr0;
317: GFS a;
318: P t;
319:
320: if ( !p )
321: *pr = 0;
322: else if ( NUM(p) ) {
1.11 noro 323: gfs_embed((GFS)p,k,pm,&a); *pr = (P)a;
1.10 noro 324: } else {
325: for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
326: sf_embed(COEF(dc),k,pm,&t);
1.7 noro 327: if ( t ) {
328: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
329: }
330: }
331: if ( !dcr0 )
332: *pr = 0;
333: else {
334: NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
335: }
1.1 noro 336: }
337: }
338:
1.11 noro 339: void ptolmp(P p,P *pr)
1.1 noro 340: {
341: DCP dc,dcr,dcr0;
342: LM a;
343: P t;
344:
345: if ( !p )
346: *pr = 0;
347: else if ( NUM(p) ) {
348: qtolm((Q)p,&a); *pr = (P)a;
349: } else {
350: for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
351: ptolmp(COEF(dc),&t);
352: if ( t ) {
353: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = t;
354: }
355: }
356: if ( !dcr0 )
357: *pr = 0;
358: else {
359: NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
360: }
361: }
362: }
363:
1.11 noro 364: void lmptop(P f,P *gp)
1.1 noro 365: {
366: DCP dc,dcr,dcr0;
367: Q q;
368:
369: if ( !f )
370: *gp = 0;
371: else if ( NUM(f) ) {
372: NTOQ(((LM)f)->body,1,q); *gp = (P)q;
373: } else {
374: for ( dc = DC(f), dcr0 = 0; dc; dc = NEXT(dc) ) {
375: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); lmptop(COEF(dc),&COEF(dcr));
376: }
377: NEXT(dcr) = 0; MKP(VR(f),dcr0,*gp);
378: }
379: }
380:
1.11 noro 381: void ptoum(int m,P f,UM wf)
1.1 noro 382: {
383: unsigned int r;
384: int i;
385: DCP dc;
386:
387: for ( i = UDEG(f); i >= 0; i-- )
388: COEF(wf)[i] = 0;
389:
390: for ( dc = DC(f); dc; dc = NEXT(dc) ) {
391: r = rem(NM((Q)COEF(dc)),m);
392: if ( r && (SGN((Q)COEF(dc)) < 0) )
393: r = m-r;
394: COEF(wf)[QTOS(DEG(dc))] = r;
395: }
396: degum(wf,UDEG(f));
397: }
398:
1.11 noro 399: void umtop(V v,UM w,P *f)
1.1 noro 400: {
401: int *c;
402: DCP dc,dc0;
403: int i;
404: Q q;
405:
406: if ( DEG(w) < 0 )
407: *f = 0;
408: else if ( DEG(w) == 0 )
409: STOQ(COEF(w)[0],q), *f = (P)q;
410: else {
411: for ( i = DEG(w), c = COEF(w), dc0 = 0; i >= 0; i-- )
412: if ( c[i] ) {
413: NEXTDC(dc0,dc);
414: STOQ(i,DEG(dc));
415: STOQ(c[i],q), COEF(dc) = (P)q;
1.8 noro 416: }
417: NEXT(dc) = 0;
418: MKP(v,dc0,*f);
419: }
420: }
421:
1.11 noro 422: void ptosfum(P f,UM wf)
1.8 noro 423: {
424: GFS c;
425: int i;
426: DCP dc;
1.9 noro 427:
428: if ( OID(f) == O_N ) {
429: DEG(wf) = 0;
1.12 noro 430: ntogfs((Obj)f,&c);
431: COEF(wf)[0] = FTOIF(CONT(c));
1.9 noro 432: return;
433: }
1.8 noro 434:
435: for ( i = UDEG(f); i >= 0; i-- )
436: COEF(wf)[i] = 0;
437:
438: for ( dc = DC(f); dc; dc = NEXT(dc) ) {
1.12 noro 439: ntogfs((Obj)COEF(dc),&c);
1.8 noro 440: if ( c )
441: COEF(wf)[QTOS(DEG(dc))] = FTOIF(CONT(c));
442: }
443: degum(wf,UDEG(f));
444: }
445:
1.11 noro 446: void sfumtop(V v,UM w,P *f)
1.8 noro 447: {
448: int *c;
449: DCP dc,dc0;
450: int i,t;
451: GFS q;
452:
453: if ( DEG(w) < 0 )
454: *f = 0;
455: else if ( DEG(w) == 0 ) {
456: t = COEF(w)[0];
457: t = IFTOF(t);
458: MKGFS(t,q);
459: *f = (P)q;
460: } else {
461: for ( i = DEG(w), c = COEF(w), dc0 = 0; i >= 0; i-- )
462: if ( c[i] ) {
463: NEXTDC(dc0,dc);
464: STOQ(i,DEG(dc));
465: t = COEF(w)[i];
466: t = IFTOF(t);
467: MKGFS(t,q);
468: COEF(dc) = (P)q;
1.1 noro 469: }
470: NEXT(dc) = 0;
471: MKP(v,dc0,*f);
472: }
473: }
474:
1.11 noro 475: void ptoup(P n,UP *nr)
1.1 noro 476: {
477: DCP dc;
478: UP r;
479: int d;
480:
481: if ( !n )
482: *nr = 0;
483: else if ( OID(n) == O_N ) {
484: *nr = r = UPALLOC(0);
485: DEG(r) = 0; COEF(r)[0] = (Num)n;
486: } else {
487: d = UDEG(n);
488: up_var = VR(n);
489: *nr = r = UPALLOC(d); DEG(r) = d;
490: for ( dc = DC(n); dc; dc = NEXT(dc) ) {
491: COEF(r)[QTOS(DEG(dc))] = (Num)COEF(dc);
492: }
493: }
494: }
495:
1.11 noro 496: void uptop(UP n,P *nr)
1.1 noro 497: {
498: int i;
499: DCP dc0,dc;
500:
501: if ( !n )
502: *nr = 0;
503: else if ( !DEG(n) )
504: *nr = (P)COEF(n)[0];
505: else {
506: for ( i = DEG(n), dc0 = 0; i >= 0; i-- )
507: if ( COEF(n)[i] ) {
508: NEXTDC(dc0,dc); STOQ(i,DEG(dc)); COEF(dc) = (P)COEF(n)[i];
509: }
510: if ( !up_var )
511: up_var = CO->v;
512: MKP(up_var,dc0,*nr);
513: }
514: }
515:
1.11 noro 516: void ulmptoum(int m,UP f,UM wf)
1.1 noro 517: {
518: int i,d;
519: LM *c;
520:
521: if ( !f )
522: wf->d = -1;
523: else {
524: wf->d = d = f->d;
525: c = (LM *)f->c;
526: for ( i = 0, d = f->d; i <= d; i++ )
527: COEF(wf)[i] = rem(c[i]->body,m);
528: }
529: }
530:
1.11 noro 531: void objtobobj(int base,Obj p,Obj *rp)
1.1 noro 532: {
533: if ( !p )
534: *rp = 0;
535: else
536: switch ( OID(p) ) {
537: case O_N:
538: numtobnum(base,(Num)p,(Num *)rp); break;
539: case O_P:
540: ptobp(base,(P)p,(P *)rp); break;
541: case O_LIST:
542: listtoblist(base,(LIST)p,(LIST *)rp); break;
543: case O_VECT:
544: vecttobvect(base,(VECT)p,(VECT *)rp); break;
545: case O_MAT:
546: mattobmat(base,(MAT)p,(MAT *)rp); break;
547: case O_STR:
548: *rp = p; break;
549: case O_COMP: default:
550: error("objtobobj : not implemented"); break;
551: }
552: }
553:
1.11 noro 554: void bobjtoobj(int base,Obj p,Obj *rp)
1.1 noro 555: {
556: if ( !p )
557: *rp = 0;
558: else
559: switch ( OID(p) ) {
560: case O_N:
561: bnumtonum(base,(Num)p,(Num *)rp); break;
562: case O_P:
563: bptop(base,(P)p,(P *)rp); break;
564: case O_LIST:
565: blisttolist(base,(LIST)p,(LIST *)rp); break;
566: case O_VECT:
567: bvecttovect(base,(VECT)p,(VECT *)rp); break;
568: case O_MAT:
569: bmattomat(base,(MAT)p,(MAT *)rp); break;
570: case O_STR:
571: *rp = p; break;
572: case O_COMP: default:
573: error("bobjtoobj : not implemented"); break;
574: }
575: }
576:
1.11 noro 577: void numtobnum(int base,Num p,Num *rp)
1.1 noro 578: {
579: N nm,dn,body;
580: Q q;
581: LM l;
582:
583: if ( !p )
584: *rp = 0;
585: else
586: switch ( NID(p) ) {
587: case N_Q:
588: ntobn(base,NM((Q)p),&nm);
589: if ( DN((Q)p) ) {
590: ntobn(base,DN((Q)p),&dn);
591: NDTOQ(nm,dn,SGN((Q)p),q);
592: } else
593: NTOQ(nm,SGN((Q)p),q);
594: *rp = (Num)q;
595: break;
596: case N_R:
597: *rp = p; break;
598: case N_LM:
599: ntobn(base,((LM)p)->body,&body);
600: MKLM(body,l); *rp = (Num)l;
601: break;
602: default:
603: error("numtobnum : not implemented"); break;
604: }
605: }
606:
1.11 noro 607: void bnumtonum(int base,Num p,Num *rp)
1.1 noro 608: {
609: N nm,dn,body;
610: Q q;
611: LM l;
612:
613: if ( !p )
614: *rp = 0;
615: else
616: switch ( NID(p) ) {
617: case N_Q:
618: bnton(base,NM((Q)p),&nm);
619: if ( DN((Q)p) ) {
620: bnton(base,DN((Q)p),&dn);
621: NDTOQ(nm,dn,SGN((Q)p),q);
622: } else
623: NTOQ(nm,SGN((Q)p),q);
624: *rp = (Num)q;
625: break;
626: case N_R:
627: *rp = p; break;
628: case N_LM:
629: bnton(base,((LM)p)->body,&body);
630: MKLM(body,l); *rp = (Num)l;
631: break;
632: default:
633: error("bnumtonum : not implemented"); break;
634: }
635: }
636:
1.11 noro 637: void ptobp(int base,P p,P *rp)
1.1 noro 638: {
639: DCP dcr0,dcr,dc;
640:
641: if ( !p )
642: *rp = p;
643: else {
644: for ( dcr0 = 0, dc = DC(p); dc; dc = NEXT(dc) ) {
645: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);
646: objtobobj(base,(Obj)COEF(dc),(Obj *)&COEF(dcr));
647: }
648: NEXT(dcr) = 0;
649: MKP(VR(p),dcr0,*rp);
650: }
651: }
652:
1.11 noro 653: void bptop(int base,P p,P *rp)
1.1 noro 654: {
655: DCP dcr0,dcr,dc;
656:
657: if ( !p )
658: *rp = p;
659: else {
660: for ( dcr0 = 0, dc = DC(p); dc; dc = NEXT(dc) ) {
661: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);
662: bobjtoobj(base,(Obj)COEF(dc),(Obj *)&COEF(dcr));
663: }
664: NEXT(dcr) = 0;
665: MKP(VR(p),dcr0,*rp);
666: }
667: }
668:
1.11 noro 669: void listtoblist(int base,LIST p,LIST *rp)
1.1 noro 670: {
671: NODE nr0,nr,n;
672:
673: if ( !p )
674: *rp = p;
675: else {
676: for ( nr0 = 0, n = BDY(p); n; n = NEXT(n) ) {
677: NEXTNODE(nr0,nr);
678: objtobobj(base,BDY(n),(Obj *)&BDY(nr));
679: }
680: NEXT(nr) = 0;
681: MKLIST(*rp,nr0);
682: }
683: }
684:
1.11 noro 685: void blisttolist(int base,LIST p,LIST *rp)
1.1 noro 686: {
687: NODE nr0,nr,n;
688:
689: if ( !p )
690: *rp = p;
691: else {
692: for ( nr0 = 0, n = BDY(p); n; n = NEXT(n) ) {
693: NEXTNODE(nr0,nr);
694: bobjtoobj(base,BDY(n),(Obj *)&BDY(nr));
695: }
696: NEXT(nr) = 0;
697: MKLIST(*rp,nr0);
698: }
699: }
700:
1.11 noro 701: void vecttobvect(int base,VECT p,VECT *rp)
1.1 noro 702: {
703: int i,l;
704: VECT r;
705:
706: if ( !p )
707: *rp = p;
708: else {
709: l = p->len;
710: MKVECT(r,l); *rp = r;
711: for ( i = 0; i < l; i++ )
712: objtobobj(base,p->body[i],(Obj *)&r->body[i]);
713: }
714: }
715:
1.11 noro 716: void bvecttovect(int base,VECT p,VECT *rp)
1.1 noro 717: {
718: int i,l;
719: VECT r;
720:
721: if ( !p )
722: *rp = p;
723: else {
724: l = p->len;
725: MKVECT(r,l); *rp = r;
726: for ( i = 0; i < l; i++ )
727: bobjtoobj(base,p->body[i],(Obj *)&r->body[i]);
728: }
729: }
730:
1.11 noro 731: void mattobmat(int base,MAT p,MAT *rp)
1.1 noro 732: {
733: int row,col,i,j;
734: MAT r;
735:
736: if ( !p )
737: *rp = p;
738: else {
739: row = p->row; col = p->col;
740: MKMAT(r,row,col); *rp = r;
741: for ( i = 0; i < row; i++ )
742: for ( j = 0; i < col; j++ )
743: objtobobj(base,p->body[i][j],(Obj *)&r->body[i][j]);
744: }
745: }
746:
1.11 noro 747: void bmattomat(int base,MAT p,MAT *rp)
1.1 noro 748: {
749: int row,col,i,j;
750: MAT r;
751:
752: if ( !p )
753: *rp = p;
754: else {
755: row = p->row; col = p->col;
756: MKMAT(r,row,col); *rp = r;
757: for ( i = 0; i < row; i++ )
758: for ( j = 0; i < col; j++ )
759: bobjtoobj(base,p->body[i][j],(Obj *)&r->body[i][j]);
760: }
761: }
762:
1.11 noro 763: void n32ton27(N g,N *rp)
1.1 noro 764: {
765: int i,j,k,l,r,bits,words;
766: unsigned int t;
767: unsigned int *a,*b;
768: N z;
769:
770: l = PL(g); a = BD(g);
771: for ( i = 31, t = a[l-1]; !(t&(1<<i)); i-- );
772: bits = (l-1)*32+i+1; words = (bits+26)/27;
773: *rp = z = NALLOC(words); PL(z) = words;
774: bzero((char *)BD(z),words*sizeof(unsigned int));
775: for ( j = 0, b = BD(z); j < words; j++ ) {
776: k = (27*j)/32; r = (27*j)%32;
777: if ( r > 5 )
778: b[j] = (a[k]>>r)|(k==(l-1)?0:((a[k+1]&((1<<(r-5))-1))<<(32-r)));
779: else
780: b[j] = (a[k]>>r)&((1<<27)-1);
781: }
782: if ( !(r = bits%27) )
783: r = 27;
784: b[words-1] &= ((1<<r)-1);
785: }
786:
1.11 noro 787: void n27ton32(N a,N *rp)
1.1 noro 788: {
789: int i,j,k,l,r,bits,words;
790: unsigned int t;
791: unsigned int *b,*c;
792: N z;
793:
794: l = PL(a); b = BD(a);
795: for ( i = 26, t = b[l-1]; !(t&(1<<i)); i-- );
796: bits = (l-1)*27+i+1; words = (bits+31)/32;
797: *rp = z = NALLOC(words); PL(z) = words;
798: bzero((char *)BD(z),words*sizeof(unsigned int));
799: for ( j = 0, c = BD(z); j < l; j++ ) {
800: k = (27*j)/32; r = (27*j)%32;
801: if ( r > 5 ) {
802: c[k] |= (b[j]&((1<<(32-r))-1))<<r;
803: if ( k+1 < words )
804: c[k+1] = (b[j]>>(32-r));
805: } else
806: c[k] |= (b[j]<<r);
807: }
808: }
809:
1.11 noro 810: void mptoum(P p,UM pr)
1.1 noro 811: {
812: DCP dc;
813:
814: if ( !p )
815: DEG(pr) = -1;
816: else if ( NUM(p) ) {
817: DEG(pr) = 0; COEF(pr)[0] = CONT((MQ)p);
818: } else {
819: bzero((char *)pr,(int)((UDEG(p)+2)*sizeof(int)));
820: for ( dc = DC(p); dc; dc = NEXT(dc) )
821: COEF(pr)[QTOS(DEG(dc))] = CONT((MQ)COEF(dc));
822: degum(pr,UDEG(p));
823: }
824: }
825:
1.11 noro 826: void umtomp(V v,UM p,P *pr)
1.1 noro 827: {
828: DCP dc,dc0;
829: int i;
830: MQ q;
831:
832: if ( !p || (DEG(p) < 0) )
833: *pr = 0;
834: else if ( !DEG(p) )
835: STOMQ(COEF(p)[0],q), *pr = (P)q;
836: else {
837: for ( dc0 = 0, i = DEG(p); i >= 0; i-- )
838: if ( COEF(p)[i] ) {
839: NEXTDC(dc0,dc); STOQ(i,DEG(dc));
840: STOMQ(COEF(p)[i],q), COEF(dc) = (P)q;
841: }
842: NEXT(dc) = 0; MKP(v,dc0,*pr);
843: }
1.6 noro 844: }
845:
846: /* f(p) -> f(x) */
847:
1.11 noro 848: void enc_to_p(int p,int a,V v,P *pr)
1.6 noro 849: {
850: DCP dc,dct;
851: int i,c;
852: Q dq,cq;
853:
854: dc = 0;
855: for ( i = 0; a; i++, a /= p ) {
856: c = a%p;
857: if ( c ) {
858: STOQ(i,dq); STOQ(c,cq);
859: NEWDC(dct); DEG(dct) = dq; COEF(dct) = (P)cq;
860: NEXT(dct) = dc; dc = dct;
861: }
862: }
863: MKP(v,dc,*pr);
1.1 noro 864: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>