Annotation of OpenXM/src/k097/debug/toric0.k, Revision 1.1
1.1 ! maekawa 1:
! 2: /* SSWork/yacc/ip-k/ex3.ccc, 1996, 8/12. This is original. ---> */
! 3: /* debug/toric0.k */
! 4: /* graver basis を求める関数.
! 5: toric の generator を求める関数.
! 6: A-hypergeometric の Fourier 変換の indicial を求める関数.
! 7: */
! 8:
! 9:
! 10: def toric0_toMonom(aa,i,offset, ring)
! 11: {
! 12: local j,ans,m;
! 13: m = Length(aa);
! 14: ans = PolyR("1",ring);
! 15: for (j=0; j<m; j++) {
! 16: ans = ans*(z[offset+j]^(aa[j,i]));
! 17: }
! 18: return(ans);
! 19: }
! 20:
! 21: def testgraver() {
! 22: local a,ans;
! 23: a = [[1,1,1,1,1,1,1],
! 24: [2,3,2,2,2,0,1],
! 25: [2,2,3,2,2,0,1],
! 26: [2,2,2,3,2,0,1],
! 27: [1,1,1,1,2,0,1]];
! 28: ans = Graver(a);
! 29: return(ans); /* degree 33. About 1 hour? cf. this/Mirror/wp22211.ml */
! 30: }
! 31:
! 32: def testgraver2() {
! 33: local a,ans;
! 34: a = [[1,1,1,1,1,1],
! 35: [0,0,0,1,1,1],
! 36: [0,1,0,0,1,0],
! 37: [0,0,1,0,0,1]];
! 38: ans = Graver(a);
! 39: return(ans);
! 40: }
! 41:
! 42:
! 43:
! 44: HelpAdd(["Graver",
! 45: ["Graver(a) (matrix a ) returns a graver basis of the affine toric ideal",
! 46: "defined by the matrix << a >>.",
! 47: "It defines a ring of variables z[0], z[1], ..., z[n-1], ..... and ",
! 48: "the output belongs to this ring.",
! 49: "Example: Graver([[1,1,1,1],[0,1,2,3]]):",
! 50: "[ -z[1]^2+z[2]*z[0] , -z[2]^2+z[3]*z[1] , -z[2]*z[1]+z[3]*z[0] ,",
! 51: " -z[1]^3+z[3]*z[0]^2 , -z[2]^3+z[3]^2*z[0] ] "
! 52: ]]);
! 53:
! 54: def Graver(a) {
! 55: local aa,i,j,rz,n,d,ideal,ans,univ,rule,nn,weight,elim;
! 56: d = Length(a); n = Length(a[0]);
! 57: aa = NewMatrix(d+n,2*n);
! 58: for (i=0; i<d; i++) {
! 59: for (j=0; j<n; j++) {
! 60: aa[i,j] = a[i,j];
! 61: }
! 62: }
! 63: for (i=0; i<n; i++) {
! 64: aa[d+i,i] = 1;
! 65: aa[d+i,n+i] = 1;
! 66: }
! 67: Println(aa);
! 68:
! 69: weight = [ ]; elim = [ ];
! 70: for (i= 2*n; i< 2*n + n+d; i++) {
! 71: weight = Join(weight,[Indexed("z",i), 1]);
! 72: elim = Append(elim, Indexed("z",i));
! 73: }
! 74: Println(weight);
! 75: Println(elim);
! 76:
! 77: rz = RingPonIndexedVariables("z",2*n+d+n, [weight]);
! 78: /* z[0], ..., z[2n-1], ... */
! 79: ideal = [ ];
! 80: for (i=0; i< 2*n; i++) {
! 81: ideal = Append(ideal, z[i] - toric0_toMonom(aa,i,2*n,rz));
! 82: }
! 83: Println(" --------- input ideal -------------");
! 84: Print(" z["); Print( 2*n ); Print( "] --- z["); Print( 2*n+n+d-1);
! 85: Println("] should be eliminated.");
! 86: Println(ideal);
! 87:
! 88: ans = Groebner(ideal);
! 89: Println(" -------------- gb is ----------------- "); Println(ans);
! 90: ans = Eliminatev(ans,elim);
! 91: Println(" ------------ eliminated -------------- "); Println(ans);
! 92:
! 93: rule = [[h, PolyR("1",rz) ] ];
! 94: nn = Length(ans); univ = [ ];
! 95: for (i=0; i<nn; i++) {
! 96: univ = Append(univ,Replace(ans[i],rule));
! 97: }
! 98: ans = ReducedBase(univ);
! 99: Println(" ----------- removed redundant elements ----------- ");
! 100: Println(ans);
! 101:
! 102: rule = [ ];
! 103: for (i= n; i<2*n; i++) {
! 104: rule = Append(rule, [ z[i], PolyR("1",rz)]);
! 105: }
! 106: Println(" ------------ a rule for replacement ------------ ");
! 107: Println(rule);
! 108:
! 109: univ = [ ];
! 110: nn = Length( ans );
! 111: for (i=0; i<nn; i++) {
! 112: univ = Append(univ,Replace(ans[i],rule));
! 113: }
! 114: Println(" ------------ graver basis is ------------ ");
! 115: Println(univ);
! 116: Println(" ");
! 117: return(univ);
! 118: }
! 119:
! 120:
! 121: def toric(aa) {
! 122: local i,j,rz,n,d,ideal,ans,univ,rule,nn,weight,elim;
! 123: d = Length(aa); n = Length(aa[0]);
! 124: Println(aa);
! 125:
! 126: weight = [ ]; elim = [ ];
! 127: for (i= n; i< n+d; i++) {
! 128: weight = Join(weight,[Indexed("z",i), 1]);
! 129: elim = Append(elim, Indexed("z",i));
! 130: }
! 131: Println(weight);
! 132: Println(elim);
! 133:
! 134: rz = RingPonIndexedVariables("z",n+d, [weight]);
! 135: /* z[0], ..., z[n-1], ... , z[n+d]*/
! 136: ideal = [ ];
! 137: for (i=0; i< n; i++) {
! 138: ideal = Append(ideal, z[i] - toric0_toMonom(aa,i,n,rz));
! 139: }
! 140: Println(" --------- input ideal -------------");
! 141: Print(" z["); Print( n ); Print( "] --- z["); Print( n+d-1);
! 142: Println("] should be eliminated.");
! 143: Println(ideal);
! 144:
! 145: ans = Groebner(ideal);
! 146: Println(" -------------- gb is ----------------- "); Println(ans);
! 147: ans = Eliminatev(ans,elim);
! 148: Println(" ------------ eliminated -------------- "); Println(ans);
! 149:
! 150: rule = [[h, PolyR("1",rz) ] ];
! 151: nn = Length(ans); univ = [ ];
! 152: for (i=0; i<nn; i++) {
! 153: univ = Append(univ,Replace(ans[i],rule));
! 154: }
! 155: ans = ReducedBase(univ);
! 156: Println(" ----------- removed redundant elements ----------- ");
! 157: Println(" ---------- generators of the toric ideal are ----- ");
! 158: Println(ans);
! 159: Println(" ");
! 160: return(ans);
! 161: }
! 162:
! 163: def zindicial0(input,n,m) {
! 164: local rz,weight, ww,i,rule,zinverse,m,d,ans,elim;
! 165: ww = [ ]; elim = [ ];
! 166: /* z[n+1], ..., z[n+m] がパラメータ変数 */
! 167: /* Dz[0] --- Dz[n-2], z[0] --- z[n-2] を消去する. */
! 168: for (i=0; i<n-1; i++) {
! 169: ww = Join(ww,[Indexed("Dz",i), 1]);
! 170: ww = Join(ww,[Indexed("z",i), 1]);
! 171: if (i != n-1) {
! 172: elim = Append(elim,Indexed("Dz",i));
! 173: elim = Append(elim,Indexed("z",i));
! 174: }
! 175: }
! 176: weight = [[Indexed("z",n),1] , ww];
! 177: Print("-------- weight ---------: "); Println(weight);
! 178: rz = RingDonIndexedVariables("z",n+1+m, weight);
! 179: input = Mapto(input,rz);
! 180: Println("------------ input ------------"); Println(input);
! 181:
! 182: /* F-homogenization. z[0], ..., z[n-1],
! 183: z[n] is the homogenization variable*/
! 184: /* z[n]^(-1) とは書けないのはつらい. 1 を戻すので bug ともいえる. */
! 185: zinverse = PolyR(AddString([Indexed("z",n),"^(-1)"]),rz);
! 186: rule = [[Dz[n-1], Dz[n-1]*z[n]], [z[n-1],z[n-1]*zinverse]];
! 187: input = Replace(input,rule);
! 188: m = Length(input);
! 189: for (i=0; i<m; i++) {
! 190: d = -Degree(Replace(input[i],[[z[n],zinverse]]),z[n]);
! 191: if (d < 0) {
! 192: input[i] = z[n]^(-d)*input[i];
! 193: }
! 194: }
! 195: Print("------ input : "); Println(input);
! 196: ans = Groebner(input);
! 197: m = Length(ans);
! 198: for (i=0; i<m; i++) {
! 199: /* FW principal part をとる. */
! 200: ans[i] = Init_w(ans[i],[z[n]],[1]);
! 201: }
! 202: Print("--------FW principal parts : ");Println(ans);
! 203: ans = Eliminatev(ans,elim);
! 204: m = Length(ans);
! 205: /* h, z[n] を 1 にする. */
! 206: for (i=0; i<m; i++) {
! 207: ans[i] = Replace(ans[i],[[h,PolyR("1",rz)],[z[n],PolyR("1",rz)]]);
! 208: }
! 209: Println(" "); Println(" ");
! 210: return(ans);
! 211: }
! 212:
! 213: def zrho(f,n) {
! 214: local ans,i,top,w,rz;
! 215: ans = 0;
! 216: rz = Ringp(f);
! 217: while(true) {
! 218: if ( f == Poly("0")) sm1(" exit ");
! 219: top = Init(f);
! 220: f = f-top;
! 221: w = Exponent(top,[Dz[n-1]]);
! 222: top = Replace(top,[[Dz[n-1],PolyR("1",rz)]])*zipoch(z[n],w[0]);
! 223: ans = ans + top;
! 224: }
! 225: return(ans);
! 226: }
! 227:
! 228: def zipoch(f,w) {
! 229: local ans,i;
! 230: ans = 1;
! 231: for (i=0; i<w; i++) {
! 232: ans = ans*(f-i);
! 233: }
! 234: return(ans);
! 235: }
! 236:
! 237:
! 238: fff = ["z[0]*Dz[0]+z[1]*Dz[1]+z[2]*Dz[2]+z[3]*Dz[3]-z[5]",
! 239: " z[1]*Dz[1] +z[3]*Dz[3]-z[6]",
! 240: " z[2]*Dz[2]+z[3]*Dz[3]+z[7]",
! 241: "z[0]*z[3]-z[1]*z[2]"];
! 242: /* z[4] はつかったらだめよ. */
! 243: /* Println(" type in zindicial0(fff,4,3); "); */
! 244:
! 245: def foo2() {
! 246: local ans,n,i,m,r,tmp;
! 247: ans = zindicial0(fff,4,3); n = 4;
! 248: Println(ans);
! 249: m = Length(ans);
! 250: r = [ ];
! 251: for (i=0; i<m; i++) {
! 252: tmp = ans[i];
! 253: tmp = Replace(tmp,[[z[n-1],Poly("1")]]);
! 254: tmp = zrho(tmp,n);
! 255: Print(i); Print(" : ");Println(tmp);
! 256: r = Append(r,tmp);
! 257: }
! 258: return(r);
! 259: }
! 260:
! 261: /* Println("Type in foo2()."); */
! 262:
! 263: def zindicial(fff,n,mm) {
! 264: local ans,n,i,m,r,tmp;
! 265: ans = zindicial0(fff,n,mm);
! 266: Println(ans);
! 267: m = Length(ans);
! 268: r = [ ];
! 269: Println(AddString(["------ The indicial polynomial along z[",
! 270: ToString(n-1),
! 271: "] = 0 is the minimal degree polynomial of the following",
! 272: "polynomials."]));
! 273: Println(AddString(["z[",ToString(n),"] is equal to s."]));
! 274: for (i=0; i<m; i++) {
! 275: tmp = ans[i];
! 276: tmp = Replace(tmp,[[z[n-1],Poly("1")]]);
! 277: tmp = zrho(tmp,n);
! 278: Print(i); Print(" : ");Println(tmp);
! 279: r = Append(r,tmp);
! 280: }
! 281: Println(" ");
! 282: return(r);
! 283: }
! 284:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>