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