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