source: git/Singular/LIB/gmspoly.lib @ efff2c

spielwiese
Last change on this file since efff2c was efff2c, checked in by Mathias Schulze <mschulze@…>, 21 years ago
*mschulze: bug corrected git-svn-id: file:///usr/local/Singular/svn/trunk@6821 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 10.6 KB
Line 
1///////////////////////////////////////////////////////////////////////////////
2version="$Id: gmspoly.lib,v 1.5 2003-06-27 10:43:44 mschulze Exp $";
3category="Singularities";
4
5info="
6LIBRARY:  gmspoly.lib  Gauss-Manin System of Cohomologically Tame Polynomials
7
8AUTHOR:   Mathias Schulze, email: mschulze@mathematik.uni-kl.de
9
10OVERVIEW: A library to compute invariants related to the the Gauss-Manin system
11          of a cohomologically tame polynomial
12
13PROCEDURES:
14  istame(f);  test if the polynomial f is tame
15  gbasis(f);  a good basis of the Brieskorn lattice of a tame polynomial t
16
17SEE ALSO: gmssing_lib
18
19KEYWORDS: tame polynomial; Gauss-Manin system; Brieskorn lattice;
20          mixed Hodge structure; V-filtration; weight filtration;
21          monodromy; spectrum; spectral pairs; good basis
22";
23
24LIB "linalg.lib";
25LIB "ring.lib";
26
27///////////////////////////////////////////////////////////////////////////////
28
29static proc mindegree(matrix A)
30{
31  int d=-1;
32
33  int i,j;
34  for(i=nrows(A);i>=1;i--)
35  {
36    for(j=ncols(A);j>=1;j--)
37    {
38      if(d==-1||(deg(A[i,j])<d&&deg(A[i,j])>-1))
39      {
40        d=deg(A[i,j]);
41      }
42    }
43  }
44
45  return(d);
46}
47///////////////////////////////////////////////////////////////////////////////
48
49static proc maxdegree(matrix A)
50{
51  int d=-1;
52
53  int i,j;
54  for(i=nrows(A);i>=1;i--)
55  {
56    for(j=ncols(A);j>=1;j--)
57    {
58      if(deg(A[i,j])>d)
59      {
60        d=deg(A[i,j]);
61      }
62    }
63  }
64
65  return(d);
66}
67///////////////////////////////////////////////////////////////////////////////
68
69proc istame(poly f)
70"USAGE:    istame(f); poly f
71RETURN:
72@format
73int k=
74  0;  if f is not tame
75  1;  if f is tame
76@end format
77KEYWORDS: tame polynomial
78EXAMPLE:  example istame; shows examples
79"
80{
81  int d=vdim(std(jacob(f)));
82  def @X=basering;
83  int n=nvars(@X);
84  changechar("@WX","(0,w(1.."+string(n)+"))");
85  ideal J=jacob(imap(@X,f));
86
87  int i;
88  for(i=1;i<=n;i++)
89  {
90    J[i]=J[i]+w(i);
91  }
92  int D=vdim(std(J));
93
94  setring(@X);
95  kill(@WX);
96
97  return(d>0&&d==D);
98}
99example
100{ "EXAMPLE:"; echo=2;
101  ring R=0,(x,y),dp;
102  istame(x2y+x);
103  istame(x3+y3+xy);
104}
105///////////////////////////////////////////////////////////////////////////////
106
107static proc chart(matrix A)
108{
109  A=ideal(homog(transpose(ideal(A)),var(2)));
110  def r=basering;
111  map h=r,1,var(1);
112  return(h(A));
113}
114///////////////////////////////////////////////////////////////////////////////
115
116static proc pidbasis(module M0,module M)
117{
118  int m=nrows(M);
119  int n=ncols(M);
120
121  module L,N;
122  module T=freemodule(m);
123  while(matrix(L)!=matrix(M))
124  {
125    L=M;
126
127    M=T,M;
128    N=transpose(std(transpose(M))); 
129    T=N[1..m];
130    M=N[m+1..ncols(N)];
131
132    M=freemodule(n),transpose(M);
133    N=std(transpose(M));
134    N=transpose(simplify(N,1));
135    M=N[n+1..ncols(N)];
136    M=transpose(M);
137  }
138
139  if(maxdegree(M)>0)
140  {
141    print("   ? module not free");
142    return(module());
143  }
144
145  attrib(M,"isSB",1);
146  N=lift(T,simplify(reduce(M0,M),2));
147
148  return(N);
149}
150///////////////////////////////////////////////////////////////////////////////
151
152static proc vfilt(matrix B,int d)
153{
154  int mu=ncols(B);
155
156  module V=freemodule(mu);
157  module V0=var(1)^(d-1)*freemodule(mu);
158  attrib(V0,"isSB",1);
159  module V1=B;
160  option("redSB");
161  while(size(reduce(V1,V0))>0)
162  {
163    V=std(V0+V1);
164    V0=var(1)^(d-1)*V;
165    attrib(V0,"isSB",1);
166    V1=B*matrix(V1)-var(1)^d*diff(matrix(V1),var(1));
167  }
168  option("noredSB");
169
170  B=lift(V0,B*matrix(V)-var(1)^d*diff(matrix(V),var(1)));
171  list l=eigenvals(B);
172  def e0,s0=l[1..2];
173
174  module U;
175  int i,j,i0,j0,i1,j1,k;
176  for(k=int(e0[ncols(e0)]-e0[1]);k>=1;k--)
177  {
178    U=0;
179    for(i=1;i<=ncols(e0);i++)
180    {
181      U=U+syz(power(jet(B,0)-e0[i],s0[i]));
182    }
183    B=lift(U,B*U);
184    V=V*U;
185
186    for(i0,i=1,1;i0<=ncols(e0);i0++)
187    {
188      for(i1=1;i1<=s0[i0];i1,i=i1+1,i+1)
189      {
190        for(j0,j=1,1;j0<=ncols(e0);j0++)
191        {
192          for(j1=1;j1<=s0[j0];j1,j=j1+1,j+1)
193          {
194            if(leadcoef(e0[i0]-e0[1])>=1&&leadcoef(e0[j0]-e0[1])<1)
195            {
196              B[i,j]=B[i,j]/var(1);
197            }
198            if(leadcoef(e0[i0]-e0[1])<1&&leadcoef(e0[j0]-e0[1])>=1)
199            {
200              B[i,j]=B[i,j]*var(1);
201            }
202          }
203        }
204      }
205    }
206
207    for(i0,i=1,1;i0<=ncols(e0);i0++)
208    {
209      if(leadcoef(e0[i0]-e0[1])>=1)
210      {
211        for(i1=1;i1<=s0[i0];i1,i=i1+1,i+1)
212        {
213          B[i,i]=B[i,i]-1;
214          V[i]=V[i]*var(1);
215        }
216        e0[i0]=e0[i0]-1;
217      }
218      else
219      {
220        i=i+s0[i0];
221      }
222    }
223
224    l=spnf(list(e0,s0));
225    e0,s0=l[1..2];
226  }
227
228  U=0;
229  for(i=1;i<=ncols(e0);i++)
230  {
231    U=U+syz(power(jet(B,0)-e0[i],s0[i]));
232  }
233  B=lift(U,B*U);
234  V=V*U;
235
236  d=mindegree(V);
237  V=V/var(1)^d;
238  B=B+d*matrix(freemodule(mu));
239  for(i=ncols(e0);i>=1;i--)
240  {
241    e0[i]=e0[i]+d;
242  }
243
244  return(e0,s0,V,B);
245}
246///////////////////////////////////////////////////////////////////////////////
247
248static proc spec(ideal e0,intvec s0,module V,matrix B)
249{
250  int mu=ncols(B);
251
252  int i,j,k;
253
254  int d=maxdegree(V);
255  int d0=d;
256  V=chart(V);
257  module U=std(V);
258  while(size(reduce(var(1)^d*freemodule(mu),U))>0)
259  {
260    d++;
261  }
262  if(d>d0)
263  {
264    k=d-d0;
265    B=B-k*freemodule(mu);
266    for(i=1;i<=ncols(e0);i++)
267    {
268      e0[i]=e0[i]-k;
269    }
270  }
271  module G=lift(V,var(1)^d*freemodule(mu));
272  G=std(G);
273  G=simplify(G,1);
274
275  ideal e;
276  intvec s;
277  e[mu]=0;
278  for(j,k=1,1;j<=ncols(e0);j++)
279  {
280    for(i=s0[j];i>=1;i,k=i-1,k+1)
281    {
282      e[k]=e0[j];
283      s[k]=j;
284    }
285  }
286
287  ideal a;
288  a[mu]=0;
289  for(i=1;i<=mu;i++)
290  {
291    a[i]=leadcoef(e[leadexp(G[i])[nvars(basering)+1]])+leadexp(G[i])[1];
292  }
293
294  return(a,e0,e,s,V,B,G);
295}
296///////////////////////////////////////////////////////////////////////////////
297
298static proc fsplit(ideal e0,ideal e,intvec s,module V,matrix B,module G)
299{
300  int mu=ncols(e);
301
302  int i,j,k;
303
304  number n,n0;
305  vector v,v0;
306  list F;
307  for(i=ncols(e0);i>=1;i--)
308  {
309    F[i]=module(matrix(0,mu,1));
310  }
311  for(i=mu;i>=1;i--)
312  {
313    v=G[i];
314    v0=lead(v);
315    n0=leadcoef(e[leadexp(v0)[nvars(basering)+1]])+leadexp(v0)[1];
316    v=v-lead(v);
317    while(v!=0)
318    {
319      n=leadcoef(e[leadexp(v)[nvars(basering)+1]])+leadexp(v)[1];
320      if(n==n0)
321      {
322        v0=v0+lead(v);
323        v=v-lead(v);
324      }
325      else
326      {
327        v=0;
328      }
329    }
330    j=s[leadexp(v0)[nvars(basering)+1]];
331    F[j]=F[j]+v0;
332  }
333
334  matrix B0=jet(B,0);
335  module U,U0,U1,U2;
336  matrix N;
337  for(i=size(F);i>=1;i--)
338  {
339    N=B0-e0[i];
340    U0=0;
341    while(size(F[i])>0)
342    {
343      k=0;
344      U1=jet(F[i],0);
345      while(size(U1)>0)
346      {
347        for(j=ncols(U1);j>=1;j--)
348        {
349          if(size(reduce(U1[j],std(U0)))>0)
350          {
351            U0=U1[j]+U0;
352          }
353        }
354        U1=N*U1;
355        k++;
356      }
357      F[i]=module(F[i]/var(1));
358    }
359    U=U0+U;
360  }
361
362  V=V*U;
363  G=lift(U,G);
364  B=lift(U,B*U);
365
366  return(e,V,B,G);
367}
368///////////////////////////////////////////////////////////////////////////////
369
370static proc glift(ideal e,module V,matrix B,module G)
371{
372  int mu=ncols(e);
373
374  int d=maxdegree(B);
375  B=chart(B);
376  G=std(G);
377  G=simplify(G,1);
378
379  int i,j,k;
380
381  ideal v;
382  for(i=mu;i>=1;i--)
383  {
384    v[i]=e[leadexp(G[i])[nvars(basering)+1]]+leadexp(G[i])[1];
385  }
386
387  number c;
388  matrix g[mu][1];
389  matrix m[mu][1];
390  matrix a[mu][1];
391  matrix A[mu][mu];
392  module M=var(1)^d*G;
393  module N=var(1)*B*matrix(G)+var(1)^(d+2)*diff(matrix(G),var(1));
394  while(size(N)>0)
395  {
396    j=mu;
397    for(k=mu-1;k>=1;k--)
398    {
399      if(N[k]>N[j])
400      {
401        j=k;
402      }
403    }
404
405    i=mu;
406    while(leadexp(M[i])[nvars(basering)+1]!=leadexp(N[j])[nvars(basering)+1])
407    {
408      i--;
409    }
410
411    k=leadexp(N[j])[1]-leadexp(M[i])[1];
412    if(k==0||i==j)
413    {
414      c=leadcoef(N[j])/leadcoef(M[i]);
415      A[i,j]=A[i,j]+c*var(1)^k;
416      N[j]=N[j]-c*var(1)^k*M[i];
417    }
418    else
419    {
420      c=leadcoef(N[j])/leadcoef(M[i])/(1-k-leadcoef(v[i])+leadcoef(v[j]));
421      G[j]=G[j]+c*var(1)^(k-1)*G[i];
422      M[j]=M[j]+c*var(1)^(k-1)*M[i];
423      g=c*var(1)^(k-1)*G[i];
424      N[j]=N[j]+(var(1)*B*g+var(1)^(d+2)*diff(g,var(1)))[1];
425      m=M[i];
426      a=transpose(A)[j];
427      N=N-c*var(1)^(k-1)*m*transpose(a);
428    }
429  }
430
431  G=V*G;
432  G=G/var(1)^mindegree(G);
433
434  return(G,A);
435}
436///////////////////////////////////////////////////////////////////////////////
437
438proc gbasis(poly f)
439"USAGE:    gbasis(f); poly f
440ASSUME:   f is cohomologically tame
441RETURN:
442@format
443ring R;  basering with new variable s
444  ideal b;  [matrix(b)] is a good basis of the Brieskorn lattice
445  matrix A;  A(s)=A0+s*A1 and t[matrix(b)]=[matrix(b)](A(s)+s^2*(d/ds))
446@end format
447KEYWORDS: tame polynomial; Gauss-Manin system; Brieskorn lattice;
448          mixed Hodge structure; V-filtration; weight filtration;
449          monodromy; spectrum; spectral pairs; good basis
450EXAMPLE:  example gbasis; shows examples
451"
452{
453  def @X=basering;
454  int n=nvars(@X);
455  ideal J=jacob(f);
456
457  int i,j,k,l;
458
459  ideal X=maxideal(1);
460  string c="ring @XS=0,(s,"+varstr(@X)+"),(C,dp(1),dp(n));";
461  execute(c);
462  poly f=imap(@X,f);
463  ideal J=imap(@X,J);
464  ideal JS=std(J+var(1));
465  ideal b0=kbase(JS);
466  int mu=ncols(b0);
467  ideal X=imap(@X,X);
468
469  ideal b;
470  matrix A;
471  module B,B0;
472  ideal K,L,M=1,J,1;
473  ideal K0,L0,M0=X,X,X;
474  module K1,L1,K2,L2;
475  module LL1;
476  for(i=1;i<=deg(f)-1;i++)
477  {
478    M=M,M0;
479    M0=M0*X;
480  }
481
482  ring @S=0,(s,t),(dp,C);
483  number a0;
484  ideal a;
485  int d;
486  ideal e,e0;
487  intvec s,s0;
488  matrix A,B;
489  module V,G;
490
491  while(2*a0!=mu*n)
492  {
493    setring(@XS);
494
495    B=0;
496    while(size(B)<mu||size(B0)<mu||maxdegree(b)+deg(f)>k)
497    {
498      k++;
499
500      K=K,K0;
501      M=M,M0;
502      K0=K0*X;
503      M0=M0*X;
504
505      B=0;
506      while(size(B)==0||size(B)>mu)
507      {
508        l++;
509        for(i=1;i<=size(L0);i++)
510        {
511          for(j=1;j<=n;j++)
512          {
513            L=L,J[j]*L0[i]-var(1)*diff(L0[i],var(j+1));
514          }
515        }
516        L0=L0*X;
517
518        K1=coeffs(K,K,product(X));
519        L1=std(coeffs(L,M,product(X)));
520        LL1=jet(lead(L1),0);
521        attrib(LL1,"isSB",1);
522        K2=simplify(reduce(K1,LL1),2);
523        L2=intersect(K2,L1);
524
525        B=pidbasis(K2,L2);
526      }
527
528      B0=std(coeffs(reduce(matrix(K)*B,JS),b0));
529      b=matrix(K)*B;
530    }
531
532    A=lift(B,reduce(coeffs(f*b+var(1)^2*diff(b,var(1)),M,product(X)),L1));
533    d=maxdegree(A);
534    A=chart(A);
535
536    setring(@S);
537
538    e0,s0,V,B=vfilt(imap(@XS,A),d);
539    a,e0,e,s,V,B,G=spec(e0,s0,V,B);
540
541    a0=leadcoef(a[1]);
542    for(i=2;i<=mu;i++)
543    {
544      a0=a0+leadcoef(a[i]);
545    }
546  }
547
548  G,A=glift(fsplit(e0,e,s,V,B,G));
549
550  setring(@XS);
551  b=matrix(b)*imap(@S,G);
552  A=imap(@S,A);
553  export(b,A);
554  kill(@S);
555
556  setring(@X);
557  return(@XS);
558}
559example
560{ "EXAMPLE:"; echo=2;
561  ring R=0,(x,y,z),dp;
562  poly f=x+y+z+x2y2z2;
563  def Rs=gbasis(f);
564  setring(Rs);
565  b;
566  print(jet(A,0));
567  print(jet(A/var(1),0));
568}
569///////////////////////////////////////////////////////////////////////////////
Note: See TracBrowser for help on using the repository browser.