Annotation of OpenXM/src/kan96xx/Kan/kanExport0.c, Revision 1.1.1.1
1.1 maekawa 1: #include <stdio.h>
2: #include "datatype.h"
3: #include "stackm.h"
4: #include "extern.h"
5: #include "extern2.h"
6: #include "lookup.h"
7: #include "matrix.h"
8: #include "gradedset.h"
9: #include "kclass.h"
10:
11: #define universalToPoly(un,rp) (isZero(un)?ZERO:coeffToPoly(un,rp))
12:
13: static void checkDuplicateName(char *xvars[],char *dvars[],int n);
14:
15: static void yet() { fprintf(stderr,"Not implemented."); }
16:
17: int SerialCurrent = -1; /* Current Serial number of the recieved packet as server. */
18:
19: int ReverseOutputOrder = 1;
20: int WarningNoVectorVariable = 1;
21:
22: /** :arithmetic **/
23: struct object KooAdd(ob1,ob2)
24: struct object ob1,ob2;
25: {
26: extern struct ring *CurrentRingp;
27: struct object rob = NullObject;
28: POLY r;
29: int s,i;
30: objectp f1,f2,g1,g2;
31: struct object nn,dd;
32:
33: switch (Lookup[ob1.tag][ob2.tag]) {
34: case SintegerSinteger:
35: return(KpoInteger(ob1.lc.ival + ob2.lc.ival));
36: break;
37: case SpolySpoly:
38: r = ppAdd(ob1.lc.poly,ob2.lc.poly);
39: rob.tag = Spoly; rob.lc.poly = r;
40: return(rob);
41: break;
42: case SarraySarray:
43: s = getoaSize(ob1);
44: if (s != getoaSize(ob2)) {
45: errorKan1("%s\n","Two arrays must have a same size.");
46: }
47: rob = newObjectArray(s);
48: for (i=0; i<s; i++) {
49: putoa(rob,i,KooAdd(getoa(ob1,i),getoa(ob2,i)));
50: }
51: return(rob);
52: break;
53: case SuniversalNumberSuniversalNumber:
54: rob.tag = SuniversalNumber;
55: rob.lc.universalNumber = newUniversalNumber(0);
56: Cadd(rob.lc.universalNumber,ob1.lc.universalNumber,ob2.lc.universalNumber);
57: return(rob);
58: break;
59: case SuniversalNumberSpoly:
60: rob.tag = Spoly;
61: r = ob2.lc.poly;
62: if (r ISZERO) {
63: /*warningKan("KooAdd(universalNumber,0 polynomial) cannot determine the ring for the result. Assume the current ring.");
64: rob.lc.poly = universalToPoly(ob1.lc.universalNumber,CurrentRingp);*/
65: rob = ob1;
66: return(rob); /* returns universal number. */
67: }
68: rob.lc.poly = ppAdd(universalToPoly(ob1.lc.universalNumber,r->m->ringp),r);
69: return(rob);
70: break;
71: case SpolySuniversalNumber:
72: return(KooAdd(ob2,ob1));
73: break;
74: case SuniversalNumberSinteger:
75: rob.tag = SuniversalNumber;
76: rob.lc.universalNumber = newUniversalNumber(0);
77: nn.tag = SuniversalNumber;
78: nn.lc.universalNumber = newUniversalNumber(KopInteger(ob2));
79: Cadd(rob.lc.universalNumber,ob1.lc.universalNumber,nn.lc.universalNumber);
80: return(rob);
81: break;
82: case SintegerSuniversalNumber:
83: rob.tag = SuniversalNumber;
84: rob.lc.universalNumber = newUniversalNumber(0);
85: nn.tag = SuniversalNumber;
86: nn.lc.universalNumber = newUniversalNumber(KopInteger(ob1));
87: Cadd(rob.lc.universalNumber,nn.lc.universalNumber,ob2.lc.universalNumber);
88: return(rob);
89: break;
90:
91: case SrationalFunctionSrationalFunction:
92: f1 = Knumerator(ob1);
93: f2 = Kdenominator(ob1);
94: g1 = Knumerator(ob2);
95: g2 = Kdenominator(ob2);
96: nn = KooAdd(KooMult(*g2,*f1),KooMult(*f2,*g1));
97: dd = KooMult(*f2,*g2);
98: rob = KnewRationalFunction0(copyObjectp(&nn),copyObjectp(&dd));
99: KisInvalidRational(&rob);
100: return(rob);
101: break;
102: case SpolySrationalFunction: /* f1 + g1/g2 = (g2 f1 + g1)/g2 */
103: case SuniversalNumberSrationalFunction:
104: g1 = Knumerator(ob2);
105: g2 = Kdenominator(ob2);
106: nn = KooAdd(KooMult(*g2,ob1),*g1);
107: rob = KnewRationalFunction0(copyObjectp(&nn),g2);
108: KisInvalidRational(&rob);
109: return(rob);
110: break;
111: case SrationalFunctionSpoly:
112: case SrationalFunctionSuniversalNumber:
113: return(KooAdd(ob2,ob1));
114: break;
115: case SdoubleSdouble:
116: return(KpoDouble( KopDouble(ob1) + KopDouble(ob2) ));
117: break;
118: case SdoubleSinteger:
119: case SdoubleSuniversalNumber:
120: case SdoubleSrationalFunction:
121: return(KpoDouble( KopDouble(ob1) + toDouble0(ob2) ) );
122: break;
123: case SintegerSdouble:
124: case SuniversalNumberSdouble:
125: case SrationalFunctionSdouble:
126: return(KpoDouble( toDouble0(ob1) + KopDouble(ob2) ) );
127: break;
128: case SclassSclass:
129: case SclassSinteger:
130: case SclassSpoly:
131: case SclassSuniversalNumber:
132: case SclassSrationalFunction:
133: case SclassSdouble:
134: case SpolySclass:
135: case SintegerSclass:
136: case SuniversalNumberSclass:
137: case SrationalFunctionSclass:
138: case SdoubleSclass:
139: return(Kclass_ooAdd(ob1,ob2));
140: break;
141:
142:
143: default:
144: warningKan("KooAdd() has not supported yet these objects.\n");
145: break;
146: }
147: return(rob);
148: }
149:
150: struct object KooSub(ob1,ob2)
151: struct object ob1,ob2;
152: {
153: struct object rob = NullObject;
154: POLY r;
155: int s,i;
156: objectp f1,f2,g1,g2;
157: extern struct coeff *UniversalZero;
158: struct object nn,dd;
159:
160: switch (Lookup[ob1.tag][ob2.tag]) {
161: case SintegerSinteger:
162: return(KpoInteger(ob1.lc.ival - ob2.lc.ival));
163: break;
164: case SpolySpoly:
165: r = ppSub(ob1.lc.poly,ob2.lc.poly);
166: rob.tag = Spoly; rob.lc.poly = r;
167: return(rob);
168: break;
169: case SarraySarray:
170: s = getoaSize(ob1);
171: if (s != getoaSize(ob2)) {
172: errorKan1("%s\n","Two arrays must have a same size.");
173: }
174: rob = newObjectArray(s);
175: for (i=0; i<s; i++) {
176: putoa(rob,i,KooSub(getoa(ob1,i),getoa(ob2,i)));
177: }
178: return(rob);
179: break;
180: case SuniversalNumberSuniversalNumber:
181: rob.tag = SuniversalNumber;
182: rob.lc.universalNumber = newUniversalNumber(0);
183: Csub(rob.lc.universalNumber,ob1.lc.universalNumber,ob2.lc.universalNumber);
184: return(rob);
185: break;
186:
187: case SuniversalNumberSpoly:
188: rob.tag = Spoly;
189: r = ob2.lc.poly;
190: if (r ISZERO) {
191: rob = ob1;
192: return(rob); /* returns universal number. */
193: }
194: rob.lc.poly = ppSub(universalToPoly(ob1.lc.universalNumber,r->m->ringp),r);
195: return(rob);
196: break;
197: case SpolySuniversalNumber:
198: rob.tag = Spoly;
199: r = ob1.lc.poly;
200: if (r ISZERO) {
201: rob.tag = SuniversalNumber;
202: rob.lc.universalNumber = newUniversalNumber(0);
203: Csub(rob.lc.universalNumber,UniversalZero,ob2.lc.universalNumber);
204: return(rob); /* returns universal number. */
205: }
206: rob.lc.poly = ppSub(r,universalToPoly(ob2.lc.universalNumber,r->m->ringp));
207: return(rob);
208: break;
209:
210: case SuniversalNumberSinteger:
211: rob.tag = SuniversalNumber;
212: rob.lc.universalNumber = newUniversalNumber(0);
213: nn.tag = SuniversalNumber;
214: nn.lc.universalNumber = newUniversalNumber(KopInteger(ob2));
215: Csub(rob.lc.universalNumber,ob1.lc.universalNumber,nn.lc.universalNumber);
216: return(rob);
217: break;
218: case SintegerSuniversalNumber:
219: rob.tag = SuniversalNumber;
220: rob.lc.universalNumber = newUniversalNumber(0);
221: nn.tag = SuniversalNumber;
222: nn.lc.universalNumber = newUniversalNumber(KopInteger(ob1));
223: Csub(rob.lc.universalNumber,nn.lc.universalNumber,ob2.lc.universalNumber);
224: return(rob);
225: break;
226:
227: case SrationalFunctionSrationalFunction:
228: f1 = Knumerator(ob1);
229: f2 = Kdenominator(ob1);
230: g1 = Knumerator(ob2);
231: g2 = Kdenominator(ob2);
232: nn = KooSub(KooMult(*g2,*f1),KooMult(*f2,*g1));
233: dd = KooMult(*f2,*g2);
234: rob = KnewRationalFunction0(copyObjectp(&nn),copyObjectp(&dd));
235: KisInvalidRational(&rob);
236: return(rob);
237: break;
238: case SpolySrationalFunction: /* f1 - g1/g2 = (g2 f1 - g1)/g2 */
239: case SuniversalNumberSrationalFunction:
240: g1 = Knumerator(ob2);
241: g2 = Kdenominator(ob2);
242: nn = KooSub(KooMult(*g2,ob1),*g1);
243: rob = KnewRationalFunction0(copyObjectp(&nn),g2);
244: KisInvalidRational(&rob);
245: return(rob);
246: break;
247: case SrationalFunctionSpoly:
248: case SrationalFunctionSuniversalNumber: /* f1/f2 - ob2= (f1 - f2*ob2)/f2 */
249: f1 = Knumerator(ob1);
250: f2 = Kdenominator(ob1);
251: nn = KooSub(*f1,KooMult(*f2,ob2));
252: rob = KnewRationalFunction0(copyObjectp(&nn),f2);
253: KisInvalidRational(&rob);
254: return(rob);
255: break;
256:
257: case SdoubleSdouble:
258: return(KpoDouble( KopDouble(ob1) - KopDouble(ob2) ));
259: break;
260: case SdoubleSinteger:
261: case SdoubleSuniversalNumber:
262: case SdoubleSrationalFunction:
263: return(KpoDouble( KopDouble(ob1) - toDouble0(ob2) ) );
264: break;
265: case SintegerSdouble:
266: case SuniversalNumberSdouble:
267: case SrationalFunctionSdouble:
268: return(KpoDouble( toDouble0(ob1) - KopDouble(ob2) ) );
269: break;
270:
271: default:
272: warningKan("KooSub() has not supported yet these objects.\n");
273: break;
274: }
275: return(rob);
276: }
277:
278: struct object KooMult(ob1,ob2)
279: struct object ob1,ob2;
280: {
281: struct object rob = NullObject;
282: POLY r;
283: int i,s;
284: objectp f1,f2,g1,g2;
285: struct object dd,nn;
286:
287:
288: switch (Lookup[ob1.tag][ob2.tag]) {
289: case SintegerSinteger:
290: return(KpoInteger(ob1.lc.ival * ob2.lc.ival));
291: break;
292: case SpolySpoly:
293: r = ppMult(ob1.lc.poly,ob2.lc.poly);
294: rob.tag = Spoly; rob.lc.poly = r;
295: return(rob);
296: break;
297: case SarraySarray:
298: return(KaoMult(ob1,ob2));
299: break;
300: case SpolySarray:
301: case SuniversalNumberSarray:
302: case SrationalFunctionSarray:
303: case SintegerSarray:
304: s = getoaSize(ob2);
305: rob = newObjectArray(s);
306: for (i=0; i<s; i++) {
307: putoa(rob,i,KooMult(ob1,getoa(ob2,i)));
308: }
309: return(rob);
310: break;
311:
312: case SarraySpoly:
313: case SarraySuniversalNumber:
314: case SarraySrationalFunction:
315: case SarraySinteger:
316: s = getoaSize(ob1);
317: rob = newObjectArray(s);
318: for (i=0; i<s; i++) {
319: putoa(rob,i,KooMult(getoa(ob1,i),ob2));
320: }
321: return(rob);
322: break;
323:
324:
325: case SuniversalNumberSuniversalNumber:
326: rob.tag = SuniversalNumber;
327: rob.lc.universalNumber = newUniversalNumber(0);
328: Cmult(rob.lc.universalNumber,ob1.lc.universalNumber,ob2.lc.universalNumber);
329: return(rob);
330: break;
331:
332: case SuniversalNumberSpoly:
333: r = ob2.lc.poly;
334: if (r ISZERO) {
335: rob.tag = SuniversalNumber;
336: rob.lc.universalNumber = newUniversalNumber(0);
337: return(rob); /* returns universal number. */
338: }
339: if (isZero(ob1.lc.universalNumber)) {
340: rob.tag = Spoly;
341: rob.lc.poly = ZERO;
342: return(rob);
343: }
344: rob.tag = Spoly;
345: rob.lc.poly = ppMult(universalToPoly(ob1.lc.universalNumber,r->m->ringp),r);
346: return(rob);
347: break;
348: case SpolySuniversalNumber:
349: return(KooMult(ob2,ob1));
350: break;
351:
352: case SuniversalNumberSinteger:
353: rob.tag = SuniversalNumber;
354: rob.lc.universalNumber = newUniversalNumber(0);
355: nn.tag = SuniversalNumber;
356: nn.lc.universalNumber = newUniversalNumber(KopInteger(ob2));
357: Cmult(rob.lc.universalNumber,ob1.lc.universalNumber,nn.lc.universalNumber);
358: return(rob);
359: break;
360: case SintegerSuniversalNumber:
361: rob.tag = SuniversalNumber;
362: rob.lc.universalNumber = newUniversalNumber(0);
363: nn.tag = SuniversalNumber;
364: nn.lc.universalNumber = newUniversalNumber(KopInteger(ob1));
365: Cmult(rob.lc.universalNumber,nn.lc.universalNumber,ob2.lc.universalNumber);
366: return(rob);
367: break;
368:
369: case SrationalFunctionSrationalFunction:
370: f1 = Knumerator(ob1);
371: f2 = Kdenominator(ob1);
372: g1 = Knumerator(ob2);
373: g2 = Kdenominator(ob2);
374: nn = KooMult(*f1,*g1);
375: dd = KooMult(*f2,*g2);
376: rob = KnewRationalFunction0(copyObjectp(&nn),copyObjectp(&dd));
377: KisInvalidRational(&rob);
378: return(rob);
379: break;
380: case SpolySrationalFunction: /* ob1 g1/g2 */
381: case SuniversalNumberSrationalFunction:
382: g1 = Knumerator(ob2);
383: g2 = Kdenominator(ob2);
384: nn = KooMult(ob1,*g1);
385: rob = KnewRationalFunction0(copyObjectp(&nn),g2);
386: KisInvalidRational(&rob);
387: return(rob);
388: break;
389: case SrationalFunctionSpoly:
390: case SrationalFunctionSuniversalNumber: /* f1*ob2/f2 */
391: f1 = Knumerator(ob1);
392: f2 = Kdenominator(ob1);
393: nn = KooMult(*f1,ob2);
394: rob = KnewRationalFunction0(copyObjectp(&nn),f2);
395: KisInvalidRational(&rob);
396: return(rob);
397: break;
398:
399: case SdoubleSdouble:
400: return(KpoDouble( KopDouble(ob1) * KopDouble(ob2) ));
401: break;
402: case SdoubleSinteger:
403: case SdoubleSuniversalNumber:
404: case SdoubleSrationalFunction:
405: return(KpoDouble( KopDouble(ob1) * toDouble0(ob2) ) );
406: break;
407: case SintegerSdouble:
408: case SuniversalNumberSdouble:
409: case SrationalFunctionSdouble:
410: return(KpoDouble( toDouble0(ob1) * KopDouble(ob2) ) );
411: break;
412:
413: default:
414: warningKan("KooMult() has not supported yet these objects.\n");
415: break;
416: }
417: return(rob);
418: }
419:
420:
421:
422: struct object KoNegate(obj)
423: struct object obj;
424: {
425: struct object rob = NullObject;
426: extern struct ring SmallRing;
427: struct object tob;
428: switch(obj.tag) {
429: case Sinteger:
430: rob = obj;
431: rob.lc.ival = -rob.lc.ival;
432: break;
433: case Spoly:
434: rob.tag = Spoly;
435: rob.lc.poly = ppSub(ZERO,obj.lc.poly);
436: break;
437: case SuniversalNumber:
438: rob.tag = SuniversalNumber;
439: rob.lc.universalNumber = coeffNeg(obj.lc.universalNumber,&SmallRing);
440: break;
441: case SrationalFunction:
442: rob.tag = SrationalFunction;
443: tob = KoNegate(*(Knumerator(obj)));
444: Knumerator(rob) = copyObjectp( &tob);
445: Kdenominator(rob) = Kdenominator(obj);
446: break;
447:
448: case Sdouble:
449: rob = KpoDouble( - toDouble0(obj) );
450: break;
451:
452: default:
453: warningKan("KoNegate() has not supported yet these objects.\n");
454: break;
455: }
456: return(rob);
457: }
458:
459: struct object KoInverse(obj)
460: struct object obj;
461: {
462: struct object rob = NullObject;
463: extern struct coeff *UniversalOne;
464: objectp onep;
465: struct object tob;
466: switch(obj.tag) {
467: case Spoly:
468: tob.tag = SuniversalNumber;
469: tob.lc.universalNumber = UniversalOne;
470: onep = copyObjectp(& tob);
471: rob = KnewRationalFunction0(onep,copyObjectp(&obj));
472: KisInvalidRational(&rob);
473: break;
474: case SuniversalNumber:
475: tob.tag = SuniversalNumber;
476: tob.lc.universalNumber = UniversalOne;
477: onep = copyObjectp(& tob);
478: rob = KnewRationalFunction0(onep,copyObjectp(&obj));
479: KisInvalidRational(&rob);
480: break;
481: case SrationalFunction:
482: rob = obj;
483: Knumerator(rob) = Kdenominator(obj);
484: Kdenominator(rob) = Knumerator(obj);
485: KisInvalidRational(&rob);
486: break;
487: default:
488: warningKan("KoInverse() has not supported yet these objects.\n");
489: break;
490: }
491: return(rob);
492: }
493:
494:
495: static int isVector(ob)
496: struct object ob;
497: {
498: int i,n;
499: n = getoaSize(ob);
500: for (i=0; i<n; i++) {
501: if (getoa(ob,i).tag == Sarray) return(0);
502: }
503: return(1);
504: }
505:
506: static int isMatrix(ob,m,n)
507: struct object ob;
508: int m,n;
509: {
510: int i,j;
511: for (i=0; i<m; i++) {
512: if (getoa(ob,i).tag != Sarray) return(0);
513: if (getoaSize(getoa(ob,i)) != n) return(0);
514: for (j=0; j<n; j++) {
515: if (getoa(getoa(ob,i),j).tag != Spoly) return(-1);
516: }
517: }
518: return(1);
519: }
520:
521:
522: struct object KaoMult(aa,bb)
523: struct object aa,bb;
524: /* aa and bb is assumed to be array. */
525: {
526: int m,n,m2,n2;
527: int i,j,k;
528: POLY tmp;
529: POLY fik;
530: POLY gkj;
531: struct object rob;
532: int r1,r2;
533: int rsize;
534: struct object tob;
535: struct object ob1;
536: extern struct ring SmallRing;
537:
538: m = getoaSize(aa); m2 = getoaSize(bb);
539: if (m == 0 || m2 == 0) errorKan1("%s\n","KaoMult(). Invalid matrix size.");
540:
541: /* new code for vector x vector,... etc */
542: r1 = isVector(aa); r2 = isVector(bb);
543: if (r1 && r2 ) { /* vector X vector ---> scalar.*/
544: rsize = getoaSize(aa);
545: if (rsize != getoaSize(bb)) {
546: errorKan1("%s\n","KaoMult(vector,vector). The size of the vectors must be the same.");
547: }
548: if (r1 != 0) {
549: ob1 = getoa(aa,0);
550: if (ob1.tag == Spoly) {
551: rob.tag = Spoly; rob.lc.poly = ZERO;
552: }else if (ob1.tag == Sinteger) {
553: rob.tag = Sinteger; rob.lc.ival = 0;
554: }else {
555: rob.tag = SuniversalNumber;
556: rob.lc.universalNumber = intToCoeff(0,&SmallRing);
557: }
558: }else{
559: rob.tag = Spoly; rob.lc.poly = ZERO;
560: }
561: for (i=0; i<rsize; i++) {
562: rob = KooAdd(rob,KooMult(getoa(aa,i),getoa(bb,i)));
563: }
564: return(rob);
565: } else if (r1 == 0 && r2 ) { /* matrix X vector ---> vector */
566: /* (m n) (m2=n) */
567: n = getoaSize(getoa(aa,0));
568: if (isMatrix(aa,m,n) == 0) {
569: errorKan1("%s\n","KaoMult(matrix,vector). The left object is not matrix.");
570: }else if (n != m2) {
571: errorKan1("%s\n","KaoMult(). Invalid matrix and vector sizes for mult.");
572: } else ;
573: rob = newObjectArray(m);
574: for (i=0; i<m; i++) {
575: getoa(rob,i) = KooMult(getoa(aa,i),bb);
576: }
577: return(rob);
578: }else if (r1 && r2 == 0) { /* vector X matrix ---> vector */
579: tob = newObjectArray(1);
580: getoa(tob,0) = aa; /* [aa] * bb and strip [ ] */
581: tob = KooMult(tob,bb);
582: return(getoa(tob,0));
583: } else ; /* continue: matrix X matrix case. */
584: /* end of new code */
585:
586: if (getoa(aa,0).tag != Sarray || getoa(bb,0).tag != Sarray) {
587: errorKan1("%s\n","KaoMult(). Matrix must be given.");
588: }
589: n = getoaSize(getoa(aa,0));
590: n2 = getoaSize(getoa(bb,0));
591: if (n != m2) errorKan1("%s\n","KaoMult(). Invalid matrix size for mult. ((p,q)X(q,r)");
592: r1 = isMatrix(aa,m,n); r2 = isMatrix(bb,m2,n2);
593: if (r1 == -1 || r2 == -1) {
594: /* Object multiplication. Elements are not polynomials. */
595: struct object ofik,ogkj,otmp;
596: rob = newObjectArray(m);
597: for (i=0; i<m; i++) {
598: getoa(rob,i) = newObjectArray(n2);
599: }
600: for (i=0; i<m; i++) {
601: for (j=0; j<n2; j++) {
602: ofik = getoa(getoa(aa,i),0);
603: ogkj = getoa(getoa(bb,0),j);
604: otmp = KooMult( ofik, ogkj);
605: for (k=1; k<n; k++) {
606: ofik = getoa(getoa(aa,i),k);
607: ogkj = getoa(getoa(bb,k),j);
608: otmp = KooAdd(otmp, KooMult( ofik, ogkj));
609: }
610: getoa(getoa(rob,i),j) = otmp;
611: }
612: }
613: return(rob);
614: /*errorKan1("%s\n","KaoMult().Elements of the matrix must be polynomials.");*/
615: }
616: if (r1 == 0 || r2 == 0)
617: errorKan1("%s\n","KaoMult(). Invalid matrix form for mult.");
618:
619: rob = newObjectArray(m);
620: for (i=0; i<m; i++) {
621: getoa(rob,i) = newObjectArray(n2);
622: }
623: for (i=0; i<m; i++) {
624: for (j=0; j<n2; j++) {
625: tmp = ZERO;
626: for (k=0; k<n; k++) {
627: fik = KopPOLY(getoa(getoa(aa,i),k));
628: gkj = KopPOLY(getoa(getoa(bb,k),j));
629: tmp = ppAdd(tmp, ppMult( fik, gkj));
630: }
631: getoa(getoa(rob,i),j) = KpoPOLY(tmp);
632: }
633: }
634: return(rob);
635: }
636:
637: struct object KooDiv(ob1,ob2)
638: struct object ob1,ob2;
639: {
640: struct object rob = NullObject;
641: switch (Lookup[ob1.tag][ob2.tag]) {
642: case SintegerSinteger:
643: return(KpoInteger((ob1.lc.ival) / (ob2.lc.ival)));
644: break;
645: case SuniversalNumberSuniversalNumber:
646: rob.tag = SuniversalNumber;
647: rob.lc.universalNumber = newUniversalNumber(0);
648: universalNumberDiv(rob.lc.universalNumber,ob1.lc.universalNumber,
649: ob2.lc.universalNumber);
650: return(rob);
651: break;
652:
653:
654: default:
655: warningKan("KooDiv() has not supported yet these objects.\n");
656: break;
657: }
658: return(rob);
659: }
660:
661: /* :relation */
662: KooEqualQ(obj1,obj2)
663: struct object obj1;
664: struct object obj2;
665: {
666: struct object ob;
667: int i;
668: if (obj1.tag != obj2.tag) {
669: warningKan("KooEqualQ(ob1,ob2): the datatypes of ob1 and ob2 are not same. Returns false (0).\n");
670: return(0);
671: }
672: switch(obj1.tag) {
673: case 0:
674: return(1); /* case of NullObject */
675: break;
676: case Sinteger:
677: if (obj1.lc.ival == obj2.lc.ival) return(1);
678: else return(0);
679: break;
680: case Sstring:
681: case Sdollar:
682: if (strcmp(obj1.lc.str, obj2.lc.str)==0) return(1);
683: else return(0);
684: break;
685: case Spoly:
686: ob = KooSub(obj1,obj2);
687: if (KopPOLY(ob) == ZERO) return(1);
688: else return(0);
689: case Sarray:
690: if (getoaSize(obj1) != getoaSize(obj2)) return(0);
691: for (i=0; i< getoaSize(obj1); i++) {
692: if (KooEqualQ(getoa(obj1,i),getoa(obj2,i))) { ; }
693: else { return(0); }
694: }
695: return(1);
696: case Slist:
697: if (KooEqualQ(*(obj1.lc.op),*(obj2.lc.op))) {
698: if (isNullList(obj1.rc.op)) {
699: if (isNullList(obj2.rc.op)) return(1);
700: else return(0);
701: }else{
702: if (isNullList(obj2.rc.op)) return(0);
703: return(KooEqualQ(*(obj1.rc.op),*(obj2.rc.op)));
704: }
705: }else{
706: return(0);
707: }
708: break;
709: case SuniversalNumber:
710: return(coeffEqual(obj1.lc.universalNumber,obj2.lc.universalNumber));
711: break;
712: case Sring:
713: return(KopRingp(obj1) == KopRingp(obj2));
714: break;
715: case Sclass:
716: return(KclassEqualQ(obj1,obj2));
717: break;
718: case Sdouble:
719: return(KopDouble(obj1) == KopDouble(obj2));
720: break;
721: default:
722: errorKan1("%s\n","KooEqualQ() has not supported these objects yet.");
723: break;
724: }
725: }
726:
727:
728: struct object KoIsPositive(ob1)
729: struct object ob1;
730: {
731: struct object rob = NullObject;
732: switch (ob1.tag) {
733: case Sinteger:
734: return(KpoInteger(ob1.lc.ival > 0));
735: break;
736: default:
737: warningKan("KoIsPositive() has not supported yet these objects.\n");
738: break;
739: }
740: return(rob);
741: }
742:
743: struct object KooGreater(obj1,obj2)
744: struct object obj1;
745: struct object obj2;
746: {
747: struct object ob;
748: int tt;
749: if (obj1.tag != obj2.tag) {
750: errorKan1("%s\n","You cannot compare different kinds of objects.");
751: }
752: switch(obj1.tag) {
753: case 0:
754: return(KpoInteger(1)); /* case of NullObject */
755: break;
756: case Sinteger:
757: if (obj1.lc.ival > obj2.lc.ival) return(KpoInteger(1));
758: else return(KpoInteger(0));
759: break;
760: case Sstring:
761: case Sdollar:
762: if (strcmp(obj1.lc.str, obj2.lc.str)>0) return(KpoInteger(1));
763: else return(KpoInteger(0));
764: break;
765: case Spoly:
766: if ((*mmLarger)(obj1.lc.poly,obj2.lc.poly) == 1) return(KpoInteger(1));
767: else return(KpoInteger(0));
768: break;
769: case SuniversalNumber:
770: tt = coeffGreater(obj1.lc.universalNumber,obj2.lc.universalNumber);
771: if (tt > 0) return(KpoInteger(1));
772: else return(KpoInteger(0));
773: break;
774: case Sdouble:
775: if ( KopDouble(obj1) > KopDouble(obj2) ) return(KpoInteger(1));
776: else return(KpoInteger(0));
777: break;
778: default:
779: errorKan1("%s\n","KooGreater() has not supported these objects yet.");
780: break;
781: }
782: }
783:
784: struct object KooLess(obj1,obj2)
785: struct object obj1;
786: struct object obj2;
787: {
788: struct object ob;
789: int tt;
790: if (obj1.tag != obj2.tag) {
791: errorKan1("%s\n","You cannot compare different kinds of objects.");
792: }
793: switch(obj1.tag) {
794: case 0:
795: return(KpoInteger(1)); /* case of NullObject */
796: break;
797: case Sinteger:
798: if (obj1.lc.ival < obj2.lc.ival) return(KpoInteger(1));
799: else return(KpoInteger(0));
800: break;
801: case Sstring:
802: case Sdollar:
803: if (strcmp(obj1.lc.str, obj2.lc.str)<0) return(KpoInteger(1));
804: else return(KpoInteger(0));
805: break;
806: case Spoly:
807: if ((*mmLarger)(obj2.lc.poly,obj1.lc.poly) == 1) return(KpoInteger(1));
808: else return(KpoInteger(0));
809: break;
810: case SuniversalNumber:
811: tt = coeffGreater(obj1.lc.universalNumber,obj2.lc.universalNumber);
812: if (tt < 0) return(KpoInteger(1));
813: else return(KpoInteger(0));
814: break;
815: case Sdouble:
816: if ( KopDouble(obj1) < KopDouble(obj2) ) return(KpoInteger(1));
817: else return(KpoInteger(0));
818: break;
819: default:
820: errorKan1("%s\n","KooLess() has not supported these objects yet.");
821: break;
822: }
823: }
824:
825: /* :conversion */
826:
827: struct object KdataConversion(obj,key)
828: struct object obj;
829: char *key;
830: {
831: char tmps[128]; /* Assume that double is not more than 128 digits */
832: char intstr[100]; /* Assume that int is not more than 100 digits */
833: struct object rob;
834: extern struct ring *CurrentRingp;
835: extern struct ring SmallRing;
836: int flag;
837: struct object rob1,rob2;
838: char *s;
839: int i;
840: /* reports the data type */
841: if (key[0] == 't' || key[0] =='e') {
842: if (strcmp(key,"type?")==0) {
843: rob = KpoInteger(obj.tag);
844: return(rob);
845: }else if (strcmp(key,"type??")==0) {
846: if (obj.tag != Sclass) {
847: rob = KpoInteger(obj.tag);
848: }else {
849: rob = KpoInteger(ectag(obj));
850: }
851: return(rob);
852: }else if (strcmp(key,"error")==0) {
853: rob = KnewErrorPacketObj(obj);
854: return(rob);
855: }
856: }
857: switch(obj.tag) {
858: case Snull:
859: if (strcmp(key,"integer") == 0) {
860: rob = KpoInteger(0);
861: return(rob);
862: }else if (strcmp(key,"universalNumber") == 0) {
863: rob.tag = SuniversalNumber;
864: rob.lc.universalNumber = intToCoeff(obj.lc.ival,&SmallRing);
865: return(rob);
866: }else if (strcmp(key,"poly") == 0) {
867: rob = KpoPOLY(ZERO);
868: }else{
869: warningKan("Sorry. The data conversion from null to this data type has not supported yet.\n");
870: }
871: break;
872: case Sinteger:
873: if (strcmp(key,"string") == 0) { /* ascii code */
874: rob.tag = Sdollar;
875: rob.lc.str = (char *)sGC_malloc(2);
876: if (rob.lc.str == (char *)NULL) errorKan1("%s","No more memory.\n");
877: (rob.lc.str)[0] = obj.lc.ival; (rob.lc.str)[1] = '\0';
878: return(rob);
879: }else if (strcmp(key,"integer")==0) {
880: return(obj);
881: }else if (strcmp(key,"poly") == 0) {
882: rob.tag = Spoly;
883: rob.lc.poly = cxx(obj.lc.ival,0,0,CurrentRingp);
884: return(rob);
885: }else if (strcmp(key,"dollar") == 0) {
886: rob.tag = Sdollar;
887: sprintf(intstr,"%d",obj.lc.ival);
888: rob.lc.str = (char *)sGC_malloc(strlen(intstr)+2);
889: if (rob.lc.str == (char *)NULL) errorKan1("%s","No more memory.\n");
890: strcpy(rob.lc.str,intstr);
891: return(rob);
892: }else if (strcmp(key,"universalNumber")==0) {
893: rob.tag = SuniversalNumber;
894: rob.lc.universalNumber = intToCoeff(obj.lc.ival,&SmallRing);
895: return(rob);
896: }else if (strcmp(key,"double") == 0) {
897: rob = KpoDouble((double) (obj.lc.ival));
898: return(rob);
899: }else if (strcmp(key,"null") == 0) {
900: rob = NullObject;
901: return(rob);
902: }else{
903: warningKan("Sorry. This type of data conversion has not supported yet.\n");
904: }
905: break;
906: case Sdollar:
907: if (strcmp(key,"dollar") == 0 || strcmp(key,"string")==0) {
908: rob = obj;
909: return(rob);
910: }else if (strcmp(key,"literal") == 0) {
911: rob.tag = Sstring;
912: s = (char *) sGC_malloc(sizeof(char)*(strlen(obj.lc.str)+3));
913: if (s == (char *) NULL) {
914: errorKan1("%s\n","No memory.");
915: }
916: s[0] = '/';
917: strcpy(&(s[1]),obj.lc.str);
918: rob.lc.str = &(s[1]);
919: /* set the hashing value. */
920: rob2 = lookupLiteralString(s);
921: rob.rc.op = rob2.lc.op;
922: return(rob);
923: }else if (strcmp(key,"poly")==0) {
924: rob.tag = Spoly;
925: rob.lc.poly = stringToPOLY(obj.lc.str,CurrentRingp);
926: return(rob);
927: }else if (strcmp(key,"array")==0) {
928: rob = newObjectArray(strlen(obj.lc.str));
929: for (i=0; i<strlen(obj.lc.str); i++) {
930: putoa(rob,i,KpoInteger((obj.lc.str)[i]));
931: }
932: return(rob);
933: }else if (strcmp(key,"universalNumber") == 0) {
934: rob.tag = SuniversalNumber;
935: rob.lc.universalNumber = stringToUniversalNumber(obj.lc.str,&flag);
936: if (flag == -1) errorKan1("KdataConversion(): %s",
937: "It's not number.\n");
938: return(rob);
939: }else if (strcmp(key,"null") == 0) {
940: rob = NullObject;
941: return(rob);
942: }else{
943: warningKan("Sorry. This type of data conversion has not supported yet.\n");
944: }
945: break;
946: case Sarray:
947: if (strcmp(key,"array") == 0) {
948: return(rob);
949: }else if (strcmp(key,"list") == 0) {
950: rob = *( arrayToList(obj) );
951: return(rob);
952: }else if (strcmp(key,"arrayOfPOLY")==0) {
953: rob = KpoArrayOfPOLY(arrayToArrayOfPOLY(obj));
954: return(rob);
955: }else if (strcmp(key,"matrixOfPOLY")==0) {
956: rob = KpoMatrixOfPOLY(arrayToMatrixOfPOLY(obj));
957: return(rob);
958: }else if (strcmp(key,"gradedPolySet")==0) {
959: rob = KpoGradedPolySet(arrayToGradedPolySet(obj));
960: return(rob);
961: }else if (strcmp(key,"null") == 0) {
962: rob = NullObject;
963: return(rob);
964: }else {
965: warningKan("Sorry. This type of data conversion has not supported yet.\n");
966: }
967: break;
968: case Spoly:
969: if (strcmp(key,"poly")==0) {
970: return(rob);
971: }else if (strcmp(key,"integer")==0) {
972: if (obj.lc.poly == ZERO) return(KpoInteger(0));
973: else {
974: return(KpoInteger(coeffToInt(obj.lc.poly->coeffp)));
975: }
976: }else if (strcmp(key,"string")==0 || strcmp(key,"dollar")==0) {
977: rob.tag = Sdollar;
978: rob.lc.str = KPOLYToString(KopPOLY(obj));
979: return(rob);
980: }else if (strcmp(key,"array") == 0) {
981: return( POLYToArray(KopPOLY(obj)));
982: }else if (strcmp(key,"map")==0) {
983: return(KringMap(obj));
984: }else if (strcmp(key,"universalNumber")==0) {
985: if (obj.lc.poly == ZERO) {
986: rob.tag = SuniversalNumber;
987: rob.lc.universalNumber = newUniversalNumber(0);
988: } else {
989: if (obj.lc.poly->coeffp->tag == MP_INTEGER) {
990: rob.tag = SuniversalNumber;
991: rob.lc.universalNumber = newUniversalNumber2(obj.lc.poly->coeffp->val.bigp);
992: }else {
993: rob = NullObject;
994: warningKan("Coefficient is not MP_INT.");
995: }
996: }
997: return(rob);
998: }else if (strcmp(key,"ring")==0) {
999: if (obj.lc.poly ISZERO) {
1000: warningKan("Zero polynomial does not have the ring structure field.\n");
1001: }else{
1002: rob.tag = Sring;
1003: rob.lc.ringp = (obj.lc.poly)->m->ringp;
1004: return(rob);
1005: }
1006: }else if (strcmp(key,"null") == 0) {
1007: rob = NullObject;
1008: return(rob);
1009: }else{
1010: warningKan("Sorry. This type of data conversion has not supported yet.\n");
1011: }
1012: break;
1013: case SarrayOfPOLY:
1014: if (strcmp(key,"array")==0) {
1015: rob = arrayOfPOLYToArray(KopArrayOfPOLYp(obj));
1016: return(rob);
1017: }else{
1018: warningKan("Sorry. This type of data conversion has not supported yet.\n");
1019: }
1020: break;
1021: case SmatrixOfPOLY:
1022: if (strcmp(key,"array")==0) {
1023: rob = matrixOfPOLYToArray(KopMatrixOfPOLYp(obj));
1024: return(rob);
1025: }else if (strcmp(key,"null") == 0) {
1026: rob = NullObject;
1027: return(rob);
1028: }else{
1029: warningKan("Sorry. This type of data conversion has not supported yet.\n");
1030: }
1031: break;
1032: case Slist:
1033: if (strcmp(key,"array") == 0) {
1034: rob = listToArray(&obj);
1035: return(rob);
1036: }
1037: break;
1038: case SuniversalNumber:
1039: if (strcmp(key,"universalNumber")==0) {
1040: return(rob);
1041: }else if (strcmp(key,"integer")==0) {
1042: rob = KpoInteger(coeffToInt(obj.lc.universalNumber));
1043: return(rob);
1044: }else if (strcmp(key,"poly")==0) {
1045: rob = KpoPOLY(universalToPoly(obj.lc.universalNumber,CurrentRingp));
1046: return(rob);
1047: }else if (strcmp(key,"string")==0 || strcmp(key,"dollar")==0) {
1048: rob.tag = Sdollar;
1049: rob.lc.str = coeffToString(obj.lc.universalNumber);
1050: return(rob);
1051: }else if (strcmp(key,"null") == 0) {
1052: rob = NullObject;
1053: return(rob);
1054: }else if (strcmp(key,"double") == 0) {
1055: rob = KpoDouble( toDouble0(obj) );
1056: return(rob);
1057: }else{
1058: warningKan("Sorry. This type of data conversion of universalNumber has not supported yet.\n");
1059: }
1060: break;
1061: case SrationalFunction:
1062: if (strcmp(key,"rationalFunction")==0) {
1063: return(rob);
1064: } if (strcmp(key,"numerator")==0) {
1065: rob = *(Knumerator(obj));
1066: return(rob);
1067: }else if (strcmp(key,"denominator")==0) {
1068: rob = *(Kdenominator(obj));
1069: return(rob);
1070: }else if (strcmp(key,"string")==0 || strcmp(key,"dollar")==0) {
1071: rob1 = KdataConversion(*(Knumerator(obj)),"string");
1072: rob2 = KdataConversion(*(Kdenominator(obj)),"string");
1073: s = sGC_malloc(sizeof(char)*( strlen(rob1.lc.str) + strlen(rob2.lc.str) + 10));
1074: if (s == (char *)NULL) errorKan1("%s\n","KdataConversion(): No memory");
1075: sprintf(s,"(%s)/(%s)",rob1.lc.str,rob2.lc.str);
1076: rob.tag = Sdollar;
1077: rob.lc.str = s;
1078: return(rob);
1079: }else if (strcmp(key,"cancel")==0) {
1080: warningKan("Sorry. Data conversion <<cancel>> of rationalFunction has not supported yet.\n");
1081: return(obj);
1082: }else if (strcmp(key,"null") == 0) {
1083: rob = NullObject;
1084: return(rob);
1085: }else if (strcmp(key,"double") == 0) {
1086: rob = KpoDouble( toDouble0(obj) );
1087: return(rob);
1088: }else{
1089: warningKan("Sorry. This type of data conversion of rationalFunction has not supported yet.\n");
1090: }
1091: break;
1092: case Sdouble:
1093: if (strcmp(key,"integer") == 0) {
1094: rob = KpoInteger( (int) KopDouble(obj));
1095: return(rob);
1096: } else if (strcmp(key,"universalNumber") == 0) {
1097: rob.tag = SuniversalNumber;
1098: rob.lc.universalNumber = intToCoeff((int) KopDouble(obj),&SmallRing);
1099: return(rob);
1100: }else if ((strcmp(key,"string") == 0) || (strcmp(key,"dollar") == 0)) {
1101: sprintf(tmps,"%f",KopDouble(obj));
1102: s = sGC_malloc(strlen(tmps)+2);
1103: if (s == (char *)NULL) errorKan1("%s\n","KdataConversion(): No memory");
1104: strcpy(s,tmps);
1105: rob.tag = Sdollar;
1106: rob.lc.str = s;
1107: return(rob);
1108: }else if (strcmp(key,"double")==0) {
1109: return(obj);
1110: }else if (strcmp(key,"null") == 0) {
1111: rob = NullObject;
1112: return(rob);
1113: }else {
1114: warningKan("Sorry. This type of data conversion of rationalFunction has not supported yet.\n");
1115: }
1116: break;
1117: case Sring:
1118: if (strcmp(key,"orderMatrix")==0) {
1119: rob = oGetOrderMatrix(KopRingp(obj));
1120: return(rob);
1121: }else{
1122: warningKan("Sorryl This type of data conversion of ringp has not supported yet.\n");
1123: }
1124: break;
1125: default:
1126: warningKan("Sorry. This type of data conversion has not supported yet.\n");
1127: }
1128: return(NullObject);
1129: }
1130:
1131: /* conversion functions between primitive data and objects.
1132: If it's not time critical, it is recommended to use these functions */
1133: struct object KpoInteger(k)
1134: int k;
1135: {
1136: struct object obj;
1137: obj.tag = Sinteger;
1138: obj.lc.ival = k; obj.rc.ival = 0;
1139: return(obj);
1140: }
1141: struct object KpoString(s)
1142: char *s;
1143: {
1144: struct object obj;
1145: obj.tag = Sdollar;
1146: obj.lc.str = s; obj.rc.ival = 0;
1147: return(obj);
1148: }
1149: struct object KpoPOLY(f)
1150: POLY f;
1151: {
1152: struct object obj;
1153: obj.tag = Spoly;
1154: obj.lc.poly = f; obj.rc.ival = 0;
1155: return(obj);
1156: }
1157: struct object KpoArrayOfPOLY(ap)
1158: struct arrayOfPOLY *ap ;
1159: {
1160: struct object obj;
1161: obj.tag = SarrayOfPOLY;
1162: obj.lc.arrayp = ap; obj.rc.ival = 0;
1163: return(obj);
1164: }
1165:
1166: struct object KpoMatrixOfPOLY(mp)
1167: struct matrixOfPOLY *mp ;
1168: {
1169: struct object obj;
1170: obj.tag = SmatrixOfPOLY;
1171: obj.lc.matrixp = mp; obj.rc.ival = 0;
1172: return(obj);
1173: }
1174:
1175: struct object KpoRingp(ringp)
1176: struct ring *ringp;
1177: {
1178: struct object obj;
1179: obj.tag = Sring;
1180: obj.lc.ringp = ringp;
1181: return(obj);
1182: }
1183:
1184: /*** conversion 2. Data conversions on arrays and matrices. ****/
1185: struct object arrayOfPOLYToArray(aa)
1186: struct arrayOfPOLY *aa;
1187: {
1188: POLY *a;
1189: int size;
1190: struct object r;
1191: int j;
1192: struct object tmp;
1193:
1194: size = aa->n; a = aa->array;
1195: r = newObjectArray(size);
1196: for (j=0; j<size; j++) {
1197: tmp.tag = Spoly;
1198: tmp.lc.poly= a[j];
1199: putoa(r,j,tmp);
1200: }
1201: return( r );
1202: }
1203:
1204: struct object matrixOfPOLYToArray(pmat)
1205: struct matrixOfPOLY *pmat;
1206: {
1207: struct object r;
1208: struct object tmp;
1209: int i,j;
1210: int m,n;
1211: POLY *mat;
1212: struct arrayOfPOLY ap;
1213:
1214: m = pmat->m; n = pmat->n; mat = pmat->mat;
1215: r = newObjectArray(m);
1216: for (i=0; i<m; i++) {
1217: ap.n = n; ap.array = &(mat[ind(i,0)]);
1218: tmp = arrayOfPOLYToArray(&ap);
1219: /* ind() is the macro defined in matrix.h. */
1220: putoa(r,i,tmp);
1221: }
1222: return(r);
1223: }
1224:
1225: struct arrayOfPOLY *arrayToArrayOfPOLY(oa)
1226: struct object oa;
1227: {
1228: POLY *a;
1229: int size;
1230: int i;
1231: struct object tmp;
1232: struct arrayOfPOLY *ap;
1233:
1234: if (oa.tag != Sarray) errorKan1("KarrayToArrayOfPOLY(): %s",
1235: "Argument is not array\n");
1236: size = getoaSize(oa);
1237: a = (POLY *)sGC_malloc(sizeof(POLY)*size);
1238: for (i=0; i<size; i++) {
1239: tmp = getoa(oa,i);
1240: if (tmp.tag != Spoly) errorKan1("KarrayToArrayOfPOLY():%s ",
1241: "element must be polynomial.\n");
1242: a[i] = tmp.lc.poly;
1243: }
1244: ap = (struct arrayOfPOLY *)sGC_malloc(sizeof(struct arrayOfPOLY));
1245: ap->n = size;
1246: ap->array = a;
1247: return(ap);
1248: }
1249:
1250: struct matrixOfPOLY *arrayToMatrixOfPOLY(oa)
1251: struct object oa;
1252: {
1253: POLY *a;
1254: int m;
1255: int n;
1256: int i,j;
1257: struct matrixOfPOLY *ma;
1258:
1259: struct object tmp,tmp2;
1260: if (oa.tag != Sarray) errorKan1("KarrayToMatrixOfPOLY(): %s",
1261: "Argument is not array\n");
1262: m = getoaSize(oa);
1263: tmp = getoa(oa,0);
1264: if (tmp.tag != Sarray) errorKan1("arrayToMatrixOfPOLY():%s ",
1265: "Argument is not array\n");
1266: n = getoaSize(tmp);
1267: a = (POLY *)sGC_malloc(sizeof(POLY)*(m*n));
1268: for (i=0; i<m; i++) {
1269: tmp = getoa(oa,i);
1270: if (tmp.tag != Sarray) errorKan1("arrayToMatrixOfPOLY(): %s",
1271: "element must be array.\n");
1272: for (j=0; j<n; j++) {
1273: tmp2 = getoa(tmp,j);
1274: if (tmp2.tag != Spoly) errorKan1("arrayToMatrixOfPOLY(): %s",
1275: "element must be a polynomial.\n");
1276: a[ind(i,j)] = tmp2.lc.poly;
1277: /* we use the macro ind here. Be careful of using m and n. */
1278: }
1279: }
1280: ma = (struct matrixOfPOLY *)sGC_malloc(sizeof(struct matrixOfPOLY));
1281: ma->m = m; ma->n = n;
1282: ma->mat = a;
1283: return(ma);
1284: }
1285:
1286: /* :misc */
1287:
1288: /* :ring :kan */
1289: int objArrayToOrderMatrix(oA,order,n,oasize)
1290: struct object oA;
1291: int order[];
1292: int n;
1293: int oasize;
1294: {
1295: int size;
1296: int k,j;
1297: struct object tmpOa;
1298: struct object obj;
1299: if (oA.tag != Sarray) {
1300: warningKan("The argument should be of the form [ [...] [...] ... [...]].");
1301: return(-1);
1302: }
1303: size = getoaSize(oA);
1304: if (size != oasize) {
1305: warningKan("The row size of the array is wrong.");
1306: return(-1);
1307: }
1308: for (k=0; k<size; k++) {
1309: tmpOa = getoa(oA,k);
1310: if (tmpOa.tag != Sarray) {
1311: warningKan("The argument should be of the form [ [...] [...] ... [...]].");
1312: return(-1);
1313: }
1314: if (getoaSize(tmpOa) != 2*n) {
1315: warningKan("The column size of the array is wrong.");
1316: return(-1);
1317: }
1318: for (j=0; j<2*n; j++) {
1319: obj = getoa(tmpOa,j);
1320: order[k*2*n+j] = obj.lc.ival;
1321: }
1322: }
1323: return(0);
1324: }
1325:
1326: int KsetOrderByObjArray(oA)
1327: struct object oA;
1328: {
1329: int *order;
1330: int n,c,l, oasize;
1331: extern struct ring *CurrentRingp;
1332: extern int AvoidTheSameRing;
1333: /* n,c,l must be set in the CurrentRing */
1334: if (AvoidTheSameRing) {
1335: errorKan1("%s\n","KsetOrderByObjArray(): You cannot change the order matrix when AvoidTheSameRing == 1.");
1336: }
1337: n = CurrentRingp->n;
1338: c = CurrentRingp->c;
1339: l = CurrentRingp->l;
1340: if (oA.tag != Sarray) {
1341: warningKan("The argument should be of the form [ [...] [...] ... [...]].");
1342: return(-1);
1343: }
1344: oasize = getoaSize(oA);
1345: order = (int *)sGC_malloc(sizeof(int)*((2*n)*oasize+1));
1346: if (order == (int *)NULL) errorKan1("%s\n","KsetOrderByObjArray(): No memory.");
1347: if (objArrayToOrderMatrix(oA,order,n,oasize) == -1) {
1348: return(-1);
1349: }
1350: setOrderByMatrix(order,n,c,l,oasize); /* Set order to the current ring. */
1351: return(0);
1352: }
1353:
1354: static int checkRelations(c,l,m,n,cc,ll,mm,nn)
1355: int c,l,m,n,cc,ll,mm,nn;
1356: {
1357: if (!(1<=c && c<=l && l<=m && m<=n)) return(1);
1358: if (!(cc<=ll && ll<=mm && mm<=nn && nn <= n)) return(1);
1359: if (!(cc<c || ll < l || mm < m || nn < n)) {
1360: if (WarningNoVectorVariable) {
1361: warningKan("Ring definition: there is no variable to represent vectors.\n");
1362: }
1363: }
1364: if (!(cc<=c && ll <= l && mm <= m && nn <= n)) return(1);
1365: return(0);
1366: }
1367:
1368: struct object KgetOrderMatrixOfCurrentRing()
1369: {
1370: extern struct ring *CurrentRingp;
1371: return(oGetOrderMatrix(CurrentRingp));
1372: }
1373:
1374:
1375: int KsetUpRing(ob1,ob2,ob3,ob4,ob5)
1376: struct object ob1,ob2,ob3,ob4,ob5;
1377: /* ob1 = [x(0), ..., x(n-1)];
1378: ob2 = [D(0), ..., D(n-1)];
1379: ob3 = [p,c,l,m,n,cc,ll,mm,nn,next];
1380: ob4 = Order matrix
1381: ob5 = [(keyword) value (keyword) value ....]
1382: */
1383: #define RP_LIMIT 500
1384: {
1385: int i;
1386: struct object ob;
1387: int c,l,m,n;
1388: int cc,ll,mm,nn;
1389: int p;
1390: char **xvars;
1391: char **dvars;
1392: int *outputVars;
1393: int *order;
1394: static int rp = 0;
1395: static struct ring *rstack[RP_LIMIT];
1396:
1397: extern struct ring *CurrentRingp;
1398: struct ring *newRingp;
1399: int ob3Size;
1400: struct ring *nextRing;
1401: int oasize;
1402: static int ringSerial = 0;
1403: char *ringName = NULL;
1404: int aa;
1405: extern int AvoidTheSameRing;
1406: extern char *F_mpMult;
1407: char *fmp_mult_saved;
1408: char *mpMultName = NULL;
1409: struct object rob;
1410: struct ring *savedCurrentRingp;
1411:
1412: /* To get the ring structure. */
1413: if (ob1.tag == Snull) {
1414: rob = newObjectArray(rp);
1415: for (i=0; i<rp; i++) {
1416: putoa(rob,i,KpoRingp(rstack[i]));
1417: }
1418: KSpush(rob);
1419: return(0);
1420: }
1421:
1422: if (ob3.tag != Sarray) errorKan1("%s\n","Error in the 3rd argument. You need to give 4 arguments.");
1423: ob3Size = getoaSize(ob3);
1424: if (ob3Size != 9 && ob3Size != 10)
1425: errorKan1("%s\n","Error in the 3rd argument.");
1426: for (i=0; i<9; i++) {
1427: ob = getoa(ob3,i);
1428: if (ob.tag != Sinteger) errorKan1("%s\n","The 3rd argument should be a list of integers.");
1429: }
1430: if (ob3Size == 10) {
1431: ob = getoa(ob3,9);
1432: if (ob.tag != Sring)
1433: errorKan1("%s\n","The last arguments of the 3rd argument must be a pointer to a ring.");
1434: nextRing = KopRingp(ob);
1435: } else {
1436: nextRing = (struct ring *)NULL;
1437: }
1438:
1439: p = getoa(ob3,0).lc.ival;
1440: c = getoa(ob3,1).lc.ival; l = getoa(ob3,2).lc.ival;
1441: m = getoa(ob3,3).lc.ival; n = getoa(ob3,4).lc.ival;
1442: cc = getoa(ob3,5).lc.ival; ll = getoa(ob3,6).lc.ival;
1443: mm = getoa(ob3,7).lc.ival; nn = getoa(ob3,8).lc.ival;
1444: if (checkRelations(c,l,m,n,cc,ll,mm,nn,n)) {
1445: errorKan1("%s\n","1<=c<=l<=m<=n and cc<=c<=ll<=l<=mm<=m<=nn<=n \nand (cc<c or ll < l or mm < m or nn < n) must be satisfied.");
1446: }
1447: if (getoaSize(ob2) != n || getoaSize(ob1) != n) {
1448: errorKan1("%s\n","Error in the 1st or 2nd arguments.");
1449: }
1450: for (i=0; i<n; i++) {
1451: if (getoa(ob1,i).tag != Sdollar || getoa(ob2,i).tag != Sdollar) {
1452: errorKan1("%s\n","Error in the 1st or 2nd arguments.");
1453: }
1454: }
1455: xvars = (char **) sGC_malloc(sizeof(char *)*n);
1456: dvars = (char **) sGC_malloc(sizeof(char *)*n);
1457: if (xvars == (char **)NULL || dvars == (char **)NULL) {
1458: fprintf(stderr,"No more memory.\n");
1459: exit(15);
1460: }
1461: for (i=0; i<n; i++) {
1462: xvars[i] = getoa(ob1,i).lc.str;
1463: dvars[i] = getoa(ob2,i).lc.str;
1464: }
1465: checkDuplicateName(xvars,dvars,n);
1466:
1467: outputVars = (int *)sGC_malloc(sizeof(int)*n*2);
1468: if (outputVars == NULL) {
1469: fprintf(stderr,"No more memory.\n");
1470: exit(15);
1471: }
1472: if (ReverseOutputOrder) {
1473: for (i=0; i<n; i++) outputVars[i] = n-i-1;
1474: for (i=0; i<n; i++) outputVars[n+i] = 2*n-i-1;
1475: }else{
1476: for (i=0; i<2*n; i++) {
1477: outputVars[i] = i;
1478: }
1479: }
1480:
1481: oasize = getoaSize(ob4);
1482: order = (int *)sGC_malloc(sizeof(int)*((2*n)*oasize+1));
1483: if (order == (int *)NULL) errorKan1("%s\n","No memory.");
1484: if (objArrayToOrderMatrix(ob4,order,n,oasize) == -1) {
1485: errorKan1("%s\n","Errors in the 4th matrix (order matrix).");
1486: }
1487: /* It's better to check the consistency of the order matrix here. */
1488: savedCurrentRingp = CurrentRingp;
1489:
1490: newRingp = (struct ring *)sGC_malloc(sizeof(struct ring));
1491: if (newRingp == NULL) errorKan1("%s\n","No more memory.");
1492: /* Generate the new ring before calling setOrder...(). */
1493: *newRingp = *CurrentRingp;
1494: CurrentRingp = newRingp; /* Push the current ring. */
1495: setOrderByMatrix(order,n,c,l,oasize); /* set order to the CurrentRing. */
1496: CurrentRingp = savedCurrentRingp; /* recover it. */
1497:
1498:
1499: /* Set the default name of the ring */
1500: ringName = (char *)sGC_malloc(16);
1501: sprintf(ringName,"ring%05d",ringSerial);
1502: ringSerial++;
1503:
1504: /* Set the current ring */
1505: newRingp->n = n; newRingp->m = m; newRingp->l = l; newRingp->c = c;
1506: newRingp->nn = nn; newRingp->mm = mm; newRingp->ll = ll;
1507: newRingp->cc = cc;
1508: newRingp->x = xvars;
1509: newRingp->D = dvars;
1510: /* You don't need to set order and orderMatrixSize here.
1511: It was set by setOrder(). */
1512: setFromTo(newRingp);
1513:
1514: newRingp->p = p;
1515: newRingp->next = nextRing;
1516: newRingp->multiplication = mpMult;
1517: /* These values should will be reset if the optional value is given. */
1518: newRingp->schreyer = 0;
1519: newRingp->gbListTower = NULL;
1520: newRingp->outputOrder = outputVars;
1521:
1522: if (ob5.tag != Sarray || (getoaSize(ob5) % 2) != 0) {
1523: errorKan1("%s\n","[(keyword) value (keyword) value ....] should be given.");
1524: }
1525: for (i=0; i < getoaSize(ob5); i += 2) {
1526: if (getoa(ob5,i).tag == Sdollar) {
1527: if (strcmp(KopString(getoa(ob5,i)),"mpMult") == 0) {
1528: if (getoa(ob5,i+1).tag != Sdollar) {
1529: errorKan1("%s\n","A keyword should be given. (mpMult)");
1530: }
1531: fmp_mult_saved = F_mpMult;
1532: mpMultName = KopString(getoa(ob5,i+1));
1533: switch_function("mpMult",mpMultName);
1534: /* Note that this cause a global effect. It will be done again. */
1535: newRingp->multiplication = mpMult;
1536: switch_function("mpMult",fmp_mult_saved);
1537: } else if (strcmp(KopString(getoa(ob5,i)),"coefficient ring") == 0) {
1538: if (getoa(ob5,i+1).tag != Sring) {
1539: errorKan1("%s\n","The pointer to a ring should be given. (coefficient ring)");
1540: }
1541: nextRing = KopRingp(getoa(ob5,i+1));
1542: newRingp->next = nextRing;
1543: } else if (strcmp(KopString(getoa(ob5,i)),"valuation") == 0) {
1544: errorKan1("%s\n","Not implemented. (valuation)");
1545: } else if (strcmp(KopString(getoa(ob5,i)),"characteristic") == 0) {
1546: if (getoa(ob5,i+1).tag != Sinteger) {
1547: errorKan1("%s\n","A integer should be given. (characteristic)");
1548: }
1549: p = KopInteger(getoa(ob5,i+1));
1550: newRingp->p = p;
1551: } else if (strcmp(KopString(getoa(ob5,i)),"schreyer") == 0) {
1552: if (getoa(ob5,i+1).tag != Sinteger) {
1553: errorKan1("%s\n","A integer should be given. (schreyer)");
1554: }
1555: newRingp->schreyer = KopInteger(getoa(ob5,i+1));
1556: } else if (strcmp(KopString(getoa(ob5,i)),"gbListTower") == 0) {
1557: if (getoa(ob5,i+1).tag != Slist) {
1558: errorKan1("%s\n","A list should be given (gbListTower).");
1559: }
1560: newRingp->gbListTower = newObject();
1561: *((struct object *)(newRingp->gbListTower)) = getoa(ob5,i+1);
1562: } else if (strcmp(KopString(getoa(ob5,i)),"ringName") == 0) {
1563: if (getoa(ob5,i+1).tag != Sdollar) {
1564: errorKan1("%s\n","A name should be given. (ringName)");
1565: }
1566: ringName = KopString(getoa(ob5,i+1));
1567: } else {
1568: errorKan1("%s\n","Unknown keyword to set_up_ring@");
1569: }
1570: }else{
1571: errorKan1("%s\n","A keyword enclosed by braces have to be given.");
1572: }
1573: }
1574:
1575: newRingp->name = ringName;
1576:
1577:
1578: if (AvoidTheSameRing) {
1579: aa = isTheSameRing(rstack,rp,newRingp);
1580: if (aa < 0) {
1581: /* This ring has never been defined. */
1582: CurrentRingp = newRingp;
1583: /* Install it to the RingStack */
1584: if (rp <RP_LIMIT) {
1585: rstack[rp] = CurrentRingp; rp++; /* Save the previous ringp */
1586: }else{
1587: rp = 0;
1588: errorKan1("%s\n","You have defined too many rings. Check the value of RP_LIMIT.");
1589: }
1590: }else{
1591: /* This ring has been defined. */
1592: /* Discard the newRingp */
1593: CurrentRingp = rstack[aa];
1594: ringSerial--;
1595: }
1596: }else{
1597: CurrentRingp = newRingp;
1598: /* Install it to the RingStack */
1599: if (rp <RP_LIMIT) {
1600: rstack[rp] = CurrentRingp; rp++; /* Save the previous ringp */
1601: }else{
1602: rp = 0;
1603: errorKan1("%s\n","You have defined too many rings. Check the value of RP_LIMIT.");
1604: }
1605: }
1606: if (mpMultName != NULL) {
1607: switch_function("mpMult",mpMultName);
1608: }
1609:
1610: initSyzRingp();
1611:
1612: return(0);
1613: }
1614:
1615:
1616: struct object KsetVariableNames(struct object ob,struct ring *rp)
1617: {
1618: int n,i;
1619: struct object ox;
1620: struct object otmp;
1621: char **xvars;
1622: char **dvars;
1623: if (ob.tag != Sarray) {
1624: errorKan1("%s\n","KsetVariableNames(): the argument must be of the form [(x) (y) (z) ...]");
1625: }
1626: n = rp->n;
1627: ox = ob;
1628: if (getoaSize(ox) != 2*n) {
1629: errorKan1("%s\n","KsetVariableNames(): the argument must be of the form [(x) (y) (z) ...] and the length of [(x) (y) (z) ...] must be equal to the number of x and D variables.");
1630: }
1631: xvars = (char **)sGC_malloc(sizeof(char *)*n);
1632: dvars = (char **)sGC_malloc(sizeof(char *)*n);
1633: if (xvars == NULL || dvars == NULL) {
1634: errorKan1("%s\n","KsetVariableNames(): no more memory.");
1635: }
1636: for (i=0; i<2*n; i++) {
1637: otmp = getoa(ox,i);
1638: if(otmp.tag != Sdollar) {
1639: errorKan1("%s\n","KsetVariableNames(): elements must be strings.");
1640: }
1641: if (i < n) {
1642: xvars[i] = KopString(otmp);
1643: }else{
1644: dvars[i-n] = KopString(otmp);
1645: }
1646: }
1647: checkDuplicateName(xvars,dvars,n);
1648: rp->x = xvars;
1649: rp->D = dvars;
1650: return(ob);
1651: }
1652:
1653:
1654:
1655: void KshowRing(ringp)
1656: struct ring *ringp;
1657: {
1658: showRing(1,ringp);
1659: }
1660:
1661: struct object KswitchFunction(ob1,ob2)
1662: struct object ob1,ob2;
1663: {
1664: char *ans ;
1665: struct object rob;
1666: int needWarningForAvoidTheSameRing = 0;
1667: extern int AvoidTheSameRing;
1668: if ((ob1.tag != Sdollar) || (ob2.tag != Sdollar)) {
1669: errorKan1("%s\n","$function$ $name$ switch_function\n");
1670: }
1671: if (AvoidTheSameRing && needWarningForAvoidTheSameRing) {
1672: if (strcmp(KopString(ob1),"mmLarger") == 0 ||
1673: strcmp(KopString(ob1),"mpMult") == 0 ||
1674: strcmp(KopString(ob1),"monomialAdd") == 0 ||
1675: strcmp(KopString(ob1),"isSameComponent") == 0) {
1676: fprintf(stderr,",switch_function ==> %s ",KopString(ob1));
1677: warningKan("switch_function might cause a trouble under AvoidTheSameRing == 1.\n");
1678: }
1679: }
1680: if (AvoidTheSameRing) {
1681: if (strcmp(KopString(ob1),"mmLarger") == 0 &&
1682: strcmp(KopString(ob2),"matrix") != 0) {
1683: fprintf(stderr,"mmLarger = %s",KopString(ob2));
1684: errorKan1("%s\n","mmLarger can set only to matrix under AvoidTheSameRing == 1.");
1685: }
1686: }
1687:
1688: ans = switch_function(ob1.lc.str,ob2.lc.str);
1689: if (ans == NULL) {
1690: rob = NullObject;
1691: }else{
1692: rob = KpoString(ans);
1693: }
1694: return(rob);
1695:
1696: }
1697:
1698: void KprintSwitchStatus(void)
1699: {
1700: print_switch_status();
1701: }
1702:
1703: struct object KoReplace(of,rule)
1704: struct object of;
1705: struct object rule;
1706: {
1707: struct object rob;
1708: POLY f;
1709: POLY lRule[N0*2];
1710: POLY rRule[N0*2];
1711: POLY r;
1712: int i;
1713: int n;
1714: struct object trule;
1715:
1716:
1717: if (rule.tag != Sarray) {
1718: errorKan1("%s\n"," KoReplace(): The second argument must be array.");
1719: }
1720: n = getoaSize(rule);
1721:
1722: if (of.tag != Spoly) {
1723: errorKan1("%s\n"," KoReplace(): The first argument must be a polynomial.");
1724: }
1725: f = KopPOLY(of);
1726:
1727: if (f ISZERO) {
1728: }else{
1729: if (n >= 2*(f->m->ringp->n)) {
1730: errorKan1("%s\n"," KoReplace(): too many rules for replacement. ");
1731: }
1732: }
1733:
1734: for (i=0; i<n; i++) {
1735: trule = getoa(rule,i);
1736: if (trule.tag != Sarray) {
1737: errorKan1("%s\n"," KoReplace(): The second argument must be of the form [[a b] [c d] ....].");
1738: }
1739: if (getoaSize(trule) != 2) {
1740: errorKan1("%s\n"," KoReplace(): The second argument must be of the form [[a b] [c d] ....].");
1741: }
1742:
1743: if (getoa(trule,0).tag != Spoly) {
1744: errorKan1("%s\n"," KoReplace(): The second argument must be of the form [[a b] [c d] ....] where a,b,c,d,... are polynomials.");
1745: }
1746: if (getoa(trule,1).tag != Spoly) {
1747: errorKan1("%s\n"," KoReplace(): The second argument must be of the form [[a b] [c d] ....] where a,b,c,d,... are polynomials.");
1748: }
1749:
1750: lRule[i] = KopPOLY(getoa(trule,0));
1751: rRule[i] = KopPOLY(getoa(trule,1));
1752: }
1753:
1754: r = replace(f,lRule,rRule,n);
1755: rob.tag = Spoly; rob.lc.poly = r;
1756:
1757: return(rob);
1758: }
1759:
1760:
1761: struct object Kparts(f,v)
1762: struct object f;
1763: struct object v;
1764: {
1765: POLY ff;
1766: POLY vv;
1767: struct object obj;
1768: struct matrixOfPOLY *co;
1769: /* check the data type */
1770: if (f.tag != Spoly || v.tag != Spoly)
1771: errorKan1("%s\n","arguments of Kparts() must have polynomial as arguments.");
1772:
1773: co = parts(KopPOLY(f),KopPOLY(v));
1774: obj = matrixOfPOLYToArray(co);
1775: return(obj);
1776: }
1777:
1778: struct object Kparts2(f,v)
1779: struct object f;
1780: struct object v;
1781: {
1782: POLY ff;
1783: POLY vv;
1784: struct object obj;
1785: struct matrixOfPOLY *co;
1786: /* check the data type */
1787: if (f.tag != Spoly || v.tag != Spoly)
1788: errorKan1("%s\n","arguments of Kparts2() must have polynomial as arguments.");
1789:
1790: obj = parts2(KopPOLY(f),KopPOLY(v));
1791: return(obj);
1792: }
1793:
1794:
1795: struct object Kdegree(ob1,ob2)
1796: struct object ob1,ob2;
1797: {
1798: if (ob1.tag != Spoly || ob2.tag != Spoly)
1799: errorKan1("%s\n","The arguments must be polynomials.");
1800:
1801: return(KpoInteger(pDegreeWrtV(KopPOLY(ob1),KopPOLY(ob2))));
1802: }
1803:
1804: struct object KringMap(obj)
1805: struct object obj;
1806: {
1807: extern struct ring *CurrentRingp;
1808: extern struct ring *SyzRingp;
1809: POLY f;
1810: POLY r;
1811: if (obj.tag != Spoly)
1812: errorKan1("%s\n","The argments must be polynomial.");
1813: f = KopPOLY(obj);
1814: if (f ISZERO) return(obj);
1815: if (f->m->ringp == CurrentRingp) return(obj);
1816: if (f->m->ringp == CurrentRingp->next) {
1817: r = newCell(newCoeff(),newMonomial(CurrentRingp));
1818: r->coeffp->tag = POLY_COEFF;
1819: r->coeffp->val.f = f;
1820: return(KpoPOLY(r));
1821: }else if (f->m->ringp == SyzRingp) {
1822: return(KpoPOLY(f->coeffp->val.f));
1823: }
1824: errorKan1("%s\n","The ring map is not defined in this case.");
1825: }
1826:
1827:
1828: struct object Ksp(ob1,ob2)
1829: struct object ob1,ob2;
1830: {
1831: struct spValue sv;
1832: struct object rob,cob;
1833: POLY f;
1834: if (ob1.tag != Spoly || ob2.tag != Spoly)
1835: errorKan1("%s\n","Ksp(): The arguments must be polynomials.");
1836: sv = (*sp)(ob1.lc.poly,ob2.lc.poly);
1837: f = ppAddv(ppMult(sv.a,KopPOLY(ob1)),
1838: ppMult(sv.b,KopPOLY(ob2)));
1839: rob = newObjectArray(2);
1840: cob = newObjectArray(2);
1841: putoa(rob,1,KpoPOLY(f));
1842: putoa(cob,0,KpoPOLY(sv.a));
1843: putoa(cob,1,KpoPOLY(sv.b));
1844: putoa(rob,0,cob);
1845: return(rob);
1846: }
1847:
1848: struct object Khead(ob)
1849: struct object ob;
1850: {
1851: if (ob.tag != Spoly) errorKan1("%s\n","Khead(): The argument should be a polynomial.");
1852: return(KpoPOLY(head( KopPOLY(ob))));
1853: }
1854:
1855:
1856: /* :eval */
1857: struct object Keval(obj)
1858: struct object obj;
1859: {
1860: char *key;
1861: int size;
1862: struct object rob;
1863: rob = NullObject;
1864:
1865: if (obj.tag != Sarray)
1866: errorKan1("%s\n","[$key$ arguments] eval");
1867: if (getoaSize(obj) < 1)
1868: errorKan1("%s\n","[$key$ arguments] eval");
1869: if (getoa(obj,0).tag != Sdollar)
1870: errorKan1("%s\n","[$key$ arguments] eval");
1871: key = getoa(obj,0).lc.str;
1872: size = getoaSize(obj);
1873:
1874:
1875: return(rob);
1876: }
1877:
1878: /* :Utilities */
1879: char *KremoveSpace(str)
1880: char str[];
1881: {
1882: int size;
1883: int start;
1884: int end;
1885: char *s;
1886: int i;
1887:
1888: size = strlen(str);
1889: for (start = 0; start <= size; start++) {
1890: if (str[start] > ' ') break;
1891: }
1892: for (end = size-1; end >= 0; end--) {
1893: if (str[end] > ' ') break;
1894: }
1895: if (start > end) return((char *) NULL);
1896: s = (char *) sGC_malloc(sizeof(char)*(end-start+2));
1897: if (s == (char *)NULL) errorKan1("%s\n","removeSpace(): No more memory.");
1898: for (i=0; i< end-start+1; i++)
1899: s[i] = str[i+start];
1900: s[end-start+1] = '\0';
1901: return(s);
1902: }
1903:
1904: struct object KtoRecords(ob)
1905: struct object ob;
1906: {
1907: struct object obj;
1908: struct object tmp;
1909: int i;
1910: int size;
1911: char **argv;
1912:
1913: obj = NullObject;
1914: switch(ob.tag) {
1915: case Sdollar: break;
1916: default:
1917: errorKan1("%s","Argument of KtoRecords() must be a string enclosed by dollars.\n");
1918: break;
1919: }
1920: size = strlen(ob.lc.str)+3;
1921: argv = (char **) sGC_malloc((size+1)*sizeof(char *));
1922: if (argv == (char **)NULL)
1923: errorKan1("%s","No more memory.\n");
1924: size = KtoArgvbyCurryBrace(ob.lc.str,argv,size);
1925: if (size < 0)
1926: errorKan1("%s"," KtoRecords(): You have an error in the argument.\n");
1927:
1928: obj = newObjectArray(size);
1929: for (i=0; i<size; i++) {
1930: tmp.tag = Sdollar;
1931: tmp.lc.str = argv[i];
1932: (obj.rc.op)[i] = tmp;
1933: }
1934: return(obj);
1935: }
1936:
1937: int KtoArgvbyCurryBrace(str,argv,limit)
1938: char *str;
1939: char *argv[];
1940: int limit;
1941: /* This function returns argc */
1942: /* decompose into tokens by the separators
1943: { }, [ ], and characters of which code is less than SPACE.
1944: Example. { } ---> nothing (argc=0)
1945: {x}----> x (argc=1)
1946: {x,y} --> x y (argc=2)
1947: {ab, y, z } --> ab y z (argc=3)
1948: [[ab],c,d] --> [ab] c d
1949: */
1950: {
1951: int argc;
1952: int n;
1953: int i;
1954: int k;
1955: char *a;
1956: char *ident;
1957: int level = 0;
1958: int comma;
1959:
1960: if (str == (char *)NULL) {
1961: fprintf(stderr,"You use NULL string to toArgvbyCurryBrace()\n");
1962: return(0);
1963: }
1964:
1965: n = strlen(str);
1966: a = (char *) sGC_malloc(sizeof(char)*(n+3));
1967: a[0]=' ';
1968: strcpy(&(a[1]),str);
1969: n = strlen(a); a[0] = '\0';
1970: comma = -1;
1971: for (i=1; i<n; i++) {
1972: if (a[i] == '{' || a[i] == '[') level++;
1973: if (level <= 1 && ( a[i] == ',')) {a[i] = '\0'; ++comma;}
1974: if (level <= 1 && (a[i]=='{' || a[i]=='}' || a[i]=='[' || a[i]==']'))
1975: a[i] = '\0';
1976: if (a[i] == '}' || a[i] == ']') level--;
1977: if ((level <= 1) && (comma == -1) && ( a[i] > ' ')) comma = 0;
1978: }
1979:
1980: if (comma == -1) return(0);
1981:
1982: argc=0;
1983: for (i=0; i<n; i++) {
1984: if ((a[i] == '\0') && (a[i+1] != '\0')) ++argc;
1985: }
1986: if (argc > limit) return(-argc);
1987:
1988: k = 0;
1989: for (i=0; i<n; i++) {
1990: if ((a[i] == '\0') && (a[i+1] != '\0')) {
1991: ident = (char *) sGC_malloc(sizeof(char)*( strlen(&(a[i+1])) + 3));
1992: strcpy(ident,&(a[i+1]));
1993: argv[k] = KremoveSpace(ident);
1994: if (argv[k] != (char *)NULL) k++;
1995: if (k >= limit) errorKan1("%s\n","KtoArgvbyCurryBraces(): k>=limit.");
1996: }
1997: }
1998: argc = k;
1999: /*for (i=0; i<argc; i++) fprintf(stderr,"%d %s\n",i,argv[i]);*/
2000: return(argc);
2001: }
2002:
2003:
2004: static void checkDuplicateName(xvars,dvars,n)
2005: char *xvars[];
2006: char *dvars[];
2007: int n;
2008: {
2009: int i,j;
2010: char *names[N0*2];
2011: for (i=0; i<n; i++) {
2012: names[i] = xvars[i]; names[i+n] = dvars[i];
2013: }
2014: n = 2*n;
2015: for (i=0; i<n; i++) {
2016: for (j=i+1; j<n; j++) {
2017: if (strcmp(names[i],names[j]) == 0) {
2018: fprintf(stderr,"\n%d=%s, %d=%s\n",i,names[i],j,names[j]);
2019: errorKan1("%s\n","Duplicate definition of the name above in SetUpRing().");
2020: }
2021: }
2022: }
2023: }
2024:
2025:
2026:
2027:
2028: struct object KooDiv2(ob1,ob2)
2029: struct object ob1,ob2;
2030: {
2031: struct object rob = NullObject;
2032: POLY f;
2033: extern struct ring *CurrentRingp;
2034: int s,i;
2035: double d;
2036:
2037: switch (Lookup[ob1.tag][ob2.tag]) {
2038: case SpolySpoly:
2039: case SuniversalNumberSuniversalNumber:
2040: case SuniversalNumberSpoly:
2041: case SpolySuniversalNumber:
2042: rob = KnewRationalFunction0(copyObjectp(&ob1),copyObjectp(&ob2));
2043: KisInvalidRational(&rob);
2044: return(rob);
2045: break;
2046: case SarraySpoly:
2047: case SarraySuniversalNumber:
2048: case SarraySrationalFunction:
2049: s = getoaSize(ob1);
2050: rob = newObjectArray(s);
2051: for (i=0; i<s; i++) {
2052: putoa(rob,i,KooDiv2(getoa(ob1,i),ob2));
2053: }
2054: return(rob);
2055: break;
2056: case SpolySrationalFunction:
2057: case SrationalFunctionSpoly:
2058: case SrationalFunctionSrationalFunction:
2059: case SuniversalNumberSrationalFunction:
2060: case SrationalFunctionSuniversalNumber:
2061: rob = KoInverse(ob2);
2062: rob = KooMult(ob1,rob);
2063: return(rob);
2064: break;
2065:
2066: case SdoubleSdouble:
2067: d = KopDouble(ob2);
2068: if (d == 0.0) errorKan1("%s\n","KooDiv2, Division by zero.");
2069: return(KpoDouble( KopDouble(ob1) / d ));
2070: break;
2071: case SdoubleSinteger:
2072: case SdoubleSuniversalNumber:
2073: case SdoubleSrationalFunction:
2074: d = toDouble0(ob2);
2075: if (d == 0.0) errorKan1("%s\n","KooDiv2, Division by zero.");
2076: return(KpoDouble( KopDouble(ob1) / d) );
2077: break;
2078: case SintegerSdouble:
2079: case SuniversalNumberSdouble:
2080: case SrationalFunctionSdouble:
2081: d = KopDouble(ob2);
2082: if (d == 0.0) errorKan1("%s\n","KooDiv2, Division by zero.");
2083: return(KpoDouble( toDouble0(ob1) / d ) );
2084: break;
2085:
2086: default:
2087: warningKan("KooDiv2() has not supported yet these objects.\n");
2088: break;
2089: }
2090: return(rob);
2091: }
2092: /* Template
2093: case SrationalFunctionSrationalFunction:
2094: warningKan("Koo() has not supported yet these objects.\n");
2095: return(rob);
2096: break;
2097: case SpolySrationalFunction:
2098: warningKan("Koo() has not supported yet these objects.\n");
2099: return(rob);
2100: break;
2101: case SrationalFunctionSpoly:
2102: warningKan("Koo() has not supported yet these objects.\n");
2103: return(rob);
2104: break;
2105: case SuniversalNumberSrationalFunction:
2106: warningKan("Koo() has not supported yet these objects.\n");
2107: return(rob);
2108: break;
2109: case SrationalFunctionSuniversalNumber:
2110: warningKan("Koo() has not supported yet these objects.\n");
2111: return(rob);
2112: break;
2113: */
2114:
2115: int KisInvalidRational(op)
2116: objectp op;
2117: {
2118: extern struct coeff *UniversalZero;
2119: if (op->tag != SrationalFunction) return(0);
2120: if (KisZeroObject(Kdenominator(*op))) {
2121: errorKan1("%s\n","KisInvalidRational(): zero division. You have f/0.");
2122: }
2123: if (KisZeroObject(Knumerator(*op))) {
2124: op->tag = SuniversalNumber;
2125: op->lc.universalNumber = UniversalZero;
2126: }
2127: return(0);
2128: }
2129:
2130: struct object KgbExtension(struct object obj)
2131: {
2132: char *key;
2133: int size;
2134: struct object keyo;
2135: struct object rob = NullObject;
2136: struct object obj1,obj2,obj3;
2137: POLY f1;
2138: POLY f2;
2139: POLY f3;
2140: POLY f;
2141: int m,i;
2142: struct pairOfPOLY pf;
2143:
2144: if (obj.tag != Sarray) errorKan1("%s\n","KgbExtension(): The argument must be an array.");
2145: size = getoaSize(obj);
2146: if (size < 1) errorKan1("%s\n","KgbExtension(): Empty array.");
2147: keyo = getoa(obj,0);
2148: if (keyo.tag != Sdollar) errorKan1("%s\n","KgbExtension(): No key word.");
2149: key = KopString(keyo);
2150:
2151: /* branch by the key word. */
2152: if (strcmp(key,"isReducible")==0) {
2153: if (size != 3) errorKan1("%s\n","[(isReducible) poly1 poly2] gbext.");
2154: obj1 = getoa(obj,1);
2155: obj2 = getoa(obj,2);
2156: if (obj1.tag != Spoly || obj2.tag != Spoly)
2157: errorKan1("%s\n","[(isReducible) poly1 poly2] gb.");
2158: f1 = KopPOLY(obj1);
2159: f2 = KopPOLY(obj2);
2160: rob = KpoInteger((*isReducible)(f1,f2));
2161: }else if (strcmp(key,"lcm") == 0) {
2162: if (size != 3) errorKan1("%s\n","[(lcm) poly1 poly2] gb.");
2163: obj1 = getoa(obj,1);
2164: obj2 = getoa(obj,2);
2165: if (obj1.tag != Spoly || obj2.tag != Spoly)
2166: errorKan1("%s\n","[(lcm) poly1 poly2] gbext.");
2167: f1 = KopPOLY(obj1);
2168: f2 = KopPOLY(obj2);
2169: rob = KpoPOLY((*lcm)(f1,f2));
2170: }else if (strcmp(key,"grade")==0) {
2171: if (size != 2) errorKan1("%s\n","[(grade) poly1 ] gbext.");
2172: obj1 = getoa(obj,1);
2173: if (obj1.tag != Spoly)
2174: errorKan1("%s\n","[(grade) poly1 ] gbext.");
2175: f1 = KopPOLY(obj1);
2176: rob = KpoInteger((*grade)(f1));
2177: }else if (strcmp(key,"mod")==0) {
2178: if (size != 3) errorKan1("%s\n","[(mod) poly num] gbext");
2179: obj1 = getoa(obj,1);
2180: obj2 = getoa(obj,2);
2181: if (obj1.tag != Spoly || obj2.tag != SuniversalNumber) {
2182: errorKan1("%s\n","The datatype of the argument mismatch: [(mod) polynomial universalNumber] gbext");
2183: }
2184: rob = KpoPOLY( modulopZ(KopPOLY(obj1),KopUniversalNumber(obj2)) );
2185: }else if (strcmp(key,"tomodp")==0) {
2186: /* The ring must be a ring of characteristic p. */
2187: if (size != 3) errorKan1("%s\n","[(tomod) poly ring] gbext");
2188: obj1 = getoa(obj,1);
2189: obj2 = getoa(obj,2);
2190: if (obj1.tag != Spoly || obj2.tag != Sring) {
2191: errorKan1("%s\n","The datatype of the argument mismatch: [(tomod) polynomial ring] gbext");
2192: }
2193: rob = KpoPOLY( modulop(KopPOLY(obj1),KopRingp(obj2)) );
2194: }else if (strcmp(key,"tomod0")==0) {
2195: /* Ring must be a ring of characteristic 0. */
2196: if (size != 3) errorKan1("%s\n","[(tomod0) poly ring] gbext");
2197: obj1 = getoa(obj,1);
2198: obj2 = getoa(obj,2);
2199: if (obj1.tag != Spoly || obj2.tag != Sring) {
2200: errorKan1("%s\n","The datatype of the argument mismatch: [(tomod0) polynomial ring] gbext");
2201: }
2202: errorKan1("%s\n","It has not been implemented.");
2203: rob = KpoPOLY( POLYNULL );
2204: }else if (strcmp(key,"divByN")==0) {
2205: if (size != 3) errorKan1("%s\n","[(divByN) poly num] gbext");
2206: obj1 = getoa(obj,1);
2207: obj2 = getoa(obj,2);
2208: if (obj1.tag != Spoly || obj2.tag != SuniversalNumber) {
2209: errorKan1("%s\n","The datatype of the argument mismatch: [(divByN) polynomial universalNumber] gbext");
2210: }
2211: pf = quotientByNumber(KopPOLY(obj1),KopUniversalNumber(obj2));
2212: rob = newObjectArray(2);
2213: putoa(rob,0,KpoPOLY(pf.first));
2214: putoa(rob,1,KpoPOLY(pf.second));
2215: }else if (strcmp(key,"isConstant")==0) {
2216: if (size != 2) errorKan1("%s\n","[(isConstant) poly ] gbext bool");
2217: obj1 = getoa(obj,1);
2218: if (obj1.tag != Spoly) {
2219: errorKan1("%s\n","The datatype of the argument mismatch: [(isConstant) polynomial] gbext");
2220: }
2221: return(KpoInteger(isConstant(KopPOLY(obj1))));
2222: }else if (strcmp(key,"schreyerSkelton") == 0) {
2223: if (size != 2) errorKan1("%s\n","[(schreyerSkelton) array_of_poly ] gbext array");
2224: obj1 = getoa(obj,1);
2225: return(KschreyerSkelton(obj1));
2226: }else if (strcmp(key,"lcoeff") == 0) {
2227: if (size != 2) errorKan1("%s\n","[(lcoeff) poly] gbext poly");
2228: obj1 = getoa(obj,1);
2229: if (obj1.tag != Spoly) errorKan1("%s\n","[(lcoeff) poly] gbext poly");
2230: f = KopPOLY(obj1);
2231: if (f == POLYNULL) return(KpoPOLY(f));
2232: return(KpoPOLY( newCell(coeffCopy(f->coeffp),newMonomial(f->m->ringp))));
2233: }else if (strcmp(key,"lmonom") == 0) {
2234: if (size != 2) errorKan1("%s\n","[(lmonom) poly] gbext poly");
2235: obj1 = getoa(obj,1);
2236: if (obj1.tag != Spoly) errorKan1("%s\n","[(lmonom) poly] gbext poly");
2237: f = KopPOLY(obj1);
2238: if (f == POLYNULL) return(KpoPOLY(f));
2239: return(KpoPOLY( newCell(intToCoeff(1,f->m->ringp),monomialCopy(f->m))));
2240: }else if (strcmp(key,"toes") == 0) {
2241: if (size != 2) errorKan1("%s\n","[(toes) array] gbext poly");
2242: obj1 = getoa(obj,1);
2243: if (obj1.tag != Sarray) errorKan1("%s\n","[(toes) array] gbext poly");
2244: return(KvectorToSchreyer_es(obj1));
2245: }else if (strcmp(key,"isOrdered") == 0) {
2246: if (size != 2) errorKan1("%s\n","[(isOrdered) poly] gbext poly");
2247: obj1 = getoa(obj,1);
2248: if (obj1.tag != Spoly) errorKan1("%s\n","[(isOrdered) poly] gbext poly");
2249: return(KisOrdered(obj1));
2250: }else {
2251: errorKan1("%s\n","gbext : unknown tag.");
2252: }
2253: return(rob);
2254: }
2255:
2256: struct object KmpzExtension(struct object obj)
2257: {
2258: char *key;
2259: int size;
2260: struct object keyo;
2261: struct object rob = NullObject;
2262: struct object obj0,obj1,obj2,obj3;
2263: MP_INT *f;
2264: MP_INT *g;
2265: MP_INT *h;
2266: MP_INT *r0;
2267: MP_INT *r1;
2268: MP_INT *r2;
2269: int gi;
2270: extern struct ring *SmallRingp;
2271:
2272:
2273: if (obj.tag != Sarray) errorKan1("%s\n","KmpzExtension(): The argument must be an array.");
2274: size = getoaSize(obj);
2275: if (size < 1) errorKan1("%s\n","KmpzExtension(): Empty array.");
2276: keyo = getoa(obj,0);
2277: if (keyo.tag != Sdollar) errorKan1("%s\n","KmpzExtension(): No key word.");
2278: key = KopString(keyo);
2279:
2280: /* branch by the key word. */
2281: if (strcmp(key,"gcd")==0) {
2282: if (size != 3) errorKan1("%s\n","[(gcd) universalNumber universalNumber] mpzext.");
2283: obj1 = getoa(obj,1);
2284: obj2 = getoa(obj,2);
2285: if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber)
2286: errorKan1("%s\n","[(gcd) universalNumber universalNumber] mpzext.");
2287: if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) ||
2288: ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) {
2289: errorKan1("%s\n","[(gcd) universalNumber universalNumber] mpzext.");
2290: }
2291: f = coeff_to_MP_INT(obj1.lc.universalNumber);
2292: g = coeff_to_MP_INT(obj2.lc.universalNumber);
2293: r1 = newMP_INT();
2294: mpz_gcd(r1,f,g);
2295: rob.tag = SuniversalNumber;
2296: rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
2297: }else if (strcmp(key,"tdiv_qr")==0) {
2298: if (size != 3) errorKan1("%s\n","[(tdiv_qr) universalNumber universalNumber] mpzext.");
2299: obj1 = getoa(obj,1);
2300: obj2 = getoa(obj,2);
2301: if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber)
2302: errorKan1("%s\n","[(tdiv_qr) universalNumber universalNumber] mpzext.");
2303: if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) ||
2304: ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) {
2305: errorKan1("%s\n","[(tdiv_qr) universalNumber universalNumber] mpzext.");
2306: }
2307: f = coeff_to_MP_INT(obj1.lc.universalNumber);
2308: g = coeff_to_MP_INT(obj2.lc.universalNumber);
2309: r1 = newMP_INT();
2310: r2 = newMP_INT();
2311: mpz_tdiv_qr(r1,r2,f,g);
2312: obj1.tag = SuniversalNumber;
2313: obj1.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
2314: obj2.tag = SuniversalNumber;
2315: obj2.lc.universalNumber = mpintToCoeff(r2,SmallRingp);
2316: rob = newObjectArray(2);
2317: putoa(rob,0,obj1); putoa(rob,1,obj2);
2318: } else if (strcmp(key,"cancel")==0) {
2319: if (size != 2) {
2320: errorKan1("%s\n","[(cancel) universalNumber/universalNumber] mpzext.");
2321: }
2322: obj0 = getoa(obj,1);
2323: if (obj0.tag == SuniversalNumber) return(obj0);
2324: if (obj0.tag != SrationalFunction) {
2325: errorKan1("%s\n","[(cancel) universalNumber/universalNumber] mpzext.");
2326: return(obj0);
2327: }
2328: obj1 = *(Knumerator(obj0));
2329: obj2 = *(Kdenominator(obj0));
2330: if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber) {
2331: errorKan1("%s\n","[(cancel) universalNumber/universalNumber] mpzext.");
2332: return(obj0);
2333: }
2334: if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) ||
2335: ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) {
2336: errorKan1("%s\n","[(cancel) universalNumber/universalNumber] mpzext.");
2337: }
2338: f = coeff_to_MP_INT(obj1.lc.universalNumber);
2339: g = coeff_to_MP_INT(obj2.lc.universalNumber);
2340:
2341: r0 = newMP_INT();
2342: r1 = newMP_INT();
2343: r2 = newMP_INT();
2344: mpz_gcd(r0,f,g);
2345: mpz_divexact(r1,f,r0);
2346: mpz_divexact(r2,g,r0);
2347: obj1.tag = SuniversalNumber;
2348: obj1.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
2349: obj2.tag = SuniversalNumber;
2350: obj2.lc.universalNumber = mpintToCoeff(r2,SmallRingp);
2351:
2352: rob = KnewRationalFunction0(copyObjectp(&obj1),copyObjectp(&obj2));
2353: KisInvalidRational(&rob);
2354: }else if (strcmp(key,"sqrt")==0 ||
2355: strcmp(key,"com")==0) {
2356: /* One arg functions */
2357: if (size != 2) errorKan1("%s\n","[key num] mpzext");
2358: obj1 = getoa(obj,1);
2359: if (obj1.tag != SuniversalNumber)
2360: errorKan1("%s\n","[key num] mpzext : num must be a universalNumber.");
2361: if (! is_this_coeff_MP_INT(obj1.lc.universalNumber))
2362: errorKan1("%s\n","[key num] mpzext : num must be a universalNumber.");
2363: f = coeff_to_MP_INT(obj1.lc.universalNumber);
2364: if (strcmp(key,"sqrt")==0) {
2365: r1 = newMP_INT();
2366: mpz_sqrt(r1,f);
2367: }else if (strcmp(key,"com")==0) {
2368: r1 = newMP_INT();
2369: mpz_com(r1,f);
2370: }
2371: rob.tag = SuniversalNumber;
2372: rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
2373: }else if (strcmp(key,"probab_prime_p")==0 ||
2374: strcmp(key,"and") == 0 ||
2375: strcmp(key,"ior")==0) {
2376: /* Two args functions */
2377: if (size != 3) errorKan1("%s\n","[key num1 num2] mpzext.");
2378: obj1 = getoa(obj,1);
2379: obj2 = getoa(obj,2);
2380: if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber)
2381: errorKan1("%s\n","[key num1 num2] mpzext.");
2382: if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) ||
2383: ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) {
2384: errorKan1("%s\n","[key num1 num2] mpzext.");
2385: }
2386: f = coeff_to_MP_INT(obj1.lc.universalNumber);
2387: g = coeff_to_MP_INT(obj2.lc.universalNumber);
2388: if (strcmp(key,"probab_prime_p")==0) {
2389: gi = (int) mpz_get_si(g);
2390: if (mpz_probab_prime_p(f,gi)) {
2391: rob = KpoInteger(1);
2392: }else {
2393: rob = KpoInteger(0);
2394: }
2395: }else if (strcmp(key,"and")==0) {
2396: r1 = newMP_INT();
2397: mpz_and(r1,f,g);
2398: rob.tag = SuniversalNumber;
2399: rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
2400: }else if (strcmp(key,"ior")==0) {
2401: r1 = newMP_INT();
2402: mpz_ior(r1,f,g);
2403: rob.tag = SuniversalNumber;
2404: rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
2405: }
2406:
2407: }else if (strcmp(key,"powm")==0) {
2408: /* three args */
2409: if (size != 4) errorKan1("%s\n","[key num1 num2 num3] mpzext");
2410: obj1 = getoa(obj,1); obj2 = getoa(obj,2); obj3 = getoa(obj,3);
2411: if (obj1.tag != SuniversalNumber ||
2412: obj2.tag != SuniversalNumber ||
2413: obj3.tag != SuniversalNumber ) {
2414: errorKan1("%s\n","[key num1 num2 num3] mpzext : num1, num2 and num3 must be universalNumbers.");
2415: }
2416: if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) ||
2417: ! is_this_coeff_MP_INT(obj2.lc.universalNumber) ||
2418: ! is_this_coeff_MP_INT(obj3.lc.universalNumber)) {
2419: errorKan1("%s\n","[key num1 num2 num3] mpzext : num1, num2 and num3 must be universalNumbers.");
2420: }
2421: f = coeff_to_MP_INT(obj1.lc.universalNumber);
2422: g = coeff_to_MP_INT(obj2.lc.universalNumber);
2423: h = coeff_to_MP_INT(obj3.lc.universalNumber);
2424: if (mpz_sgn(g) < 0) errorKan1("%s\n","[(powm) base exp mod] mpzext : exp must not be negative.");
2425: r1 = newMP_INT();
2426: mpz_powm(r1,f,g,h);
2427: rob.tag = SuniversalNumber;
2428: rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
2429: }else {
2430: errorKan1("%s\n","mpzExtension(): Unknown tag.");
2431: }
2432: return(rob);
2433: }
2434:
2435:
2436: /** : context */
2437: struct object KnewContext(struct object superObj,char *name) {
2438: struct context *cp;
2439: struct object ob;
2440: if (superObj.tag != Sclass) {
2441: errorKan1("%s\n","The argument of KnewContext must be a Class.Context");
2442: }
2443: if (superObj.lc.ival != CLASSNAME_CONTEXT) {
2444: errorKan1("%s\n","The argument of KnewContext must be a Class.Context");
2445: }
2446: cp = newContext0((struct context *)(superObj.rc.voidp),name);
2447: ob.tag = Sclass;
2448: ob.lc.ival = CLASSNAME_CONTEXT;
2449: ob.rc.voidp = cp;
2450: return(ob);
2451: }
2452:
2453: struct object KcreateClassIncetance(struct object ob1,
2454: struct object ob2,
2455: struct object ob3)
2456: {
2457: /* [class-tag super-obj] size [class-tag] cclass */
2458: struct object ob4;
2459: int size,size2,i;
2460: struct object ob5;
2461: struct object rob;
2462:
2463: if (ob1.tag != Sarray)
2464: errorKan1("%s\n","cclass: The first argument must be an array.");
2465: if (getoaSize(ob1) < 1)
2466: errorKan1("%s\n","cclass: The first argument must be [class-tag ....].");
2467: ob4 = getoa(ob1,0);
2468: if (ectag(ob4) != CLASSNAME_CONTEXT)
2469: errorKan1("%s\n","cclass: The first argument must be [class-tag ....].");
2470:
2471: if (ob2.tag != Sinteger)
2472: errorKan1("%s\n","cclass: The second argument must be an integer.");
2473: size = KopInteger(ob2);
2474: if (size < 1)
2475: errorKan1("%s\n","cclass: The size must be > 0.");
2476:
2477: if (ob3.tag != Sarray)
2478: errorKan1("%s\n","cclass: The third argument must be an array.");
2479: if (getoaSize(ob3) < 1)
2480: errorKan1("%s\n","cclass: The third argument must be [class-tag].");
2481: ob5 = getoa(ob3,0);
2482: if (ectag(ob5) != CLASSNAME_CONTEXT)
2483: errorKan1("%s\n","cclass: The third argument must be [class-tag].");
2484:
2485: rob = newObjectArray(size);
2486: putoa(rob,0,ob5);
2487: if (getoaSize(ob1) < size) size2 = getoaSize(ob1);
2488: else size2 = size;
2489: for (i=1; i<size2; i++) {
2490: putoa(rob,i,getoa(ob1,i));
2491: }
2492: for (i=size2; i<size; i++) {
2493: putoa(rob,i,NullObject);
2494: }
2495: return(rob);
2496: }
2497:
2498:
2499: struct object KpoDouble(double a) {
2500: struct object rob;
2501: rob.tag = Sdouble;
2502: /* rob.lc.dbl = (double *)sGC_malloc_atomic(sizeof(double)); */
2503: rob.lc.dbl = (double *)sGC_malloc(sizeof(double));
2504: if (rob.lc.dbl == (double *)NULL) {
2505: fprintf(stderr,"No memory.\n"); exit(10);
2506: }
2507: *(rob.lc.dbl) = a;
2508: return(rob);
2509: }
2510:
2511: double toDouble0(struct object ob) {
2512: double r;
2513: int r3;
2514: struct object ob2;
2515: struct object ob3;
2516: switch(ob.tag) {
2517: case Sinteger:
2518: return( (double) (KopInteger(ob)) );
2519: case SuniversalNumber:
2520: return((double) coeffToInt(ob.lc.universalNumber));
2521: case SrationalFunction:
2522: /* The argument is assumed to be a rational number. */
2523: ob2 = newObjectArray(2); ob3 = KpoString("cancel");
2524: putoa(ob2,0,ob3); putoa(ob2,1,ob);
2525: ob = KmpzExtension(ob2);
2526: ob2 = *Knumerator(ob); ob3 = *Kdenominator(ob);
2527: r3 = coeffToInt(ob3.lc.universalNumber);
2528: if (r3 == 0) {
2529: errorKan1("%s\n","toDouble0(): Division by zero.");
2530: break;
2531: }
2532: r = ((double) coeffToInt(ob2.lc.universalNumber)) / ((double)r3);
2533: return(r);
2534: case Sdouble:
2535: return( KopDouble(ob) );
2536: default:
2537: errorKan1("%s\n","toDouble0(): This type of conversion is not supported.");
2538: break;
2539: }
2540: return(0.0);
2541: }
2542:
2543: struct object KpoGradedPolySet(struct gradedPolySet *grD) {
2544: struct object rob;
2545: rob.tag = Sclass;
2546: rob.lc.ival = CLASSNAME_GradedPolySet;
2547: rob.rc.voidp = (void *) grD;
2548: return(rob);
2549: }
2550:
2551: static char *getspace0(int a) {
2552: char *s;
2553: a = (a > 0? a:-a);
2554: s = (char *) sGC_malloc(a+1);
2555: if (s == (char *)NULL) {
2556: errorKan1("%s\n","no more memory.");
2557: }
2558: return(s);
2559: }
2560: struct object KdefaultPolyRing(struct object ob) {
2561: struct object rob;
2562: int i,j,k,n;
2563: struct object ob1,ob2,ob3,ob4,ob5;
2564: struct object t1;
2565: char *s1;
2566: extern struct ring *CurrentRingp;
2567: static struct ring *a[N0];
2568:
2569: rob = NullObject;
2570: if (ob.tag != Sinteger) {
2571: errorKan1("%s\n","KdefaultPolyRing(): the argument must be integer.");
2572: }
2573: n = KopInteger(ob);
2574: if (n <= 0) {
2575: /* initializing */
2576: for (i=0; i<N0; i++) {
2577: a[i] = (struct ring*) NULL;
2578: }
2579: return(rob);
2580: }
2581:
2582: if ( a[n] != (struct ring*)NULL) return(KpoRingp(a[n]));
2583:
2584: /* Let's construct ring of polynomials of 2n variables */
2585: /* x variables */
2586: ob1 = newObjectArray(n);
2587: for (i=0; i<n; i++) {
2588: s1 = getspace0(1+ ((n-i)/10) + 1);
2589: sprintf(s1,"x%d",n-i);
2590: putoa(ob1,i,KpoString(s1));
2591: }
2592: ob2 = newObjectArray(n);
2593: s1 = getspace0(1);
2594: sprintf(s1,"h");
2595: putoa(ob2,0,KpoString(s1));
2596: for (i=1; i<n; i++) {
2597: s1 = getspace0(1+((n+n-i)/10)+1);
2598: sprintf(s1,"x%d",n+n-i);
2599: putoa(ob2,i,KpoString(s1));
2600: }
2601:
2602: ob3 = newObjectArray(9);
2603: putoa(ob3,0,KpoInteger(0));
2604: for (i=1; i<9; i++) {
2605: putoa(ob3,i,KpoInteger(n));
2606: }
2607:
2608: ob4 = newObjectArray(2*n);
2609: t1 = newObjectArray(2*n);
2610: for (i=0; i<2*n; i++) {
2611: putoa(t1,i,KpoInteger(1));
2612: }
2613: putoa(ob4,0,t1);
2614: for (i=1; i<2*n; i++) {
2615: t1 = newObjectArray(2*n);
2616: for (j=0; j<2*n; j++) {
2617: putoa(t1,j,KpoInteger(0));
2618: if (j == (2*n-i)) {
2619: putoa(t1,j,KpoInteger(-1));
2620: }
2621: }
2622: putoa(ob4,i,t1);
2623: }
2624:
2625: ob5 = newObjectArray(2);
2626: putoa(ob5,0,KpoString("mpMult"));
2627: putoa(ob5,1,KpoString("poly"));
2628:
2629: KsetUpRing(ob1,ob2,ob3,ob4,ob5);
2630: a[n] = CurrentRingp;
2631: return(KpoRingp(a[n]));
2632: }
2633:
2634:
2635:
2636:
2637:
2638: /******************************************************************
2639: error handler
2640: ******************************************************************/
2641:
2642: errorKan1(str,message)
2643: char *str;
2644: char *message;
2645: {
2646: extern char *GotoLabel;
2647: extern int GotoP;
2648: extern int ErrorMessageMode;
2649: char tmpc[1024];
2650: if (ErrorMessageMode == 1 || ErrorMessageMode == 2) {
2651: sprintf(tmpc,"\nERROR(kanExport[0|1].c): ");
2652: if (strlen(message) < 900) {
2653: strcat(tmpc,message);
2654: }
2655: pushErrorStack(KnewErrorPacket(SerialCurrent,-1,tmpc));
2656: }
2657: if (ErrorMessageMode != 1) {
2658: fprintf(stderr,"\nERROR(kanExport[0|1].c): ");
2659: fprintf(stderr,str,message);
2660: }
2661: /* fprintf(stderr,"Hello "); */
2662: if (GotoP) {
2663: /* fprintf(stderr,"Hello. GOTO "); */
2664: fprintf(Fstack,"The interpreter was looking for the label <<%s>>. It is also aborted.\n",GotoLabel);
2665: GotoP = 0;
2666: }
2667: stdOperandStack(); contextControl(CCRESTORE);
2668: /* fprintf(stderr,"Now. Long jump!\n"); */
2669: longjmp(EnvOfStackMachine,1);
2670: }
2671:
2672: warningKan(str)
2673: char *str;
2674: {
2675: extern int WarningMessageMode;
2676: extern int Strict;
2677: char tmpc[1024];
2678: if (WarningMessageMode == 1 || WarningMessageMode == 2) {
2679: sprintf(tmpc,"\nWARNING(kanExport[0|1].c): ");
2680: if (strlen(str) < 900) {
2681: strcat(tmpc,str);
2682: }
2683: pushErrorStack(KnewErrorPacket(SerialCurrent,-1,tmpc));
2684: }
2685: if (WarningMessageMode != 1) {
2686: fprintf(stderr,"\nWARNING(kanExport[0|1].c): ");
2687: fprintf(stderr,str);
2688: fprintf(stderr,"\n");
2689: }
2690: /* if (Strict) errorKan1("%s\n"," "); */
2691: if (Strict) errorKan1("%s\n",str);
2692: return(0);
2693: }
2694:
2695:
2696:
2697:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>