source: git/Singular/LIB/gmspoly.lib @ 6f84e21

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