Annotation of OpenXM/src/kan96xx/Kan/sugar.c, Revision 1.1.1.1
1.1 maekawa 1: #include <stdio.h>
2: #include "datatype.h"
3: #include "extern2.h"
4: #include "gradedset.h"
5:
6: #define mymax(p,q) (p>q?p:q)
7:
8: static int DebugReduction = 0;
9:
10: POLY reduction_sugar(POLY f,struct gradedPolySet *gset,int needSyz,
11: struct syz0 *syzp,int sugarGrade)
12: {
13: int reduced,reduced1,reduced2;
14: int grd;
15: struct polySet *set;
16: POLY cf,syz;
17: int i;
18: POLY cc,cg;
19: int gradelimit;
20: int tdegm;
21:
22: extern struct ring *CurrentRingp;
23: struct ring *rp;
24:
25: if (needSyz) {
26: if (f ISZERO) { rp = CurrentRingp; } else { rp = f->m->ringp; }
27: cf = cxx(1,0,0,rp);
28: syz = ZERO;
29: }
30:
31: reduced = 0; /* no */
32: /* Take minimum */
33: gradelimit = (gset->maxGrade < sugarGrade+1 ?gset->maxGrade: sugarGrade+1);
34: do {
35: reduced1 = 0; /* no */
36: grd = 0;
37: while (grd < gset->maxGrade) {
38: set = gset->polys[grd];
39: do {
40: reduced2 = 0; /* no */
41: for (i=0; i<set->size; i++) {
42: if (f ISZERO) goto ss;
43: if ((*isReducible)(f,set->g[i])) {
44: tdegm = grade_gen(f) - grade_gen(set->g[i]);
45: /* Reduce if and only if sugarGrade does not increase. */
46: if (tdegm+grd <= sugarGrade) {
47: f = reduction1_sugar(f,set->g[i],needSyz,&cc,&cg,sugarGrade);
48: if (needSyz) {
49: cf = ppMult(cc,cf);
50: syz = cpMult(toSyzCoeff(cc),syz);
51: syz = ppAddv(syz,toSyzPoly(cg,grd,i));
52: }
53: reduced = reduced1 = reduced2 = 1; /* yes */
54: }
55: }
56: }
57: } while (reduced2 != 0);
58: grd++;
59: }
60: }while (reduced1 != 0);
61:
62: ss: ;
63: if (needSyz) {
64: syzp->cf = cf; /* cf is in the CurrentRingp */
65: syzp->syz = syz; /* syz is in the SyzRingp */
66: }
67: return(f);
68: }
69:
70: POLY reduction1_sugar(f,g,needSyz,c,h,sugarGrade)
71: POLY f;
72: POLY g;
73: int needSyz;
74: POLY *c; /* set */
75: POLY *h; /* set */
76: int sugarGrade;
77: /* f must be reducible by g. r = c*f + h*g */
78: {
79: extern struct ring *CurrentRingp;
80: struct ring *rp;
81: struct spValue sv;
82: POLY f2;
83: int grd,ggrd,tdegm;
84:
85:
86: if (needSyz) {
87: if (f ISZERO) { rp = CurrentRingp; } else {rp = f->m->ringp; }
88: *c = cxx(1,0,0,rp);
89: *h = ZERO;
90: }
91:
92: sv = (*sp)(f,g);
93: f2 = ppAddv(cpMult((sv.a)->coeffp,f),ppMult(sv.b,g));
94: if (DebugReduction) {
95: printf("c=%s, d=%s, g=%s: f --> c*f + d*g.\n",
96: POLYToString(sv.a,'*',1),POLYToString(sv.b,'*',1),POLYToString(g,'*',1));
97: printf("%s --> %s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1));
98: }
99: f = f2;
100: if (needSyz) {
101: *c = ppMult(sv.a,*c);
102: *h = ppAdd(ppMult(sv.a,*h),sv.b);
103: }
104:
105: grd = grade_sugar(g); ggrd = grade_gen(g);
106: while ((*isReducible)(f,g)) {
107: tdegm = grade_gen(f) - ggrd;
108: /* Reduce if and only if sugarGrade does not increase. */
109: if (tdegm+grd <= sugarGrade) {
110: sv = (*sp)(f,g);
111: f2 = ppAddv(cpMult((sv.a)->coeffp,f),ppMult(sv.b,g));
112: if (DebugReduction) {
113: printf("! c=%s, d=%s, g=%s: f --> c*f + d*g.\n",
114: POLYToString(sv.a,'*',1),POLYToString(sv.b,'*',1),POLYToString(g,'*',1));
115: printf("%s --> %s\n",POLYToString(f,'*',1),POLYToString(f2,'*',1));
116: }
117: f = f2;
118: if (needSyz) {
119: *c = ppMult(sv.a,*c);
120: *h = ppAdd(ppMult(sv.a,*h),sv.b);
121: }
122: }else{
123: break;
124: }
125: }
126: return(f);
127: }
128:
129: int grade_sugar(f)
130: POLY f;
131: {
132: int r;
133: int i,ans;
134: MONOMIAL tf;
135: static int nn,mm,ll,cc,n,m,l,c;
136: static struct ring *cr = (struct ring *)NULL;
137:
138: if (f ISZERO) return(-1);
139: tf = f->m;
140: if (tf->ringp != cr) {
141: n = tf->ringp->n;
142: m = tf->ringp->m;
143: l = tf->ringp->l;
144: c = tf->ringp->c;
145: nn = tf->ringp->nn;
146: mm = tf->ringp->mm;
147: ll = tf->ringp->ll;
148: cc = tf->ringp->cc;
149: cr = tf->ringp;
150: }
151:
152: ans = 0;
153: while (f != NULL) {
154: r = 0;
155: tf = f->m;
156: for (i=0; i<cc; i++) {
157: r += tf->e[i].x;
158: r += tf->e[i].D;
159: }
160: for (i=c; i<ll; i++) {
161: r += tf->e[i].x;
162: r += tf->e[i].D;
163: }
164: for (i=l; i<mm; i++) {
165: r += tf->e[i].x;
166: r += tf->e[i].D;
167: }
168: for (i=m; i<nn; i++) {
169: r += tf->e[i].x;
170: r += tf->e[i].D;
171: }
172: f = f->next;
173: ans = (ans>r?ans:r);
174: }
175: return(ans);
176: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>