Annotation of OpenXM/src/k097/debug/ahg2.k, Revision 1.1.1.1
1.1 maekawa 1:
2: /* SSWork/yacc/debug/ahg.k
3: /* cf. debug/toric0.k */
4: /* toric の generator を求める関数.
5: A-hypergeometric の indicial ideal を求める関数.
6: */
7: ShimomuraSpecial = true ; OnePath= true;
8: Vvv = false;
9: SetRingVariables_Verbose = false;
10: def void QuietKan() {
11: sm1(" [(KanGBmessage) 0] system_variable ");
12: }
13:
14: def testhg1() {
15: a = [[1,1,1,1,1,1],
16: [0,0,0,1,1,1],
17: [0,1,0,0,1,0],
18: [0,0,1,0,0,1]];
19: return(idhg(a));
20: }
21:
22: def testhg2() {
23: a = [[1,1,1,1,1],
24: [0,2,3,4,3],
25: [0,1,1,0,2]];
26: return(idhg(a));
27: }
28:
29: def idhg(a) {
30: local a,ans,rd,i,ans2,ans3,n,ff,d,zlist;
31: ans = toric(a);
32: if (ShimomuraSpecial) {
33: /* 先に, toric の initial part をとってしまう. */
34: /* 本当は, FW の initial part をとるべきなのかも? */
35: if (Vvv) {Println("-------- S-special ---------");}
36: ans = Map(ans,"Init");
37: }
38: ans = Map(ans,"ToString");
39: if (Vvv) {Println(ans);}
40:
41: rd = RingDonIndexedVariables("z",Length(a[0])+1+Length(a));
42: /* 4 秒程度かかる. */
43: ans = Map(ans,"Poly");
44: n = Length(a[0]); d = Length(a);
45: ans2 = NewArray(Length(ans)); /* ans2 には, toric */
46: PSfor (i=0; i< Length(ans); i++) {
47: ans2[i] = ztoDz(ans[i],n);
48: }
49: if (Vvv) {Println(ans2);}
50: ans3 = atolin(a); /* ans3 には, 一次式 */
51: if (Vvv) {Println(ans3);}
52: ff = Map(Join(ans2,ans3),"ToString");
53: ans = zindicial(ff,n,d);
54: zlist = [ ];
55: PSfor(i= n; i<n+d+1; i++) {
56: zlist = Append(zlist,Indexed("z",i));
57: }
58: return([ans,zlist]);
59: }
60:
61: def toric0_toMonom(aa,i,offset, ring)
62: {
63: local j,ans,m;
64: m = Length(aa);
65: ans = PolyR("1",ring);
66: for (j=0; j<m; j++) {
67: ans = ans*(z[offset+j]^(aa[j,i]));
68: }
69: return(ans);
70: }
71:
72:
73: def toric(aa) {
74: local i,j,rz,n,d,ideal,ans,univ,rule,nn,weight,elim;
75: d = Length(aa); n = Length(aa[0]);
76: if (Vvv) {Println(aa);}
77:
78: weight = [ ]; elim = [ ];
79: PSfor (i= n; i< n+d; i++) {
80: weight = Join(weight,[Indexed("z",i), 1]);
81: elim = Append(elim, Indexed("z",i));
82: }
83: weight = Append([weight],[Indexed("z",n-1),1]);
84: if (Vvv) {Println(weight); Println(elim);}
85:
86: rz = RingPonIndexedVariables("z",n+d, weight); /* 4 秒程度かかる. */
87: /* z[0], ..., z[n-1], ... , z[n+d]*/
88: ideal = [ ];
89: PSfor (i=0; i< n; i++) {
90: ideal = Append(ideal, z[i] - toric0_toMonom(aa,i,n,rz));
91: }
92: if (Vvv) {
93: Println(" --------- input ideal -------------");
94: Print(" z["); Print( n ); Print( "] --- z["); Print( n+d-1);
95: Println("] should be eliminated.");
96: Println(ideal);
97: }
98:
99: ans = Groebner(ideal);
100: if (Vvv) {Println(" -------------- gb is ----------------- "); Println(ans);}
101: ans = Eliminatev(ans,elim);
102: if (Vvv) {Println(" ------------ eliminated -------------- "); Println(ans);}
103:
104: rule = [[h, PolyR("1",rz) ] ];
105: nn = Length(ans); univ = [ ];
106: PSfor (i=0; i<nn; i++) {
107: univ = Append(univ,Replace(ans[i],rule));
108: }
109: ans = ReducedBase(univ);
110: if (Vvv) {
111: Println(" ----------- removed redundant elements ----------- ");
112: Println(" ---------- generators of the toric ideal are ----- ");
113: Println(ans);
114: Println(" ");
115: }
116: return(ans);
117: }
118:
119: def zindicial0(input,n,m) {
120: local rz,weight, ww,i,rule,zinverse,m,d,ans,elim,tmp;
121: if (!OnePath) {
122: ww = [ ]; elim = [ ];
123: weight = [[Indexed("z",n),1]];
124: if (Vvv) {Print("-------- weight ---------: "); Println(weight);}
125: rz = RingDonIndexedVariables("z",n+1+m, weight);
126: z = NewArray(n+1+m); Dz = NewArray(n+1+m);
127: PSfor(i=0; i<n+1+m; i++) {
128: z[i] = PolyR(Indexed("z",i),rz);
129: Dz[i] = PolyR(Indexed("Dz",i),rz);
130: }
131: input = Mapto(input,rz);
132: if (Vvv) {Println("------------ input ------------"); Println(input);}
133:
134: /* F-homogenization. z[0], ..., z[n-1],
135: z[n] is the homogenization variable*/
136: /* z[n]^(-1) とは書けないのはつらい. 1 を戻すので bug ともいえる. */
137: zinverse = PolyR(AddString([Indexed("z",n),"^(-1)"]),rz);
138: rule = [[Dz[n-1], Dz[n-1]*z[n]], [z[n-1],z[n-1]*zinverse]];
139: input = Replace(input,rule);
140: m = Length(input);
141: PSfor (i=0; i<m; i++) {
142: d = -Degree(Replace(input[i],[[z[n],zinverse]]),z[n]);
143: if (d < 0) {
144: input[i] = z[n]^(-d)*input[i];
145: }
146: }
147: if (Vvv) {Print("------ input : "); Println(input);}
148: ans = GroebnerTime(input);
149: m = Length(ans);
150: PSfor (i=0; i<m; i++) {
151: /* FW principal part をとる. */
152: /* ans[i] = Init_w(ans[i],[z[n]],[1]); この関数は遅い. */
153: tmp = Coefficients(ans[i],z[n]);
154: ans[i] = tmp[1,0];
155: }
156: if (Vvv) {Print("--------FW principal parts : ");Println(ans);}
157: /* もう一回, GB の計算. */
158: input = Map(ans,"ToString");
159: }
160:
161: /* もう一回, GB の計算. */
162: ww = [ ]; elim = [ ];
163: /* z[n+1], ..., z[n+m] がパラメータ変数 */
164: /* Dz[0] --- Dz[n-2], z[0] --- z[n-2] を消去する. */
165: PSfor (i=0; i<n-1; i++) {
166: ww = Join(ww,[Indexed("Dz",i), 1]);
167: /* ww = Join(ww,[Indexed("z",i), 1]); */
168: if (i != n-1) {
169: elim = Append(elim,Indexed("Dz",i));
170: /* elim = Append(elim,Indexed("z",i)); */
171: }
172: }
173: weight = [[Indexed("z",n),1] , ww];
174: if (Vvv) {Print("-------- weight ---------: "); Println(weight);}
175: rz = RingDonIndexedVariables("z",n+1+m, weight);
176: z = NewArray(n+1+m); Dz = NewArray(n+1+m);
177: PSfor(i=0; i<n+1+m; i++) { /* これをもう一度やらないと, mklib で sm1 に
178: したときのみ z が undefined
179: になる. どうしてか? */
180: z[i] = PolyR(Indexed("z",i),rz);
181: Dz[i] = PolyR(Indexed("Dz",i),rz);
182: }
183: input = Mapto(input,rz);
184: if (OnePath) {
185: /* F-homogenization. z[0], ..., z[n-1],
186: z[n] is the homogenization variable*/
187: /* z[n]^(-1) とは書けないのはつらい. 1 を戻すので bug ともいえる. */
188: zinverse = PolyR(AddString([Indexed("z",n),"^(-1)"]),rz);
189: rule = [[Dz[n-1], Dz[n-1]*z[n]], [z[n-1],z[n-1]*zinverse]];
190: input = Replace(input,rule);
191: m = Length(input);
192: PSfor (i=0; i<m; i++) {
193: d = -Degree(Replace(input[i],[[z[n],zinverse]]),z[n]);
194: if (d < 0) {
195: input[i] = z[n]^(-d)*input[i];
196: }
197: }
198: }
199: if (Vvv) {Print("------ input : "); Println(input);}
200: ans = GroebnerTime(input);
201: m = Length(ans);
202: PSfor (i=0; i<m; i++) {
203: /* FW principal part をとる. */
204: /* ans[i] = Init_w(ans[i],[PolyR(Indexed("z",n),rz)],[1]); */
205: tmp = Coefficients(ans[i],z[n]);
206: ans[i] = tmp[1,0];
207: }
208: if (Vvv) {Print("--------FW principal parts : ");Println(ans);}
209:
210:
211:
212: ans = Eliminatev(ans,elim);
213: m = Length(ans);
214: /* h, z[n] を 1 にする. */
215: for (i=0; i<m; i++) {
216: ans[i] = Replace(ans[i],[[h,PolyR("1",rz)],[PolyR(Indexed("z",n),rz),PolyR("1",rz)]]);
217: }
218: if (Vvv) {Println(" "); Println(" ");}
219: return(ans);
220: }
221:
222: def zrho(f,n) {
223: local ans,i,top,w,rz;
224: ans = 0;
225: rz = Ringp(f);
226: while(true) {
227: if ( f == Poly("0")) sm1(" exit ");
228: top = Init(f);
229: f = f-top;
230: w = Exponent(top,[PolyR(Indexed("Dz",n-1),rz)]);
231: top = Replace(top,[[PolyR(Indexed("Dz",n-1),rz),PolyR("1",rz)]])*zipoch(z[n],w[0]);
232: ans = ans + top;
233: }
234: return(ans);
235: }
236:
237: def zipoch(f,w) {
238: local ans,i;
239: ans = 1;
240: PSfor (i=0; i<w; i++) {
241: ans = ans*(f-i);
242: }
243: return(ans);
244: }
245:
246:
247:
248:
249: def zindicial(fff,n,mm) {
250: local ans,n,i,m,r,tmp;
251: ans = zindicial0(fff,n,mm);
252: if (Vvv) {Println(ans);}
253: m = Length(ans);
254: r = [ ];
255: if (Vvv) {
256: Println(AddString(["------ The generic indicial polynomial along z[",
257: ToString(n-1),
258: "] = 0 is the minimal degree polynomial of the following",
259: "polynomials."]));
260: Println(AddString(["z[",ToString(n),"] is equal to s."]));
261: }
262: PSfor (i=0; i<m; i++) {
263: tmp = ans[i];
264: tmp = Replace(tmp,[[Poly(Indexed("z",n-1)),Poly("1")]]);
265: tmp = zrho(tmp,n);
266: if (Vvv) {Print(i); Print(" : ");Println(tmp);}
267: r = Append(r,tmp);
268: }
269: if (Vvv) {Println(" ");}
270: return(r);
271: }
272:
273: def ztoDz(f,n) {
274: local rule,i;
275: rule = NewArray(n);
276: PSfor(i=0; i<n; i++) {
277: rule[i] = [z[i],Dz[i]];
278: }
279: return(Replace(f,rule));
280: }
281:
282: /* 行列より A-HG の線形方程式をだす. */
283: def atolin(a) {
284: local d,n,eqs,ans,i,j;
285: d = Length(a);
286: n = Length(a[0]);
287: eqs = NewArray(d);
288: PSfor (i=0; i<d; i++) {
289: ans = 0;
290: PSfor (j=0; j<n; j++) {
291: ans = ans + a[i,j]*z[j]*Dz[j];
292: }
293: ans = ans - z[n+1+i];
294: eqs[i] = ans;
295: }
296: return(eqs);
297: }
298:
299:
300:
301:
302: sm1(" ; ");
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>