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