source: git/Singular/LIB/gmspoly.lib @ 93a69c5

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