Annotation of OpenXM/src/kan96xx/Kan/kanExport1.c, Revision 1.9
1.9 ! takayama 1: /* $OpenXM: OpenXM/src/kan96xx/Kan/kanExport1.c,v 1.8 2003/08/23 02:28:38 takayama Exp $ */
1.1 maekawa 2: #include <stdio.h>
3: #include "datatype.h"
4: #include "stackm.h"
5: #include "extern.h"
6: #include "extern2.h"
7: #include "lookup.h"
8: #include "matrix.h"
9: #include "gradedset.h"
10: #include "kclass.h"
11:
12: static int Message = 1;
13: extern int KanGBmessage;
14:
1.5 takayama 15: struct object DegreeShifto;
16: int DegreeShifto_size = 0;
17: int *DegreeShifto_vec = NULL;
1.9 ! takayama 18: struct object DegreeShiftD;
! 19: int DegreeShiftD_size = 0;
! 20: int *DegreeShiftD_vec = NULL;
1.5 takayama 21:
1.1 maekawa 22: /** :kan, :ring */
23: struct object Kreduction(f,set)
1.2 takayama 24: struct object f;
25: struct object set;
1.1 maekawa 26: {
27: POLY r;
28: struct gradedPolySet *grG;
29: struct syz0 syz;
30: struct object rob;
31: int flag;
32: extern int ReduceLowerTerms;
33:
34: if (f.tag != Spoly) errorKan1("%s\n","Kreduction(): the first argument must be a polynomial.");
35:
36: if (ectag(set) == CLASSNAME_GradedPolySet) {
37: grG = KopGradedPolySet(set);
38: flag = 1;
39: }else{
40: if (set.tag != Sarray) errorKan1("%s\n","Kreduction(): the second argument must be a set of polynomials.");
41: grG = arrayToGradedPolySet(set);
42: flag = 0;
43: }
44: if (ReduceLowerTerms) {
45: r = (*reductionCdr)(f.lc.poly,grG,1,&syz);
46: }else{
47: r = (*reduction)(f.lc.poly,grG,1,&syz);
48: }
1.6 takayama 49: /* outputGradedPolySet(grG,0); */
1.1 maekawa 50: if (flag) {
51: rob = newObjectArray(3);
52: putoa(rob,0,KpoPOLY(r));
53: putoa(rob,1,KpoPOLY(syz.cf));
54: putoa(rob,2,syzPolyToArray(countGradedPolySet(grG),syz.syz,grG));
55: }else {
56: rob = newObjectArray(4);
57: putoa(rob,0,KpoPOLY(r));
58: putoa(rob,1,KpoPOLY(syz.cf));
59: putoa(rob,2,syzPolyToArray(getoaSize(set),syz.syz,grG));
60: putoa(rob,3,gradedPolySetToArray(grG,1));
61: }
62: return(rob);
63: }
64:
65: struct object Kgroebner(ob)
1.2 takayama 66: struct object ob;
1.1 maekawa 67: {
68: int needSyz = 0;
69: int needBack = 0;
70: int needInput = 0;
71: int countDown = 0;
72: int cdflag = 0;
73: struct object ob1,ob2,ob2c;
74: int i;
75: struct gradedPolySet *grG;
76: struct pair *grP;
77: struct arrayOfPOLY *a;
78: struct object rob;
79: struct gradedPolySet *grBases;
80: struct matrixOfPOLY *mp;
81: struct matrixOfPOLY *backwardMat;
82: struct object ob1New;
83: extern char *F_groebner;
84: extern int CheckHomogenization;
85: extern int StopDegree;
86: int sdflag = 0;
87: int forceReduction = 0;
88:
89: int ob1Size, ob2Size, noZeroEntry;
90: int *ob1ToOb2;
91: int *ob1ZeroPos;
92: int method;
93: int j,k;
94: struct object rob2;
95: struct object rob3;
96: struct object rob4;
97: struct ring *myring;
98: POLY f;
99: struct object orgB;
100: struct object newB;
101: struct object orgC;
102: struct object newC;
103: static struct object paddingVector(struct object ob, int table[], int m);
104: static struct object unitVector(int pos, int size,struct ring *r);
105: extern struct ring *CurrentRingp;
106:
107: StopDegree = 0x7fff;
108:
109: if (ob.tag != Sarray) errorKan1("%s\n","Kgroebner(): The argument must be an array.");
110: switch(getoaSize(ob)) {
111: case 1:
112: needBack = 0; needSyz = 0; needInput = 0;
113: ob1 = getoa(ob,0);
114: break;
115: case 2:
116: ob1 = getoa(ob,0);
117: ob2 = getoa(ob,1);
118: if (ob2.tag != Sarray) {
119: errorKan1("%s\n","Kgroebner(): The options must be given by an array.");
120: }
121: for (i=0; i<getoaSize(ob2); i++) {
122: ob2c = getoa(ob2,i);
123: if (ob2c.tag == Sdollar) {
1.2 takayama 124: if (strcmp(ob2c.lc.str,"needBack")==0) {
125: needBack = 1;
126: }else if (strcmp(ob2c.lc.str,"needSyz")==0) {
127: if (!needBack) {
128: /* warningKan("Kgroebner(): needBack is automatically set."); */
129: }
130: needSyz = needBack = 1;
131: }else if (strcmp(ob2c.lc.str,"forceReduction")==0) {
132: forceReduction = 1;
133: }else if (strcmp(ob2c.lc.str,"countDown")==0) {
134: countDown = 1; cdflag = 1;
135: if (needSyz) {
136: warningKan("Kgroebner(): needSyz is automatically turned off.");
137: needSyz = 0;
138: }
139: }else if (strcmp(ob2c.lc.str,"StopDegree")==0) {
140: StopDegree = 0; sdflag = 1;
141: if (needSyz) {
142: warningKan("Kgroebner(): needSyz is automatically turned off.");
143: needSyz = 0;
144: }
145: }else {
146: warningKan("Unknown keyword for options.");
147: }
1.1 maekawa 148: }else if (ob2c.tag == Sinteger) {
1.2 takayama 149: if (cdflag) {
150: cdflag = 0;
151: countDown = KopInteger(ob2c);
152: }else if (sdflag) {
153: sdflag = 0;
154: StopDegree = KopInteger(ob2c);
155: }
1.1 maekawa 156: }
157: }
158: break;
159: default:
160: errorKan1("%s\n","Kgroebner(): [ [polynomials] ] or [[polynomials] [options]].");
161: }
1.2 takayama 162:
1.1 maekawa 163: if (ob1.tag != Sarray) errorKan1("%s\n","Kgroebner(): The argument must be an array. Example: [ [$x-1$ . $x y -2$ .] [$needBack$ $needSyz$ $needInput$]] ");
164: ob1New = newObjectArray(getoaSize(ob1));
165: for (i=0; i< getoaSize(ob1); i++) {
166: if (getoa(ob1,i).tag == Spoly) {
167: putoa(ob1New,i,getoa(ob1,i));
168: }else if (getoa(ob1,i).tag == Sarray) {
169: /* If the generater is given as an array, flatten it. */
170: putoa(ob1New,i,KpoPOLY( arrayToPOLY(getoa(ob1,i))));
171: }else{
172: errorKan1("%s\n","Kgroebner(): The elements must be polynomials or array of polynomials.");
173: }
174: /* getoa(ob1,i) is poly, now check the homogenization. */
175: if (CheckHomogenization) {
176: if ((strcmp(F_groebner,"standard")==0) &&
1.2 takayama 177: !isHomogenized(KopPOLY(getoa(ob1New,i)))) {
178: fprintf(stderr,"\n%s",KPOLYToString(KopPOLY(getoa(ob1New,i))));
179: errorKan1("%s\n","Kgroebner(): The above polynomial is not homogenized. cf. homogenize.");
1.1 maekawa 180: }
181: }
182: }
183: ob1 = ob1New;
184:
185: /* To handle the input with zero entries. For debug, debug/gr.sm1*/
186: ob1Size = getoaSize(ob1);
187: ob2Size = 0; myring = CurrentRingp;
188: for (i=0; i<ob1Size; i++) {
189: if (KopPOLY(getoa(ob1,i)) != POLYNULL) ob2Size++;
190: }
191: if (ob2Size == ob1Size) noZeroEntry = 1;
192: else noZeroEntry = 0;
193: if (ob1Size == 0) {
194: if (needBack && needSyz) {
195: rob = newObjectArray(3);
196: putoa(rob,0,newObjectArray(0));
197: putoa(rob,1,newObjectArray(0));
198: putoa(rob,2,newObjectArray(0));
199: }else if (needBack) {
200: rob = newObjectArray(2);
201: putoa(rob,0,newObjectArray(0));
202: putoa(rob,1,newObjectArray(0));
203: }else {
204: rob = newObjectArray(1);
205: putoa(rob,0,newObjectArray(0));
206: }
207: return(rob);
208: }
209: /* Assume ob1size > 0 */
210: if (ob2Size == 0) {
211: rob2 = newObjectArray(1); putoa(rob2,0,KpoPOLY(POLYNULL));
212: if (needBack && needSyz) {
213: rob = newObjectArray(3);
214: putoa(rob,0,rob2);
215: rob3 = newObjectArray(1);
216: putoa(rob3,0,unitVector(-1,ob1Size,(struct ring *)NULL));
217: putoa(rob,1,rob3);
218: rob4 = newObjectArray(ob1Size);
219: for (i=0; i<ob1Size; i++) {
1.2 takayama 220: putoa(rob4,i,unitVector(i,ob1Size,myring));
1.1 maekawa 221: }
222: putoa(rob,2,rob4);
223: }else if (needBack) {
224: rob = newObjectArray(2);
225: putoa(rob,0,rob2);
226: rob3 = newObjectArray(1);
227: putoa(rob3,0,unitVector(-1,ob1Size,(struct ring *)NULL));
228: putoa(rob,1,rob3);
229: }else {
230: rob = newObjectArray(1);
231: putoa(rob,0,rob2);
232: }
233: return(rob);
234: }
235: /* Assume ob1Size , ob2Size > 0 */
236: ob2 = newObjectArray(ob2Size);
237: ob1ToOb2 = (int *)GC_malloc(sizeof(int)*ob1Size);
238: ob1ZeroPos = (int *)GC_malloc(sizeof(int)*(ob1Size-ob2Size+1));
239: if (ob1ToOb2 == NULL || ob1ZeroPos == NULL) errorKan1("%s\n","No more memory.");
240: j = 0; k = 0;
241: for (i=0; i<ob1Size; i++) {
242: f = KopPOLY(getoa(ob1,i));
243: if (f != POLYNULL) {
244: myring = f->m->ringp;
245: putoa(ob2,j,KpoPOLY(f));
246: ob1ToOb2[i] = j; j++;
247: }else{
248: ob1ToOb2[i] = -1;
249: ob1ZeroPos[k] = i; k++;
250: }
251: }
252:
253: a = arrayToArrayOfPOLY(ob2);
254: grG = (*groebner)(a,needBack,needSyz,&grP,countDown,forceReduction);
255:
256: if (strcmp(F_groebner,"gm") == 0 && (needBack || needSyz)) {
257: warningKan("The options needBack and needSyz are ignored.");
258: needBack = needSyz = 0;
259: }
260:
261: /*return(gradedPolySetToGradedArray(grG,0));*/
262: if (needBack && needSyz) {
263: rob = newObjectArray(3);
264: if (Message && KanGBmessage) {
265: printf("Computing the backward transformation ");
266: fflush(stdout);
267: }
268: getBackwardTransformation(grG); /* mark and syz is modified. */
269: if (KanGBmessage) printf("Done.\n");
270:
271: /* Computing the syzygies. */
272: if (Message && KanGBmessage) {
273: printf("Computing the syzygies ");
274: fflush(stdout);
275: }
276: mp = getSyzygy(grG,grP->next,&grBases,&backwardMat);
277: if (KanGBmessage) printf("Done.\n");
278:
279: putoa(rob,0,gradedPolySetToArray(grG,0));
280: putoa(rob,1,matrixOfPOLYToArray(backwardMat));
281: putoa(rob,2,matrixOfPOLYToArray(mp));
282: }else if (needBack) {
283: rob = newObjectArray(2);
284: if (Message && KanGBmessage) {
285: printf("Computing the backward transformation.....");
286: fflush(stdout);
287: }
288: getBackwardTransformation(grG); /* mark and syz is modified. */
289: if (KanGBmessage) printf("Done.\n");
290: putoa(rob,0,gradedPolySetToArray(grG,0));
291: putoa(rob,1,getBackwardArray(grG));
292: }else {
293: rob = newObjectArray(1);
294: putoa(rob,0,gradedPolySetToArray(grG,0));
295: }
296:
297: /* To handle zero entries in the input. */
298: if (noZeroEntry) {
299: return(rob);
300: }
301: method = getoaSize(rob);
302: switch(method) {
303: case 1:
304: return(rob);
305: break;
306: case 2:
307: orgB = getoa(rob,1); /* backward transformation. */
308: newB = newObjectArray(getoaSize(orgB));
309: for (i=0; i<getoaSize(orgB); i++) {
310: putoa(newB,i,paddingVector(getoa(orgB,i),ob1ToOb2,ob1Size));
311: }
312: rob2 = newObjectArray(2);
313: putoa(rob2,0,getoa(rob,0));
314: putoa(rob2,1,newB);
315: return(rob2);
316: break;
317: case 3:
318: orgB = getoa(rob,1); /* backward transformation. */
319: newB = newObjectArray(getoaSize(orgB));
320: for (i=0; i<getoaSize(orgB); i++) {
321: putoa(newB,i,paddingVector(getoa(orgB,i),ob1ToOb2,ob1Size));
322: }
323: orgC = getoa(rob,2);
324: newC = newObjectArray(getoaSize(orgC)+ob1Size-ob2Size);
325: for (i=0; i<getoaSize(orgC); i++) {
326: putoa(newC, i, paddingVector(getoa(orgC,i),ob1ToOb2,ob1Size));
327: }
328: for (i = getoaSize(orgC), j = 0; i<getoaSize(orgC)+ob1Size-ob2Size; i++,j++) {
329: putoa(newC,i,unitVector(ob1ZeroPos[j],ob1Size,myring));
330: }
331: rob2 = newObjectArray(3);
332: putoa(rob2,0,getoa(rob,0));
333: putoa(rob2,1,newB);
334: putoa(rob2,2,newC);
335: return(rob2);
336: break;
337: default:
338: errorKan1("%s","Kgroebner: unknown method.");
339: }
340: }
341:
342: static struct object paddingVector(struct object ob, int table[], int m)
343: {
344: struct object rob;
345: int i;
346: rob = newObjectArray(m);
347: for (i=0; i<m; i++) {
348: if (table[i] != -1) {
349: putoa(rob,i,getoa(ob,table[i]));
350: }else{
351: putoa(rob,i,KpoPOLY(POLYNULL));
352: }
353: }
354: return(rob);
355: }
356:
357: static struct object unitVector(int pos, int size,struct ring *r)
358: {
359: struct object rob;
360: int i;
361: POLY one;
362: rob = newObjectArray(size);
363: for (i=0; i<size; i++) {
364: putoa(rob,i,KpoPOLY(POLYNULL));
365: }
366: if ((0 <= pos) && (pos < size)) {
367: putoa(rob,pos, KpoPOLY(cxx(1,0,0,r)));
368: }
369: return(rob);
370: }
371:
372:
373:
374: /* :misc */
375:
376: #define INITGRADE 3
377: #define INITSIZE 0
378:
379: struct gradedPolySet *arrayToGradedPolySet(ob)
1.2 takayama 380: struct object ob;
1.1 maekawa 381: {
382: int n,i,grd,ind;
383: POLY f;
384: struct gradedPolySet *grG;
385: int serial;
386: extern int Sugar;
387:
388: if (ob.tag != Sarray) errorKan1("%s\n","arrayToGradedPolySet(): the argument must be array.");
389: n = getoaSize(ob);
390: for (i=0; i<n; i++) {
391: if (getoa(ob,i).tag != Spoly)
392: errorKan1("%s\n","arrayToGradedPolySet(): the elements must be polynomials.");
393: }
394: grG = newGradedPolySet(INITGRADE);
395:
396: for (i=0; i<grG->lim; i++) {
397: grG->polys[i] = newPolySet(INITSIZE);
398: }
399: for (i=0; i<n; i++) {
400: f = KopPOLY(getoa(ob,i));
401: grd = -1; whereInG(grG,f,&grd,&ind,Sugar);
402: serial = i;
403: grG = putPolyInG(grG,f,grd,ind,(struct syz0 *)NULL,1,serial);
404: }
405: return(grG);
406: }
407:
408:
409: struct object polySetToArray(ps,keepRedundant)
1.2 takayama 410: struct polySet *ps;
411: int keepRedundant;
1.1 maekawa 412: {
413: int n,i,j;
414: struct object ob;
415: if (ps == (struct polySet *)NULL) return(newObjectArray(0));
416: n = 0;
417: if (keepRedundant) {
418: n = ps->size;
419: }else{
420: for (i=0; i<ps->size; i++) {
421: if (ps->del[i] == 0) ++n;
422: }
423: }
424: ob = newObjectArray(n);
425: j = 0;
426: for (i=0; i<ps->size; i++) {
427: if (keepRedundant || (ps->del[i] == 0)) {
428: putoa(ob,j,KpoPOLY(ps->g[i]));
429: j++;
430: }
431: }
432: return(ob);
433: }
434:
435:
436: struct object gradedPolySetToGradedArray(gps,keepRedundant)
1.2 takayama 437: struct gradedPolySet *gps;
438: int keepRedundant;
1.1 maekawa 439: {
440: struct object ob,vec;
441: int i;
442: if (gps == (struct gradedPolySet *)NULL) return(NullObject);
443: ob = newObjectArray(gps->maxGrade +1);
444: vec = newObjectArray(gps->maxGrade);
445: for (i=0; i<gps->maxGrade; i++) {
446: putoa(vec,i,KpoInteger(i));
447: putoa(ob,i+1,polySetToArray(gps->polys[i],keepRedundant));
448: }
449: putoa(ob,0,vec);
450: return(ob);
451: }
452:
453:
454: struct object gradedPolySetToArray(gps,keepRedundant)
1.2 takayama 455: struct gradedPolySet *gps;
456: int keepRedundant;
1.1 maekawa 457: {
458: struct object ob,vec;
459: struct polySet *ps;
460: int k;
461: int i,j;
462: int size;
463: if (gps == (struct gradedPolySet *)NULL) return(NullObject);
464: size = 0;
465: for (i=0; i<gps->maxGrade; i++) {
466: ps = gps->polys[i];
467: if (keepRedundant) {
468: size += ps->size;
469: }else{
470: for (j=0; j<ps->size; j++) {
1.2 takayama 471: if (ps->del[j] == 0) ++size;
1.1 maekawa 472: }
473: }
474: }
475:
476: ob = newObjectArray(size);
477: k = 0;
478: for (i=0; i<gps->maxGrade; i++) {
479: ps = gps->polys[i];
480: for (j=0; j<ps->size; j++) {
481: if (keepRedundant || (ps->del[j] == 0)) {
1.2 takayama 482: putoa(ob,k,KpoPOLY(ps->g[j]));
483: k++;
1.1 maekawa 484: }
485: }
486: }
487: return(ob);
488: }
489:
490:
491: /* serial == -1 : It's not in the marix input. */
492: struct object syzPolyToArray(size,f,grG)
1.2 takayama 493: int size;
494: POLY f;
495: struct gradedPolySet *grG;
1.1 maekawa 496: {
497: struct object ob;
498: int i,g0,i0,serial;
499:
500: ob = newObjectArray(size);
501: for (i=0; i<size; i++) {
502: putoa(ob,i,KpoPOLY(ZERO));
503: }
504:
505: while (f != POLYNULL) {
506: g0 = srGrade(f);
1.6 takayama 507: i0 = srIndex(f);
1.1 maekawa 508: serial = grG->polys[g0]->serial[i0];
509: if (serial < 0) {
510: errorKan1("%s\n","syzPolyToArray(): invalid serial[i] of grG.");
511: }
512: if (KopPOLY(getoa(ob,serial)) != ZERO) {
513: errorKan1("%s\n","syzPolyToArray(): syzygy polynomial is broken.");
514: }
515: putoa(ob,serial,KpoPOLY(f->coeffp->val.f));
516: f = f->next;
517: }
518: return(ob);
519: }
520:
521: struct object getBackwardArray(grG)
1.2 takayama 522: struct gradedPolySet *grG;
1.1 maekawa 523: {
524: /* use serial, del. cf. getBackwardTransformation(). */
525: int inputSize,outputSize;
526: int i,j,k;
527: struct object ob;
528: struct polySet *ps;
529:
530: inputSize = 0; outputSize = 0;
531: for (i=0; i<grG->maxGrade; i++) {
532: ps = grG->polys[i];
533: for (j=0; j<ps->size; j++) {
534: if (ps->serial[j] >= 0) ++inputSize;
535: if (ps->del[j] == 0) ++outputSize;
536: }
537: }
538:
539: ob = newObjectArray(outputSize);
540: k = 0;
541: for (i=0; i<grG->maxGrade; i++) {
542: ps = grG->polys[i];
543: for (j=0; j<ps->size; j++) {
544: if (ps->del[j] == 0) {
1.2 takayama 545: putoa(ob,k,syzPolyToArray(inputSize,ps->syz[j]->syz,grG));
546: k++;
1.1 maekawa 547: }
548: }
549: }
550: return(ob);
551: }
552:
553:
554: POLY arrayToPOLY(ob)
1.2 takayama 555: struct object ob;
1.1 maekawa 556: {
557: int size,i;
558: struct object f;
559: POLY r;
560: static int nn,mm,ll,cc,n,m,l,c;
561: static struct ring *cr = (struct ring *)NULL;
562: POLY ff,ee;
563: MONOMIAL tf;
564:
565: if (ob.tag != Sarray) errorKan1("%s\n","arrayToPOLY(): The argument must be an array.");
566: size = getoaSize(ob);
567: r = ZERO;
568: for (i=0; i<size; i++) {
569: f = getoa(ob,i);
570: if (f.tag != Spoly) errorKan1("%s\n","arrayToPOLY(): The elements must be polynomials.");
571: ff = KopPOLY(f);
572: if (ff != ZERO) {
573: tf = ff->m;
574: if (tf->ringp != cr) {
1.2 takayama 575: n = tf->ringp->n;
576: m = tf->ringp->m;
577: l = tf->ringp->l;
578: c = tf->ringp->c;
579: nn = tf->ringp->nn;
580: mm = tf->ringp->mm;
581: ll = tf->ringp->ll;
582: cc = tf->ringp->cc;
583: cr = tf->ringp;
1.1 maekawa 584: }
585: if (n-nn >0) ee = cxx(1,n-1,i,tf->ringp);
586: else if (m-mm >0) ee = cxx(1,m-1,i,tf->ringp);
587: else if (l-ll >0) ee = cxx(1,l-1,i,tf->ringp);
588: else if (c-cc >0) ee = cxx(1,c-1,i,tf->ringp);
589: else ee = ZERO;
590: r = ppAddv(r,ppMult(ee,ff));
591: }
592: }
593: return(r);
594: }
595:
596: struct object POLYToArray(ff)
1.2 takayama 597: POLY ff;
1.1 maekawa 598: {
599:
600: static int nn,mm,ll,cc,n,m,l,c;
601: static struct ring *cr = (struct ring *)NULL;
602: POLY ee;
603: MONOMIAL tf;
604: int k,i,matn,size;
605: struct matrixOfPOLY *mat;
606: POLY ex,sizep;
607: struct object ob;
608:
609: if (ff != ZERO) {
610: tf = ff->m;
611: if (tf->ringp != cr) {
612: n = tf->ringp->n;
613: m = tf->ringp->m;
614: l = tf->ringp->l;
615: c = tf->ringp->c;
616: nn = tf->ringp->nn;
617: mm = tf->ringp->mm;
618: ll = tf->ringp->ll;
619: cc = tf->ringp->cc;
620: cr = tf->ringp;
621: }
622: if (n-nn >0) ee = cxx(1,n-1,1,tf->ringp);
623: else if (m-mm >0) ee = cxx(1,m-1,1,tf->ringp);
624: else if (l-ll >0) ee = cxx(1,l-1,1,tf->ringp);
625: else if (c-cc >0) ee = cxx(1,c-1,1,tf->ringp);
626: else ee = ZERO;
627: }else{
628: ob = newObjectArray(1);
629: getoa(ob,0) = KpoPOLY(ZERO);
630: return(ob);
631: }
632: mat = parts(ff,ee);
633: matn = mat->n;
634: sizep = getMatrixOfPOLY(mat,0,0);
635: if (sizep == ZERO) size = 1;
636: else size = coeffToInt(sizep->coeffp)+1;
637: ob = newObjectArray(size);
638: for (i=0; i<size; i++) getoa(ob,i) = KpoPOLY(ZERO);
639: for (i=0; i<matn; i++) {
640: ex = getMatrixOfPOLY(mat,0,i);
641: if (ex == ZERO) k = 0;
642: else {
643: k = coeffToInt(ex->coeffp);
644: }
645: getoa(ob,k) = KpoPOLY(getMatrixOfPOLY(mat,1,i));
646: }
647: return(ob);
648: }
649:
650: static int isThereh(f)
1.2 takayama 651: POLY f;
1.1 maekawa 652: {
653: POLY t;
654: if (f == 0) return(0);
655: t = f;
656: while (t != POLYNULL) {
657: if (t->m->e[0].D) return(1);
658: t = t->next;
659: }
660: return(0);
661: }
662:
663: struct object homogenizeObject(ob,gradep)
1.2 takayama 664: struct object ob;
665: int *gradep;
1.1 maekawa 666: {
667: struct object rob,ob1;
668: int maxg;
669: int gr,flag,i,d,size;
670: struct ring *rp;
671: POLY f;
672: extern struct ring *CurrentRingp;
673: extern int Homogenize_vec;
674:
675: if (!Homogenize_vec) return(homogenizeObject_vec(ob,gradep));
676:
677: switch(ob.tag) {
678: case Spoly:
679: if (isThereh(KopPOLY(ob))) {
680: fprintf(stderr,"\n%s\n",KPOLYToString(KopPOLY(ob)));
681: errorKan1("%s\n","homogenizeObject(): The above polynomial has already had a homogenization variable.\nPut the homogenization variable 1 before homogenization.\ncf. replace.");
682: }
683: f = homogenize( KopPOLY(ob) );
684: *gradep = (*grade)(f);
685: return(KpoPOLY(f));
686: break;
687: case Sarray:
688: size = getoaSize(ob);
689: if (size == 0) {
690: errorKan1("%s\n","homogenizeObject() is called for the empty array.");
691: }
692: rob = newObjectArray(size);
693: flag = 0;
694: ob1 = getoa(ob,0);
1.5 takayama 695: if (ob1.tag == Sdollar) return(homogenizeObject_go(ob,gradep));
1.1 maekawa 696: ob1 = homogenizeObject(ob1,&gr);
697: maxg = gr;
698: getoa(rob,0) = ob1;
699: for (i=1; i<size; i++) {
700: ob1 = getoa(ob,i);
701: ob1 = homogenizeObject(ob1,&gr);
702: if (gr > maxg) {
1.2 takayama 703: maxg = gr;
1.1 maekawa 704: }
705: getoa(rob,i) = ob1;
706: }
707: maxg = maxg+size-1;
708: if (1) {
709: rp = oRingp(rob);
710: if (rp == (struct ring *)NULL) rp = CurrentRingp;
711: for (i=0; i<size; i++) {
1.2 takayama 712: gr = oGrade(getoa(rob,i));
713: /**printf("maxg=%d, gr=%d(i=%d) ",maxg,gr,i); fflush(stdout);**/
714: if (maxg > gr) {
715: f = cdd(1,0,maxg-gr-i,rp); /* h^{maxg-gr-i} */
716: getoa(rob,i) = KooMult(KpoPOLY(f),getoa(rob,i));
717: }
1.1 maekawa 718: }
719: }
720: *gradep = maxg;
721: return(rob);
722: break;
723: default:
724: errorKan1("%s\n","homogenizeObject(): Invalid argument data type.");
725: break;
726: }
727: }
728:
729: struct object homogenizeObject_vec(ob,gradep)
1.2 takayama 730: struct object ob;
731: int *gradep;
1.1 maekawa 732: {
733: struct object rob,ob1;
734: int maxg;
735: int gr,i,size;
736: POLY f;
737: extern struct ring *CurrentRingp;
738:
739: switch(ob.tag) {
740: case Spoly:
741: if (isThereh(KopPOLY(ob))) {
742: fprintf(stderr,"\n%s\n",KPOLYToString(KopPOLY(ob)));
743: errorKan1("%s\n","homogenizeObject_vec(): The above polynomial has already had a homogenization variable.\nPut the homogenization variable 1 before homogenization.\ncf. replace.");
744: }
745: if (containVectorVariable(KopPOLY(ob))) {
746: errorKan1("%s\n","homogenizedObject_vec(): The given polynomial contains a variable to express a vector component.");
747: }
748: f = homogenize( KopPOLY(ob) );
749: *gradep = (*grade)(f);
750: return(KpoPOLY(f));
751: break;
752: case Sarray:
753: size = getoaSize(ob);
754: if (size == 0) {
755: errorKan1("%s\n","homogenizeObject_vec() is called for the empty array.");
756: }
1.5 takayama 757: if (getoa(ob,0).tag == Sdollar) return(homogenizeObject_go(ob,gradep));
1.1 maekawa 758: rob = newObjectArray(size);
759: for (i=0; i<size; i++) {
760: ob1 = getoa(ob,i);
761: ob1 = homogenizeObject_vec(ob1,&gr);
762: if (i==0) maxg = gr;
763: else {
1.2 takayama 764: maxg = (maxg > gr? maxg: gr);
1.1 maekawa 765: }
766: putoa(rob,i,ob1);
767: }
768: *gradep = maxg;
769: return(rob);
770: break;
771: default:
772: errorKan1("%s\n","homogenizeObject_vec(): Invalid argument data type.");
773: break;
774: }
775: }
776:
1.9 ! takayama 777: void KresetDegreeShift() {
! 778: DegreeShifto = NullObject;
! 779: DegreeShifto_vec = (int *)NULL;
! 780: DegreeShifto_size = 0;
! 781: DegreeShiftD = NullObject;
! 782: DegreeShiftD_vec = (int *)NULL;
! 783: DegreeShiftD_size = 0;
! 784: }
! 785:
1.3 takayama 786: struct object homogenizeObject_go(struct object ob,int *gradep) {
787: int size,i,dssize,j;
788: struct object ob0;
789: struct object ob1;
790: struct object ob2;
791: struct object rob;
792: struct object tob;
793: struct object ob1t;
794: int *ds;
795: POLY f;
1.9 ! takayama 796: int onlyS;
! 797:
! 798: onlyS = 0; /* default value */
1.3 takayama 799: rob = NullObject;
1.9 ! takayama 800: /*printf("[%d,%d]\n",DegreeShiftD_size,DegreeShifto_size);*/
! 801: if (DegreeShifto_size == 0) DegreeShifto = NullObject;
! 802: if (DegreeShiftD_size == 0) DegreeShiftD = NullObject;
! 803: /*
! 804: DegreeShiftD : Degree shift vector for (0,1)-h-homogenization,
! 805: which is {\vec n} in G-O paper.
! 806: It is used in dGrade1() redm.c
! 807: DegreeShifto : Degree shift vector for (u,v)-s-homogenization
! 808: which is used only in ecart division and (u,v) is
! 809: usually (-1,1).
! 810: This shift vector is written {\vec v} in G-O paper.
! 811: It may differ from the degree shift for the ring,
! 812: which is used to get (minimal) Schreyer resolution.
! 813: This shift vector is denoted by {\vec m} in G-O paper.
! 814: It is often used as an argument for uvGrade1 and
! 815: goHomogenize*
! 816: */
1.3 takayama 817: if (ob.tag != Sarray) errorKan1("%s\n","homogenizeObject_go(): Invalid argument data type.");
818:
819: size = getoaSize(ob);
820: if (size == 0) errorKan1("%s\n","homogenizeObject_go(): the first argument must be a string.");
821: ob0 = getoa(ob,0);
822: if (ob0.tag != Sdollar) {
823: errorKan1("%s\n","homogenizeObject_go(): the first argument must be a string.");
824: }
825: if (strcmp(KopString(ob0),"degreeShift") == 0) {
1.5 takayama 826: if (size < 2)
1.9 ! takayama 827: errorKan1("%s\n","homogenizeObject_go(): [(degreeShift) shift-vector obj] or [(degreeShift) shift-vector] or [(degreeShift) (value)] homogenize.\nshift-vector=(0,1)-shift vector or [(0,1)-shift vector, (u,v)-shift vector].");
1.5 takayama 828: ob1 = getoa(ob,1);
829: if (ob1.tag != Sarray) {
1.9 ! takayama 830: if ((ob1.tag == Sdollar) && (strcmp(KopString(ob1),"value")==0)) {
! 831: /* Reporting the value. It is done below. */
! 832: }else if ((ob1.tag == Sdollar) && (strcmp(KopString(ob1),"reset")==0)) {
! 833: KresetDegreeShift();
! 834: }
! 835: rob = newObjectArray(2);
! 836: putoa(rob,0,DegreeShiftD);
! 837: putoa(rob,1,DegreeShifto);
! 838: return rob;
! 839: }
! 840:
! 841: if (getoaSize(ob1) == 2) {
! 842: /* [(degreeShift) [ [1 2] [3 4] ] ...] homogenize */
! 843: /* (0,1)-h (u,v)-s */
! 844: DegreeShiftD = getoa(ob1,0);
! 845: dssize = getoaSize(DegreeShiftD);
! 846: ds = (int *)sGC_malloc(sizeof(int)*(dssize>0?dssize:1));
! 847: if (ds == NULL) errorKan1("%s\n","no more memory.");
! 848: for (i=0; i<dssize; i++) {
! 849: ds[i] = objToInteger(getoa(DegreeShiftD,i));
! 850: }
! 851: DegreeShiftD_size = dssize;
! 852: DegreeShiftD_vec = ds;
! 853:
! 854: DegreeShifto = getoa(ob1,1);
! 855: dssize = getoaSize(DegreeShifto);
! 856: ds = (int *)sGC_malloc(sizeof(int)*(dssize>0?dssize:1));
! 857: if (ds == NULL) errorKan1("%s\n","no more memory.");
! 858: for (i=0; i<dssize; i++) {
! 859: ds[i] = objToInteger(getoa(DegreeShifto,i));
1.3 takayama 860: }
1.9 ! takayama 861: DegreeShifto_size = dssize;
! 862: DegreeShifto_vec = ds;
! 863: }else if (getoaSize(ob1) == 1) {
! 864: /* Set only for (0,1)-h */
! 865: DegreeShiftD = getoa(ob1,0);
! 866: dssize = getoaSize(DegreeShiftD);
! 867: ds = (int *)sGC_malloc(sizeof(int)*(dssize>0?dssize:1));
! 868: if (ds == NULL) errorKan1("%s\n","no more memory.");
! 869: for (i=0; i<dssize; i++) {
! 870: ds[i] = objToInteger(getoa(DegreeShiftD,i));
! 871: }
! 872: DegreeShiftD_size = dssize;
! 873: DegreeShiftD_vec = ds;
1.3 takayama 874: }
1.9 ! takayama 875:
! 876: ds = DegreeShifto_vec;
! 877: dssize = DegreeShifto_size;
! 878:
1.5 takayama 879: if (size == 2) {
1.9 ! takayama 880: rob = newObjectArray(2);
! 881: putoa(rob,0,DegreeShiftD);
! 882: putoa(rob,1,DegreeShifto);
! 883: return rob;
1.5 takayama 884: }else{
885: ob2 = getoa(ob,2);
886: if (ob2.tag == Spoly) {
1.9 ! takayama 887: f = goHomogenize11(KopPOLY(ob2),ds,dssize,-1,onlyS);
1.5 takayama 888: rob = KpoPOLY(f);
889: }else if (ob2.tag == SuniversalNumber) {
890: rob = ob2;
891: }else if (ob2.tag == Sarray) {
1.9 ! takayama 892: int mm;
! 893: mm = getoaSize(ob2);
! 894: f = objArrayToPOLY(ob2);
! 895: f = goHomogenize11(f,ds,dssize,-1,onlyS);
! 896: rob = POLYtoObjArray(f,mm);
1.5 takayama 897: }else{
898: errorKan1("%s\n","homogenizeObject_go(): invalid object for the third element.");
899: }
900: }
1.3 takayama 901: }else{
1.5 takayama 902: errorKan1("%s\n","homogenizeObject_go(): unknown key word.");
1.3 takayama 903: }
1.5 takayama 904: return( rob );
1.3 takayama 905: }
906:
907:
1.1 maekawa 908: struct ring *oRingp(ob)
1.2 takayama 909: struct object ob;
1.1 maekawa 910: {
911: struct ring *rp,*rptmp;
912: int i,size;
913: POLY f;
914: switch(ob.tag) {
915: case Spoly:
916: f = KopPOLY(ob);
917: if (f == ZERO) return((struct ring *)NULL);
918: return( f->m->ringp);
919: break;
920: case Sarray:
921: size = getoaSize(ob);
922: rp = (struct ring *)NULL;
923: for (i=0; i<size; i++) {
924: rptmp = oRingp(getoa(ob,i));
925: if (rptmp != (struct ring *)NULL) rp = rptmp;
926: return(rp);
927: }
928: break;
929: default:
930: errorKan1("%s\n","oRingp(): Invalid argument data type.");
931: break;
932: }
933: }
934:
935: int oGrade(ob)
1.2 takayama 936: struct object ob;
1.1 maekawa 937: {
938: int i,size;
939: POLY f;
940: int maxg,tmpg;
941: switch(ob.tag) {
942: case Spoly:
943: f = KopPOLY(ob);
944: return( (*grade)(f) );
945: break;
946: case Sarray:
947: size = getoaSize(ob);
948: if (size == 0) return(0);
949: maxg = oGrade(getoa(ob,0));
950: for (i=1; i<size; i++) {
951: tmpg = oGrade(getoa(ob,i));
952: if (tmpg > maxg) maxg = tmpg;
953: }
954: return(maxg);
955: break;
956: default:
957: errorKan1("%s\n","oGrade(): Invalid data type for the argument.");
958: break;
959: }
960: }
961:
962:
963: struct object oPrincipalPart(ob)
1.2 takayama 964: struct object ob;
1.1 maekawa 965: {
966: POLY f;
967: struct object rob;
968:
969: switch(ob.tag) {
970: case Spoly:
971: f = KopPOLY(ob);
972: return( KpoPOLY(POLYToPrincipalPart(f)));
973: break;
974: default:
975: errorKan1("%s\n","oPrincipalPart(): Invalid data type for the argument.");
976: break;
977: }
978: }
979: struct object oInitW(ob,oWeight)
1.2 takayama 980: struct object ob;
981: struct object oWeight;
1.1 maekawa 982: {
983: POLY f;
984: struct object rob;
985: int w[2*N0];
986: int n,i;
987: struct object ow;
1.7 takayama 988: int shiftvec;
989: struct object oShift;
990: int *s;
991: int ssize,m;
1.1 maekawa 992:
1.7 takayama 993: shiftvec = 0;
994: s = NULL;
995:
1.1 maekawa 996: if (oWeight.tag != Sarray) {
997: errorKan1("%s\n","oInitW(): the second argument must be array.");
998: }
999: n = getoaSize(oWeight);
1.8 takayama 1000: if (n == 0) {
1001: m = getoaSize(ob);
1002: f = objArrayToPOLY(ob);
1003: f = head(f);
1004: return POLYtoObjArray(f,m);
1005: }
1.7 takayama 1006: if (getoa(oWeight,0).tag == Sarray) {
1007: if (n != 2) errorKan1("%s\n","oInitW(): the size of the second argument should be 2.");
1008: shiftvec = 1;
1009: oShift = getoa(oWeight,1);
1010: oWeight = getoa(oWeight,0);
1011: if (oWeight.tag != Sarray) {
1012: errorKan1("%s\n","oInitW(): the weight vector must be array.");
1013: }
1014: n = getoaSize(oWeight);
1015: if (oShift.tag != Sarray) {
1016: errorKan1("%s\n","oInitW(): the shift vector must be array.");
1017: }
1018: }
1019: /* oWeight = Ksm1WeightExpressionToVec(oWeight); */
1.1 maekawa 1020: if (n >= 2*N0) errorKan1("%s\n","oInitW(): the size of the second argument is invalid.");
1021: for (i=0; i<n; i++) {
1022: ow = getoa(oWeight,i);
1.7 takayama 1023: if (ow.tag == SuniversalNumber) {
1024: ow = KpoInteger(coeffToInt(ow.lc.universalNumber));
1025: }
1.1 maekawa 1026: if (ow.tag != Sinteger) {
1027: errorKan1("%s\n","oInitW(): the entries of the second argument must be integers.");
1028: }
1029: w[i] = KopInteger(ow);
1030: }
1.7 takayama 1031: if (shiftvec) {
1032: ssize = getoaSize(oShift);
1033: s = (int *)sGC_malloc(sizeof(int)*(ssize+1));
1034: if (s == NULL) errorKan1("%s\n","oInitW() no more memory.");
1035: for (i=0; i<ssize; i++) {
1036: ow = getoa(oShift,i);
1037: if (ow.tag == SuniversalNumber) {
1038: ow = KpoInteger(coeffToInt(ow.lc.universalNumber));
1039: }
1040: if (ow.tag != Sinteger) {
1041: errorKan1("%s\n","oInitW(): the entries of shift vector must be integers.");
1042: }
1043: s[i] = KopInteger(ow);
1044: }
1045: }
1046:
1.1 maekawa 1047: switch(ob.tag) {
1048: case Spoly:
1049: f = KopPOLY(ob);
1.7 takayama 1050: if (shiftvec) {
1051: return( KpoPOLY(POLYToInitWS(f,w,s)));
1052: }else{
1053: return( KpoPOLY(POLYToInitW(f,w)));
1054: }
1.1 maekawa 1055: break;
1.7 takayama 1056: case Sarray:
1057: m = getoaSize(ob);
1058: f = objArrayToPOLY(ob);
1059: /* printf("1.%s\n",POLYToString(f,'*',1)); */
1060: if (shiftvec) {
1061: f = POLYToInitWS(f,w,s);
1062: }else{
1063: f = POLYToInitW(f,w);
1064: }
1065: /* printf("2.%s\n",POLYToString(f,'*',1)); */
1066:
1067: return POLYtoObjArray(f,m);
1.1 maekawa 1068: default:
1.7 takayama 1069: errorKan1("%s\n","oInitW(): Argument must be polynomial or a vector of polynomials");
1.1 maekawa 1070: break;
1071: }
1072: }
1.7 takayama 1073:
1074: POLY objArrayToPOLY(struct object ob) {
1075: int m;
1076: POLY f;
1077: POLY t;
1078: int i,n;
1079: struct ring *ringp;
1080: if (ob.tag != Sarray) errorKan1("%s\n", "objArrayToPOLY() the argument must be an array.");
1081: m = getoaSize(ob);
1082: ringp = NULL;
1083: f = POLYNULL;
1084: for (i=0; i<m; i++) {
1085: if (getoa(ob,i).tag != Spoly) errorKan1("%s\n","objArrayToPOLY() elements must be a polynomial.");
1086: t = KopPOLY(getoa(ob,i));
1087: if (t ISZERO) {
1088: }else{
1089: if (ringp == NULL) {
1090: ringp = t->m->ringp;
1091: n = ringp->n;
1.8 takayama 1092: if (n - ringp->nn <= 0) errorKan1("%s\n","Graduation variable in D is not given.");
1.7 takayama 1093: }
1094: t = (*mpMult)(cxx(1,n-1,i,ringp),t);
1095: f = ppAddv(f,t);
1096: }
1097: }
1098: return f;
1099: }
1100:
1101: struct object POLYtoObjArray(POLY f,int size) {
1102: struct object rob;
1103: POLY *pa;
1104: int d,n,i;
1105: POLY t;
1106: if (size < 0) errorKan1("%s\n","POLYtoObjArray() invalid size.");
1107: rob = newObjectArray(size);
1108: pa = (POLY *) sGC_malloc(sizeof(POLY)*(size+1));
1109: if (pa == NULL) errorKan1("%s\n","POLYtoObjArray() no more memory.");
1110: for (i=0; i<size; i++) {
1111: pa[i] = POLYNULL;
1112: putoa(rob,i,KpoPOLY(pa[i]));
1113: }
1114: if (f == POLYNULL) {
1115: return rob;
1116: }
1117: n = f->m->ringp->n;
1118: while (f != POLYNULL) {
1119: d = f->m->e[n-1].x;
1120: if (d >= size) errorKan1("%s\n","POLYtoObjArray() size is too small.");
1.8 takayama 1121: t = newCell(coeffCopy(f->coeffp),monomialCopy(f->m));
1.7 takayama 1122: i = t->m->e[n-1].x;
1123: t->m->e[n-1].x = 0;
1124: pa[i] = ppAddv(pa[i],t); /* slow to add from the top. */
1125: f = f->next;
1126: }
1127: for (i=0; i<size; i++) {
1128: putoa(rob,i,KpoPOLY(pa[i]));
1129: }
1130: return rob;
1131: }
1132:
1.8 takayama 1133: struct object KordWsAll(ob,oWeight)
1134: struct object ob;
1135: struct object oWeight;
1136: {
1137: POLY f;
1138: struct object rob;
1139: int w[2*N0];
1140: int n,i;
1141: struct object ow;
1142: int shiftvec;
1143: struct object oShift;
1144: int *s;
1145: int ssize,m;
1146:
1147: shiftvec = 0;
1148: s = NULL;
1149:
1150: if (oWeight.tag != Sarray) {
1151: errorKan1("%s\n","ordWsAll(): the second argument must be array.");
1152: }
1153: n = getoaSize(oWeight);
1154: if (n == 0) {
1155: m = getoaSize(ob);
1156: f = objArrayToPOLY(ob);
1157: f = head(f);
1158: return POLYtoObjArray(f,m);
1159: }
1160: if (getoa(oWeight,0).tag == Sarray) {
1161: if (n != 2) errorKan1("%s\n","ordWsAll(): the size of the second argument should be 2.");
1162: shiftvec = 1;
1163: oShift = getoa(oWeight,1);
1164: oWeight = getoa(oWeight,0);
1165: if (oWeight.tag != Sarray) {
1166: errorKan1("%s\n","ordWsAll(): the weight vector must be array.");
1167: }
1168: n = getoaSize(oWeight);
1169: if (oShift.tag != Sarray) {
1170: errorKan1("%s\n","ordWsAll(): the shift vector must be array.");
1171: }
1172: }
1173: /* oWeight = Ksm1WeightExpressionToVec(oWeight); */
1174: if (n >= 2*N0) errorKan1("%s\n","ordWsAll(): the size of the second argument is invalid.");
1175: for (i=0; i<n; i++) {
1176: ow = getoa(oWeight,i);
1177: if (ow.tag == SuniversalNumber) {
1178: ow = KpoInteger(coeffToInt(ow.lc.universalNumber));
1179: }
1180: if (ow.tag != Sinteger) {
1181: errorKan1("%s\n","ordWsAll(): the entries of the second argument must be integers.");
1182: }
1183: w[i] = KopInteger(ow);
1184: }
1185: if (shiftvec) {
1186: ssize = getoaSize(oShift);
1187: s = (int *)sGC_malloc(sizeof(int)*(ssize+1));
1188: if (s == NULL) errorKan1("%s\n","ordWsAll() no more memory.");
1189: for (i=0; i<ssize; i++) {
1190: ow = getoa(oShift,i);
1191: if (ow.tag == SuniversalNumber) {
1192: ow = KpoInteger(coeffToInt(ow.lc.universalNumber));
1193: }
1194: if (ow.tag != Sinteger) {
1195: errorKan1("%s\n","ordWsAll(): the entries of shift vector must be integers.");
1196: }
1197: s[i] = KopInteger(ow);
1198: }
1199: }
1200:
1201: switch(ob.tag) {
1202: case Spoly:
1203: f = KopPOLY(ob);
1204: if (f == POLYNULL) errorKan1("%s\n","ordWsAll(): the argument is 0");
1205: if (shiftvec) {
1206: return( KpoInteger(ordWsAll(f,w,s)));
1207: }else{
1208: return( KpoInteger(ordWsAll(f,w,(int *) NULL)));
1209: }
1210: break;
1211: case Sarray:
1212: m = getoaSize(ob);
1213: f = objArrayToPOLY(ob);
1214: if (f == POLYNULL) errorKan1("%s\n","ordWsAll(): the argument is 0");
1215: if (shiftvec) {
1216: return KpoInteger(ordWsAll(f,w,s));
1217: }else{
1218: return KpoInteger(ordWsAll(f,w,(int *)NULL));
1219: }
1220: default:
1221: errorKan1("%s\n","ordWsAll(): Argument must be polynomial or a vector of polynomials");
1222: break;
1223: }
1224: }
1.1 maekawa 1225:
1226: int KpolyLength(POLY f) {
1227: int size;
1228: if (f == POLYNULL) return(1);
1229: size = 0;
1230: while (f != POLYNULL) {
1231: f = f->next;
1232: size++;
1233: }
1234: return(size);
1235: }
1236:
1237: int validOutputOrder(int ord[],int n) {
1238: int i,j,flag;
1239: for (i=0; i<n; i++) {
1240: flag = 0;
1241: for (j=0; j<n; j++) {
1242: if (ord[j] == i) flag = 1;
1243: }
1244: if (flag == 0) return(0); /* invalid */
1245: }
1246: return(1);
1247: }
1248:
1249: struct object KsetOutputOrder(struct object ob, struct ring *rp)
1250: {
1251: int n,i;
1252: struct object ox;
1253: struct object otmp;
1254: int *xxx;
1255: int *ddd;
1256: if (ob.tag != Sarray) {
1257: errorKan1("%s\n","KsetOutputOrder(): the argument must be of the form [x y z ...]");
1258: }
1259: n = rp->n;
1260: ox = ob;
1261: if (getoaSize(ox) != 2*n) {
1262: errorKan1("%s\n","KsetOutputOrder(): 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.");
1263: }
1264: xxx = (int *)sGC_malloc(sizeof(int)*n*2);
1265: if (xxx == NULL ) {
1266: errorKan1("%s\n","KsetOutputOrder(): no more memory.");
1267: }
1268: for (i=0; i<2*n; i++) {
1269: otmp = getoa(ox,i);
1270: if(otmp.tag != Sinteger) {
1271: errorKan1("%s\n","KsetOutputOrder(): elements must be integers.");
1272: }
1273: xxx[i] = KopInteger(otmp);
1274: }
1275: if (!validOutputOrder(xxx,2*n)) {
1276: errorKan1("%s\n","KsetOutputOrder(): Invalid output order for variables.");
1277: }
1278: rp->outputOrder = xxx;
1279: return(ob);
1280: }
1281:
1282: struct object KschreyerSkelton(struct object g)
1283: {
1284: struct object rob;
1285: struct object ij;
1286: struct object ab;
1287: struct object tt;
1288: struct arrayOfPOLY *ap;
1289: struct arrayOfMonomialSyz ans;
1290: int k;
1291: rob.tag = Snull;
1292: if (g.tag != Sarray) {
1293: errorKan1("%s\n","KschreyerSkelton(): argument must be an array of polynomials.");
1294: }
1295:
1296: ap = arrayToArrayOfPOLY(g);
1297: ans = schreyerSkelton(*ap);
1298:
1299: rob = newObjectArray(ans.size);
1300: for (k=0; k<ans.size; k++) {
1301: ij = newObjectArray(2);
1302: putoa(ij,0, KpoInteger(ans.p[k]->i));
1303: putoa(ij,1, KpoInteger(ans.p[k]->j));
1304: ab = newObjectArray(2);
1305: putoa(ab,0, KpoPOLY(ans.p[k]->a));
1306: putoa(ab,1, KpoPOLY(ans.p[k]->b));
1307: tt = newObjectArray(2);
1308: putoa(tt,0, ij);
1309: putoa(tt,1, ab);
1310: putoa(rob,k,tt);
1311: }
1312: return(rob);
1313: }
1314:
1315: struct object KisOrdered(struct object of)
1316: {
1317: if (of.tag != Spoly) {
1318: errorKan1("%s\n","KisOrdered(): argument must be a polynomial.");
1319: }
1320: if (isOrdered(KopPOLY(of))) {
1321: return(KpoInteger(1));
1322: }else{
1323: return(KpoInteger(0));
1324: }
1325: }
1326:
1327: struct object KvectorToSchreyer_es(struct object obarray)
1328: {
1329: int m,i;
1330: int nn;
1331: POLY f;
1332: POLY g;
1333: struct object ob;
1334: struct ring *rp;
1335: if (obarray.tag != Sarray) {
1336: errorKan1("%s\n","KvectorToSchreyer_es(): argument must be an array of polynomials.");
1337: }
1338: m = getoaSize(obarray);
1339: f = POLYNULL;
1340: for (i=0; i<m; i++) {
1341: ob = getoa(obarray,i);
1342: if (ob.tag != Spoly) {
1343: errorKan1("%s\n","KvectorToSchreyer_es(): each element of the array must be a polynomial.");
1344: }
1345: g = KopPOLY(ob);
1346: if (g != POLYNULL) {
1347: rp = g->m->ringp;
1348: nn = rp->nn;
1349: /* g = es^i g */
1350: g = mpMult_poly(cxx(1,nn,i,rp), g);
1351: if (!isOrdered(g)) {
1.2 takayama 1352: errorKan1("%s\n","KvectorToSchreyer_es(): given polynomial is not ordered properly by the given Schreyer order.");
1.1 maekawa 1353: }
1354: f = ppAdd(f,g);
1355: }
1356: }
1357: return(KpoPOLY(f));
1.3 takayama 1358: }
1359:
1360: int objToInteger(struct object ob) {
1361: if (ob.tag == Sinteger) {
1.5 takayama 1362: return KopInteger(ob);
1.3 takayama 1363: }else if (ob.tag == SuniversalNumber) {
1.5 takayama 1364: return(coeffToInt(KopUniversalNumber(ob)));
1.3 takayama 1365: }else {
1.5 takayama 1366: errorKan1("%s\n","objToInteger(): invalid argument.");
1.3 takayama 1367: }
1.1 maekawa 1368: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>