source: git/Singular/LIB/gmspoly.lib @ 1d0a65

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