source: git/Singular/LIB/mondromy.lib @ 2ab830

spielwiese
Last change on this file since 2ab830 was 341696, checked in by Hans Schönemann <hannes@…>, 14 years ago
Adding Id property to all files git-svn-id: file:///usr/local/Singular/svn/trunk@12231 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 27.6 KB
Line 
1///////////////////////////////////////////////////////////////////////////////
2version="$Id$";
3category="Singularities";
4info="
5LIBRARY:  mondromy.lib  Monodromy of an Isolated Hypersurface Singularity
6AUTHOR:   Mathias Schulze, email: mschulze@mathematik.uni-kl.de
7
8OVERVIEW:
9 A library to compute the monodromy of an isolated hypersurface singularity.
10 It uses an algorithm by Brieskorn (manuscripta math. 2 (1970), 103-161) to
11 compute a connection matrix of the meromorphic Gauss-Manin connection up to
12 arbitrarily high order, and an algorithm of Gerard and Levelt (Ann. Inst.
13 Fourier, Grenoble 23,1 (1973), pp. 157-195) to transform it to a simple pole.
14
15PROCEDURES:
16 detadj(U);            determinant and adjoint matrix of square matrix U
17 invunit(u,n);         series inverse of polynomial u up to order n
18 jacoblift(f);         lifts f^kappa in jacob(f) with minimal kappa
19 monodromyB(f[,opt]);  monodromy of isolated hypersurface singularity f
20 H2basis(f);           basis of Brieskorn lattice H''
21
22KEYWORDS: Monodromy; hypersurface singularity; Gauss-Manin connection;
23          Brieskorn lattice
24
25SEE ALSO: gmspoly_lib, gmssing_lib
26";
27
28LIB "ring.lib";
29LIB "sing.lib";
30LIB "linalg.lib";
31
32///////////////////////////////////////////////////////////////////////////////
33
34static proc pcvladdl(list l1,list l2)
35{
36  return(system("pcvLAddL",l1,l2));
37}
38
39static proc pcvpmull(poly p,list l)
40{
41  return(system("pcvPMulL",p,l));
42}
43
44static proc pcvmindeg(list #)
45{
46  return(system("pcvMinDeg",#[1]));
47}
48
49static proc pcvp2cv(list l,int i0,int i1)
50{
51  return(system("pcvP2CV",l,i0,i1));
52}
53
54static proc pcvcv2p(list l,int i0,int i1)
55{
56  return(system("pcvCV2P",l,i0,i1));
57}
58
59static proc pcvdim(int i0,int i1)
60{
61  return(system("pcvDim",i0,i1));
62}
63
64static proc pcvbasis(int i0,int i1)
65{
66  return(system("pcvBasis",i0,i1));
67}
68
69static proc pcvinit()
70{
71  if(0 ) //system("with","DynamicLoading"))
72  {
73    pcvladdl=Pcv::LAddL;
74    pcvpmull=Pcv::PMulL;
75    pcvmindeg=Pcv::MinDeg;
76    pcvp2cv=Pcv::P2CV;
77    pcvcv2p=Pcv::CV2P;
78    pcvdim=Pcv::Dim;
79    pcvbasis=Pcv::Basis;
80  }
81}
82///////////////////////////////////////////////////////////////////////////////
83
84static proc min(intvec v)
85{
86  int m=v[1];
87  int i;
88  for(i=2;i<=size(v);i++)
89  {
90    if(m>v[i])
91    {
92      m=v[i];
93    }
94  }
95  return(m);
96}
97///////////////////////////////////////////////////////////////////////////////
98
99static proc max(intvec v)
100{
101  int m=v[1];
102  int i;
103  for(i=2;i<=size(v);i++)
104  {
105    if(m<v[i])
106    {
107      m=v[i];
108    }
109  }
110  return(m);
111}
112///////////////////////////////////////////////////////////////////////////////
113
114static proc mdivp(matrix m,poly p)
115{
116  int i,j;
117  for(i=nrows(m);i>=1;i--)
118  {
119    for(j=ncols(m);j>=1;j--)
120    {
121      m[i,j]=m[i,j]/p;
122    }
123  }
124  return(m);
125}
126///////////////////////////////////////////////////////////////////////////////
127
128proc codimV(list V,int N)
129{
130  int codim=pcvdim(0,N);
131  if(size(V)>0)
132  {
133    dbprint(printlevel-voice+2,"//vector space dimension: "+string(codim));
134    dbprint(printlevel-voice+2,
135      "//number of subspace generators: "+string(size(V)));
136    int t=timer;
137    codim=codim-ncols(interred(module(V[1..size(V)])));
138    dbprint(printlevel-voice+2,"//codimension: "+string(codim));
139  }
140  return(codim);
141}
142///////////////////////////////////////////////////////////////////////////////
143
144proc quotV(list V,int N)
145{
146  module Q=freemodule(pcvdim(0,N));
147  if(size(V)>0)
148  {
149    dbprint(printlevel-voice+2,"//vector space dimension: "+string(nrows(Q)));
150    dbprint(printlevel-voice+2,
151      "//number of subspace generators: "+string(size(V)));
152    int t=timer;
153    Q=interred(reduce(std(Q),std(module(V[1..size(V)]))));
154  }
155  return(list(Q[1..size(Q)]));
156}
157///////////////////////////////////////////////////////////////////////////////
158proc invunit(poly u,int n)
159"USAGE:   invunit(u,n); u poly, n int
160ASSUME:  The polynomial u is a series unit.
161RETURN:  The procedure returns the series inverse of u up to order n
162         or a zero polynomial if u is no series unit.
163DISPLAY: The procedure displays comments if printlevel>=1.
164EXAMPLE: example invunit; shows an example.
165"
166{
167  if(pcvmindeg(u)==0)
168  {
169    dbprint(printlevel-voice+2,"//computing inverse...");
170    int t=timer;
171    poly u0=jet(u,0);
172    u=jet(1-u/u0,n);
173    poly ui=u;
174    poly v=1+u;
175    int i;
176    for(i=n div pcvmindeg(u);i>1;i--)
177    {
178      ui=jet(ui*u,n);
179      v=v+ui;
180    }
181    v=jet(v,n)/u0;
182    dbprint(printlevel-voice+2,"//...inverse computed ["+string(timer-t)+
183      " secs, "+string((memory(1)+1023)/1024)+" K]");
184    return(v);
185  }
186  else
187  {
188    print("//no series unit");
189    return(poly(0));
190  }
191}
192example
193{ "EXAMPLE:"; echo=2;
194  ring R=0,(x,y),dp;
195  invunit(2+x3+xy4,10);
196}
197
198///////////////////////////////////////////////////////////////////////////////
199
200proc detadj(module U)
201"USAGE:   detadj(U); U matrix
202ASSUME:  U is a square matrix with non zero determinant.
203RETURN:  The procedure returns a list with at most 2 entries.
204         If U is not a sqaure matrix, the list is empty.
205         If U is a sqaure matrix, then the first entry is the determinant of U.
206         If U is a square matrix and the determinant of U not zero,
207         then the second entry is the adjoint matrix of U.
208DISPLAY: The procedure displays comments if printlevel>=1.
209EXAMPLE: example detadj; shows an example.
210"
211{
212  if(nrows(U)==ncols(U))
213  {
214    dbprint(printlevel-voice+2,"//computing determinant...");
215    int t=timer;
216    poly detU=det(U);
217    dbprint(printlevel-voice+2,"//...determinant computed ["+string(timer-t)+
218      " secs, "+string((memory(1)+1023)/1024)+" K]");
219
220    if(detU==0)
221    {
222      print("//determinant zero");
223      return(list(detU));
224    }
225    else
226    {
227      def br=basering;
228      def pr=changeord("dp"); setring pr;
229      matrix U=fetch(br,U);
230      poly detU=fetch(br,detU);
231
232      dbprint(printlevel-voice+2,"//computing adjoint matrix...");
233      t=timer;
234      matrix adjU=lift(U,detU*freemodule(nrows(U)));
235      dbprint(printlevel-voice+2,"//...adjoint matrix computed ["
236        +string(timer-t)+" secs, "+string((memory(1)+1023)/1024)+" K]");
237
238      setring br;
239      matrix adjU=fetch(pr,adjU);
240      kill pr;
241    }
242  }
243  else
244  {
245    print("//no square matrix");
246    return(list());
247  }
248
249  return(list(detU,adjU));
250}
251example
252{ "EXAMPLE:"; echo=2;
253  ring R=0,x,dp;
254  matrix U[2][2]=1,1+x,1+x2,1+x3;
255  list daU=detadj(U);
256  daU[1];
257  print(daU[2]);
258}
259///////////////////////////////////////////////////////////////////////////////
260
261proc jacoblift(poly f)
262"USAGE:   jacoblift(f); f poly
263ASSUME:  The polynomial f in a series ring (local ordering) defines
264         an isolated hypersurface singularity.
265RETURN:  The procedure returns a list with entries kappa, xi, u of type
266         int, vector, poly such that kappa is minimal with f^kappa in jacob(f),
267         u is a unit, and u*f^kappa=(matrix(jacob(f))*xi)[1,1].
268DISPLAY: The procedure displays comments if printlevel>=1.
269EXAMPLE: example jacoblift; shows an example.
270"
271{
272  dbprint(printlevel-voice+2,"//computing kappa...");
273  int t=timer;
274  ideal jf=jacob(f);
275  ideal sjf=std(jf);
276  int kappa=1;
277  poly fkappa=f;
278  while(reduce(fkappa,sjf)!=0)
279  {
280    dbprint(printlevel-voice+2,"//kappa="+string(kappa));
281    kappa++;
282    fkappa=fkappa*f;
283  }
284  dbprint(printlevel-voice+2,"//kappa="+string(kappa));
285  dbprint(printlevel-voice+2,"//...kappa computed ["+string(timer-t)+" secs, "
286    +string((memory(1)+1023)/1024)+" K]");
287
288  dbprint(printlevel-voice+2,"//computing xi...");
289  t=timer;
290  vector xi=lift(jf,fkappa)[1];
291  dbprint(printlevel-voice+2,"//...xi computed ["+string(timer-t)+" secs, "
292    +string((memory(1)+1023)/1024)+" K]");
293
294  dbprint(printlevel-voice+2,"//computing u...");
295  t=timer;
296  poly u=(matrix(jf)*xi)[1,1]/fkappa;
297  dbprint(printlevel-voice+2,"//...u computed ["+string(timer-t)+" secs, "
298    +string((memory(1)+1023)/1024)+" K]");
299
300  return(list(kappa,xi,u));
301}
302example
303{ "EXAMPLE:"; echo=2;
304  ring R=0,(x,y),ds;
305  poly f=x2y2+x6+y6;
306  jacoblift(f);
307}
308///////////////////////////////////////////////////////////////////////////////
309
310static proc getdeltaP1(poly f,int K,int N,int dN)
311{
312  return(pcvpmull(f^K,pcvbasis(0,N+dN-K*pcvmindeg(f))));
313}
314///////////////////////////////////////////////////////////////////////////////
315
316static proc getdeltaP2(poly f,int N,int dN)
317{
318  def of,jf=pcvmindeg(f),jacob(f);
319  list b=pcvbasis(N-of+2,N+dN-of+2);
320  list P2;
321  P2[size(b)*((nvars(basering)-1)*nvars(basering))/2]=0;
322  int i,j,k,l;
323  intvec alpha;
324  for(k,l=1,1;k<=size(b);k++)
325  {
326    alpha=leadexp(b[k]);
327    for(i=nvars(basering)-1;i>=1;i--)
328    {
329      for(j=nvars(basering);j>i;j--)
330      {
331        P2[l]=alpha[i]*jf[j]*(b[k]/var(i))-alpha[j]*jf[i]*(b[k]/var(j));
332        l++;
333      }
334    }
335  }
336  return(P2);
337}
338///////////////////////////////////////////////////////////////////////////////
339
340static proc getdeltaPe(poly f,list e,int K,int dK)
341{
342  int k;
343  list Pe,fke;
344  for(k,fke=K,pcvpmull(f^K,e);k<K+dK;k,fke=k+1,pcvpmull(f,fke))
345  {
346    Pe=Pe+fke;
347  }
348  return(Pe);
349}
350///////////////////////////////////////////////////////////////////////////////
351
352static proc incK(poly f,int mu,int K,int deltaK,int N,
353  list e,list P1,list P2,list Pe,list V1,list V2,list Ve)
354{
355  int deltaN=deltaK*pcvmindeg(f);
356
357  list deltaP1;
358  P1=pcvpmull(f^deltaK,P1);
359  V1=pcvp2cv(P1,0,N+deltaN);
360
361  list deltaP2=getdeltaP2(f,N,deltaN);
362  V2=pcvladdl(V2,pcvp2cv(P2,N,N+deltaN))+pcvp2cv(deltaP2,0,N+deltaN);
363  P2=P2+deltaP2;
364
365  list deltaPe=getdeltaPe(f,e,K,deltaK);
366  Ve=pcvladdl(Ve,pcvp2cv(Pe,N,N+deltaN))+pcvp2cv(deltaPe,0,N+deltaN);
367  Pe=Pe+deltaPe;
368
369  K=K+deltaK;
370  dbprint(printlevel-voice+2,"//K="+string(K));
371
372  N=N+deltaN;
373  dbprint(printlevel-voice+2,"//N="+string(N));
374
375  deltaN=1;
376  dbprint(printlevel-voice+2,"//computing codimension of");
377  dbprint(printlevel-voice+2,"//df^dOmega^(n-1)+f^K*Omega^(n+1) in "
378    +"Omega^(n+1) mod m^N*Omega^(n+1)...");
379  int t=timer;
380  while(codimV(V1+V2,N)<K*mu)
381  {
382    dbprint(printlevel-voice+2,"//...codimension computed ["+string(timer-t)
383      +" secs, "+string((memory(1)+1023)/1024)+" K]");
384
385    deltaP1=getdeltaP1(f,K,N,deltaN);
386    V1=pcvladdl(V1,pcvp2cv(P1,N,N+deltaN))+pcvp2cv(deltaP1,0,N+deltaN);
387    P1=P1+deltaP1;
388
389    deltaP2=getdeltaP2(f,N,deltaN);
390    V2=pcvladdl(V2,pcvp2cv(P2,N,N+deltaN))+pcvp2cv(deltaP2,0,N+deltaN);
391    P2=P2+deltaP2;
392
393    Ve=pcvladdl(Ve,pcvp2cv(Pe,N,N+deltaN));
394
395    N=N+deltaN;
396    dbprint(printlevel-voice+2,"//N="+string(N));
397
398    dbprint(printlevel-voice+2,"//computing codimension of");
399    dbprint(printlevel-voice+2,"//df^dOmega^(n-1)+f^K*Omega^(n+1) in "
400      +"Omega^(n+1) mod m^N*Omega^(n+1)...");
401    t=timer;
402  }
403  dbprint(printlevel-voice+2,"//...codimension computed ["+string(timer-t)
404    +" secs, "+string((memory(1)+1023)/1024)+" K]");
405
406  return(K,N,P1,P2,Pe,V1,V2,Ve);
407}
408///////////////////////////////////////////////////////////////////////////////
409
410static proc nablaK(poly f,int kappa,vector xi,poly u,int N,int prevN,
411  list Vnablae,list e)
412{
413  xi=jet(xi,N);
414  u=invunit(u,N);
415  poly fkappa=kappa*f^(kappa-1);
416
417  poly p,q;
418  list nablae;
419  int i,j;
420  for(i=1;i<=size(e);i++)
421  {
422    for(j,p=nvars(basering),0;j>=1;j--)
423    {
424      q=jet(e[i]*xi[j],N);
425      if(q!=0)
426      {
427        p=p+diff(q*jet(u,N-pcvmindeg(q)),var(j));
428      }
429    }
430    nablae=nablae+list(p-jet(fkappa*e[i],N-1));
431  }
432
433  return(pcvladdl(Vnablae,pcvp2cv(nablae,prevN,N-prevN)));
434}
435///////////////////////////////////////////////////////////////////////////////
436
437static proc MK(poly f,int mu,int kappa,vector xi,poly u,
438  int K,int N,int prevN,list e,list V1,list V2,list Ve,list Vnablae)
439{
440  dbprint(printlevel-voice+2,"//computing nabla(e)...");
441  int t=timer;
442  Vnablae=nablaK(f,kappa,xi,u,N,prevN,Vnablae,e);
443  dbprint(printlevel-voice+2,"//...nabla(e) computed ["+string(timer-t)
444    +" secs, "+string((memory(1)+1023)/1024)+" K]");
445
446  dbprint(printlevel-voice+2,
447    "//lifting nabla(e) to C-basis of H''/t^KH''...");
448  list V=Ve+V1+V2;
449  module W=module(V[1..size(V)]);
450  dbprint(printlevel-voice+2,"//vector space dimension: "+string(nrows(W)));
451  dbprint(printlevel-voice+2,"//number of generators: "+string(ncols(W)));
452  t=timer;
453  matrix C=lift(W,module(Vnablae[1..size(Vnablae)]));
454  dbprint(printlevel-voice+2,"//...nabla(e) lifted ["+string(timer-t)
455    +" secs, "+string((memory(1)+1023)/1024)+" K]");
456
457  dbprint(printlevel-voice+2,"//computing e-lift of nabla(e)...");
458  t=timer;
459  int i1,i2,j,k;
460  matrix M[mu][mu];
461  for(j=1;j<=mu;j++)
462  {
463    for(k,i2=0,1;k<K;k++)
464    {
465      for(i1=1;i1<=mu;i1,i2=i1+1,i2+1)
466      {
467        M[i1,j]=M[i1,j]+C[i2,j]*var(1)^k;
468      }
469    }
470  }
471  dbprint(printlevel-voice+2,"//...e-lift of nabla(e) computed ["
472    +string(timer-t)+" secs, "+string((memory(1)+1023)/1024)+" K]");
473
474  return(M,N,Vnablae);
475}
476///////////////////////////////////////////////////////////////////////////////
477
478static proc mid(ideal l)
479{
480  int i,j,id;
481  int mid=0;
482  for(i=size(l);i>=1;i--)
483  {
484    for(j=i-1;j>=1;j--)
485    {
486      id=int(l[i]-l[j]);
487      id=max(intvec(id,-id));
488      mid=max(intvec(id,mid));
489    }
490  }
491  return(mid);
492}
493///////////////////////////////////////////////////////////////////////////////
494
495static proc decmide(matrix M,ideal eM0,list bM0)
496{
497  matrix M0=jet(M,0);
498
499  dbprint(printlevel-voice+2,
500    "//computing basis U of generalized eigenspaces of M0...");
501  int t=timer;
502  int i,j;
503  matrix U,M0e;
504  matrix E=freemodule(nrows(M));
505  for(i=ncols(eM0);i>=1;i--)
506  {
507    M0e=E;
508    for(j=max(bM0[i]);j>=1;j--)
509    {
510      M0e=M0e*(M0-eM0[i]*E);
511    }
512    U=syz(M0e)+U;
513  }
514  dbprint(printlevel-voice+2,"//...U computed ["+string(timer-t)+" secs, "
515    +string((memory(1)+1023)/1024)+" K]");
516
517  dbprint(printlevel-voice+2,"//transforming M to U...");
518  t=timer;
519  list daU=detadj(U);
520  daU[2]=(1/number(daU[1]))*daU[2];
521  M=daU[2]*M*U;
522  dbprint(printlevel-voice+2,"//...M transformed ["+string(timer-t)+" secs, "
523    +string((memory(1)+1023)/1024)+" K]");
524
525  dbprint(printlevel-voice+2,
526    "//computing integer differences of eigenvalues of M0...");
527  t=timer;
528  int k;
529  intvec ideM0;
530  ideM0[ncols(eM0)]=0;
531  for(i=ncols(eM0);i>=1;i--)
532  {
533    for(j=ncols(eM0);j>=1;j--)
534    {
535      k=int(eM0[i]-eM0[j]);
536      if(k)
537      {
538        if(k>0)
539        {
540          ideM0[i]=max(intvec(k,ideM0[i]));
541        }
542        else
543        {
544          ideM0[j]=max(intvec(-k,ideM0[j]));
545        }
546      }
547    }
548  }
549  for(i,k=size(bM0),nrows(M);i>=1;i--)
550  {
551    for(j=sum(bM0[i]);j>=1;j--)
552    {
553      ideM0[k]=ideM0[i];
554      k--;
555    }
556  }
557  dbprint(printlevel-voice+2,
558    "//...integer differences of eigenvalues of M0 computed ["+string(timer-t)
559    +" secs, "+string((memory(1)+1023)/1024)+" K]");
560
561  dbprint(printlevel-voice+2,"//transforming M...");
562  t=timer;
563  for(i=nrows(M);i>=1;i--)
564  {
565    if(!ideM0[i])
566    {
567      M[i,i]=M[i,i]+1;
568    }
569    for(j=ncols(M);j>=1;j--)
570    {
571      if(ideM0[i]&&!ideM0[j])
572      {
573        M[i,j]=M[i,j]*var(1);
574      }
575      else
576      {
577        if(!ideM0[i]&&ideM0[j])
578        {
579          M[i,j]=M[i,j]/var(1);
580        }
581      }
582    }
583  }
584  dbprint(printlevel-voice+2,"//...M transformed ["+string(timer-t)+" secs, "
585    +string((memory(1)+1023)/1024)+" K]");
586
587  return(M);
588}
589///////////////////////////////////////////////////////////////////////////////
590
591static proc nonqhmonodromy(poly f,int mu,int opt)
592{
593  pcvinit();
594
595  dbprint(printlevel-voice+2,"//computing kappa, xi and u with "+
596    "u*f^kappa=(matrix(jacob(f))*xi)[1,1]...");
597  list jl=jacoblift(f);
598  def kappa,xi,u=jl[1..3];
599  dbprint(printlevel-voice+2,"//...kappa, xi and u computed");
600  dbprint(printlevel-voice+2,"//kappa="+string(kappa));
601  if(kappa==1)
602  {
603    dbprint(printlevel-voice+2,
604      "//f quasihomogenous with respect to suitable coordinates");
605  }
606  else
607  {
608    dbprint(printlevel-voice+2,
609      "//f not quasihomogenous for any choice of coordinates");
610  }
611  dbprint(printlevel-voice+2,"//xi=");
612  dbprint(printlevel-voice+2,xi);
613  dbprint(printlevel-voice+2,"//u="+string(u));
614
615  int K,N,prevN;
616  list e,P1,P2,Pe,V1,V2,Ve,Vnablae;
617
618  dbprint(printlevel-voice+2,"//increasing K and N...");
619  K,N,P1,P2,Pe,V1,V2,Ve=incK(f,mu,K,1,N,e,P1,P2,Pe,V1,V2,Ve);
620  dbprint(printlevel-voice+2,"//...K and N increased");
621
622  dbprint(printlevel-voice+2,"//computing C{f}-basis e of Brieskorn lattice "
623    +"H''=Omega^(n+1)/df^dOmega^(n-1)...");
624  int t=timer;
625  e=pcvcv2p(quotV(V1+V2,N),0,N);
626  dbprint(printlevel-voice+2,"//...e computed ["+string(timer-t)+" secs, "
627    +string((memory(1)+1023)/1024)+" K]");
628
629  dbprint(printlevel-voice+2,"//e=");
630  dbprint(printlevel-voice+2,e);
631
632  Pe=e;
633  Ve=pcvp2cv(Pe,0,N);
634
635  if(kappa==1)
636  {
637    dbprint(printlevel-voice+2,
638      "//computing 0-jet M of e-matrix of t*nabla...");
639    matrix M=list(MK(f,mu,kappa,xi,u,K,N,prevN,e,V1,V2,Ve,Vnablae))[1];
640    dbprint(printlevel-voice+2,"//...M computed");
641  }
642  else
643  {
644    dbprint(printlevel-voice+2,
645      "//computing transformation matrix U to simple pole...");
646
647    dbprint(printlevel-voice+2,"//computing t*nabla-stable lattice...");
648    matrix M,prevU;
649    matrix U=freemodule(mu)*var(1)^((mu-1)*(kappa-1));
650    int i;
651    dbprint(printlevel-voice+2,"//comparing with previous lattice...");
652    t=timer;
653    for(i=mu-1;i>=1&&size(reduce(U,std(prevU)))>0;i--)
654    {
655      dbprint(printlevel-voice+2,"//...compared with previous lattice ["
656        +string(timer-t)+" secs, "+string((memory(1)+1023)/1024)+" K]");
657
658      dbprint(printlevel-voice+2,"//increasing K and N...");
659      K,N,P1,P2,Pe,V1,V2,Ve=incK(f,mu,K,kappa-1,N,e,P1,P2,Pe,V1,V2,Ve);
660      dbprint(printlevel-voice+2,"//...K and N increased");
661
662      dbprint(printlevel-voice+2,
663        "//computing (K-1)-jet M of e-matrix of t^kappa*nabla...");
664      M,prevN,Vnablae=MK(f,mu,kappa,xi,u,K,N,prevN,e,V1,V2,Ve,Vnablae);
665      dbprint(printlevel-voice+2,"//...M computed");
666
667      prevU=U;
668
669      dbprint(printlevel-voice+2,"//enlarging lattice...");
670      t=timer;
671      U=interred(jet(module(U)+module(var(1)*diff(U,var(1)))+
672        module(mdivp(M*U,var(1)^(kappa-1))),(kappa-1)*(mu-1)));
673      dbprint(printlevel-voice+2,"//...lattice enlarged ["+string(timer-t)
674        +" secs, "+string((memory(1)+1023)/1024)+" K]");
675
676      dbprint(printlevel-voice+2,"//comparing with previous lattice...");
677      t=timer;
678    }
679    dbprint(printlevel-voice+2,"//...compared with previous lattice ["
680      +string(timer-t)+" secs, "+string((memory(1)+1023)/1024)+" K]");
681    dbprint(printlevel-voice+2,"//...t*nabla-stable lattice computed");
682
683    if(ncols(U)>nrows(U))
684    {
685      dbprint(printlevel-voice+2,
686        "//computing C{f}-basis of t*nabla-stable lattice...");
687      t=timer;
688      U=minbase(U);
689      dbprint(printlevel-voice+2,
690        "//...C{f}-basis of t*nabla-stable lattice computed ["+string(timer-t)
691        +" secs, "+string((memory(1)+1023)/1024)+" K]");
692    }
693
694    U=mdivp(U,var(1)^pcvmindeg(U));
695
696    dbprint(printlevel-voice+2,"//...U computed");
697
698    dbprint(printlevel-voice+2,
699      "//computing determinant and adjoint matrix of U...");
700    list daU=detadj(U);
701    poly p=var(1)^min(intvec(pcvmindeg(daU[2]),pcvmindeg(daU[1])));
702    daU[1]=daU[1]/p;
703    daU[2]=mdivp(daU[2],p);
704    dbprint(printlevel-voice+2,
705      "//...determinant and adjoint matrix of U computed");
706
707    if(K<kappa+pcvmindeg(daU[1]))
708    {
709      dbprint(printlevel-voice+2,"//increasing K and N...");
710      K,N,P1,P2,Pe,V1,V2,Ve=
711        incK(f,mu,K,kappa+pcvmindeg(daU[1])-K,N,e,P1,P2,Pe,V1,V2,Ve);
712      dbprint(printlevel-voice+2,"//...K and N increased");
713
714      dbprint(printlevel-voice+2,"//computing M...");
715      M,prevN,Vnablae=MK(f,mu,kappa,xi,u,K,N,prevN,e,V1,V2,Ve,Vnablae);
716      dbprint(printlevel-voice+2,"//...M computed");
717    }
718
719    dbprint(printlevel-voice+2,"//transforming M/t^kappa to simple pole...");
720    t=timer;
721    M=mdivp(daU[2]*(var(1)^kappa*diff(U,var(1))+M*U),
722      leadcoef(daU[1])*var(1)^(kappa+pcvmindeg(daU[1])-1));
723    dbprint(printlevel-voice+2,"//...M/t^kappa transformed to simple pole ["
724      +string(timer-t)+" secs, "+string((memory(1)+1023)/1024)+" K]");
725  }
726
727  if(opt==0)
728  {
729    dbprint(printlevel-voice+2,
730      "//computing maximal integer difference delta of eigenvalues of M0...");
731    t=timer;
732    list jd=jordan(M);
733    def eM0,bM0=jd[1..2];
734    int delta=mid(eM0);
735    dbprint(printlevel-voice+2,"//...delta computed ["+string(timer-t)
736      +" secs, "+string((memory(1)+1023)/1024)+" K]");
737
738    dbprint(printlevel-voice+2,"//delta="+string(delta));
739
740    if(delta>0)
741    {
742      dbprint(printlevel-voice+2,"//increasing K and N...");
743      if(kappa==1)
744      {
745        K,N,P1,P2,Pe,V1,V2,Ve=incK(f,mu,K,1+delta-K,N,e,P1,P2,Pe,V1,V2,Ve);
746      }
747      else
748      {
749        K,N,P1,P2,Pe,V1,V2,Ve=
750          incK(f,mu,K,kappa+pcvmindeg(daU[1])+delta-K,N,e,P1,P2,Pe,V1,V2,Ve);
751      }
752      dbprint(printlevel-voice+2,"//...K and N increased");
753
754      dbprint(printlevel-voice+2,"//computing M...");
755      M,prevN,Vnablae=MK(f,mu,kappa,xi,u,K,N,prevN,e,V1,V2,Ve,Vnablae);
756      dbprint(printlevel-voice+2,"//...M computed");
757
758      if(kappa>1)
759      {
760        dbprint(printlevel-voice+2,
761          "//transforming M/t^kappa to simple pole...");
762        t=timer;
763        M=mdivp(invunit(daU[1]/var(1)^pcvmindeg(daU[1]),delta)*
764          daU[2]*(var(1)^kappa*diff(U,var(1))+M*U),
765          var(1)^(kappa+pcvmindeg(daU[1])-1));
766        dbprint(printlevel-voice+2,
767          "//...M/t^kappa transformed to simple pole ["+string(timer-t)
768          +" secs, "+string((memory(1)+1023)/1024)+" K]");
769      }
770
771      dbprint(printlevel-voice+2,"//decreasing delta...");
772      M=decmide(M,eM0,bM0);
773      delta--;
774      dbprint(printlevel-voice+2,"//delta="+string(delta));
775
776      while(delta>0)
777      {
778        jd=jordan(M);
779        eM0,bM0=jd[1..2];
780        M=decmide(M,eM0,bM0);
781        delta--;
782        dbprint(printlevel-voice+2,"//delta="+string(delta));
783      }
784      dbprint(printlevel-voice+2,"//...delta decreased");
785    }
786  }
787
788  dbprint(printlevel-voice+2,"//computing 0-jet M0 of M...");
789  matrix M0=jet(M,0);
790  dbprint(printlevel-voice+2,"//...M0 computed");
791
792  return(M0);
793}
794///////////////////////////////////////////////////////////////////////////////
795
796static proc qhmonodromy(poly f,intvec w)
797{
798  dbprint(printlevel-voice+2,"//computing basis e of Milnor algebra...");
799  int t=timer;
800  ideal e=kbase(std(jacob(f)));
801  dbprint(printlevel-voice+2,"//...e computed ["+string(timer-t)+" secs, "
802    +string((memory(1)+1023)/1024)+" K]");
803
804  dbprint(printlevel-voice+2,
805    "//computing Milnor number mu and quasihomogeneous degree d...");
806  int mu,d=size(e),(transpose(leadexp(f))*w)[1];
807  dbprint(printlevel-voice+2,"...mu and d computed");
808
809  dbprint(printlevel-voice+2,"//computing te-matrix M of t*nabla...");
810  matrix M[mu][mu];
811  int i;
812  for(i=mu;i>=1;i--)
813  {
814    M[i,i]=number((transpose(leadexp(e[i])+1)*w)[1])/d;
815  }
816  dbprint(printlevel-voice+2,"//...M computed");
817
818  return(M);
819}
820///////////////////////////////////////////////////////////////////////////////
821
822proc monodromyB(poly f, list #)
823"USAGE:   monodromyB(f[,opt]); f poly, opt int
824ASSUME:  The polynomial f in a series ring (local ordering) defines
825         an isolated hypersurface singularity.
826RETURN:  The procedure returns a residue matrix M of the meromorphic
827         Gauss-Manin connection of the singularity defined by f
828         or an empty matrix if the assumptions are not fulfilled.
829         If opt=0 (default), exp(-2*pi*i*M) is a monodromy matrix of f,
830         else, only the characteristic polynomial of exp(-2*pi*i*M) coincides
831         with the characteristic polynomial of the monodromy of f.
832DISPLAY: The procedure displays more comments for higher printlevel.
833EXAMPLE: example monodromyB; shows an example.
834"
835{
836  int opt;
837  if(size(#)>0)
838  {
839    if(typeof(#[1])=="int")
840    {
841      opt=#[1];
842    }
843    else
844    {
845      print("\\second parameter no int");
846      return();
847    }
848
849  }
850
851  dbprint(printlevel-voice+2,"//basering="+string(basering));
852
853  int i;
854  for(i=nvars(basering);i>=1;i--)
855  {
856    if(1<var(i))
857    {
858      i=-1;
859    }
860  }
861
862  if(i<0)
863  {
864    print("//no series ring (local ordering)");
865
866    matrix M[1][0];
867    return(M);
868  }
869  else
870  {
871    dbprint(printlevel-voice+2,"//f="+string(f));
872
873    dbprint(printlevel-voice+2,"//computing milnor number mu of f...");
874    int t=timer;
875    int mu=milnor(f);
876    dbprint(printlevel-voice+2,"//...mu computed ["+string(timer-t)+" secs, "
877      +string((memory(1)+1023)/1024)+" K]");
878
879    dbprint(printlevel-voice+2,"//mu="+string(mu));
880
881    if(mu<=0)
882    {
883      if(mu==0)
884      {
885        print("//no singularity");
886      }
887      else
888      {
889        print("//non isolated singularity");
890      }
891
892      matrix M[1][0];
893      return(M);
894    }
895    else
896    {
897      dbprint(printlevel-voice+2,"//computing weight vector w...");
898      intvec w=qhweight(f);
899      dbprint(printlevel-voice+2,"//...w computed");
900
901      dbprint(printlevel-voice+2,"//w="+string(w));
902
903      if(w==0)
904      {
905        dbprint(printlevel-voice+2,
906          "//f not quasihomogeneous with respect to given coordinates");
907        return(nonqhmonodromy(f,mu,opt));
908      }
909      else
910      {
911        dbprint(printlevel-voice+2,
912          "//f quasihomogeneous with respect to given coordinates");
913        return(qhmonodromy(f,w));
914      }
915    }
916  }
917}
918example
919{ "EXAMPLE:"; echo=2;
920  ring R=0,(x,y),ds;
921  poly f=x2y2+x6+y6;
922  matrix M=monodromyB(f);
923  print(M);
924}
925///////////////////////////////////////////////////////////////////////////////
926
927proc H2basis(poly f)
928"USAGE:   H2basis(f); f poly
929ASSUME:  The polynomial f in a series ring (local ordering) defines
930         an isolated hypersurface singularity.
931RETURN:  The procedure returns a list of representatives of a C{f}-basis of the
932         Brieskorn lattice H''=Omega^(n+1)/df^dOmega^(n-1).
933THEORY:  H'' is a free C{f}-module of rank milnor(f).
934DISPLAY: The procedure displays more comments for higher printlevel.
935EXAMPLE: example H2basis; shows an example.
936"
937{
938  pcvinit();
939
940  dbprint(printlevel-voice+2,"//basering="+string(basering));
941
942  int i;
943  for(i=nvars(basering);i>=1;i--)
944  {
945    if(1<var(i))
946    {
947      i=-1;
948    }
949  }
950
951  if(i<0)
952  {
953    print("//no series ring (local ordering)");
954
955    return(list());
956  }
957  else
958  {
959    dbprint(printlevel-voice+2,"//f="+string(f));
960
961    dbprint(printlevel-voice+2,"//computing milnor number mu of f...");
962    int t=timer;
963    int mu=milnor(f);
964    dbprint(printlevel-voice+2,"//...mu computed ["+string(timer-t)+" secs, "
965      +string((memory(1)+1023)/1024)+" K]");
966
967    dbprint(printlevel-voice+2,"//mu="+string(mu));
968
969    if(mu<=0)
970    {
971      if(mu==0)
972      {
973        print("//no singularity");
974      }
975      else
976      {
977        print("//non isolated singularity");
978      }
979
980      return(list());
981    }
982    else
983    {
984      dbprint(printlevel-voice+2,"//computing kappa, xi and u with "+
985        "u*f^kappa=(matrix(jacob(f))*xi)[1,1]...");
986      list jl=jacoblift(f);
987      def kappa,xi,u=jl[1..3];
988      dbprint(printlevel-voice+2,"//...kappa, xi and u computed");
989      dbprint(printlevel-voice+2,"//kappa="+string(kappa));
990      if(kappa==1)
991      {
992        dbprint(printlevel-voice+2,
993          "//f quasihomogenous with respect to suitable coordinates");
994      }
995      else
996      {
997        dbprint(printlevel-voice+2,
998          "//f not quasihomogenous for any choice of coordinates");
999      }
1000      dbprint(printlevel-voice+2,"//xi=");
1001      dbprint(printlevel-voice+2,xi);
1002      dbprint(printlevel-voice+2,"//u="+string(u));
1003
1004      int K,N,prevN;
1005      list e,P1,P2,Pe,V1,V2,Ve,Vnablae;
1006
1007      dbprint(printlevel-voice+2,"//increasing K and N...");
1008      K,N,P1,P2,Pe,V1,V2,Ve=incK(f,mu,K,1,N,e,P1,P2,Pe,V1,V2,Ve);
1009      dbprint(printlevel-voice+2,"//...K and N increased");
1010
1011      dbprint(printlevel-voice+2,
1012        "//computing C{f}-basis e of Brieskorn lattice "
1013        +"H''=Omega^(n+1)/df^dOmega^(n-1)...");
1014      t=timer;
1015      e=pcvcv2p(quotV(V1+V2,N),0,N);
1016      dbprint(printlevel-voice+2,"//...e computed ["+string(timer-t)+" secs, "
1017        +string((memory(1)+1023)/1024)+" K]");
1018
1019      dbprint(printlevel-voice+2,"//e=");
1020      dbprint(printlevel-voice+2,e);
1021
1022      return(e);
1023    }
1024  }
1025}
1026example
1027{ "EXAMPLE:"; echo=2;
1028  ring R=0,(x,y),ds;
1029  poly f=x2y2+x6+y6;
1030  H2basis(f);
1031}
1032///////////////////////////////////////////////////////////////////////////////
Note: See TracBrowser for help on using the repository browser.