# source:git/Singular/LIB/surfacesignature.lib@1c809c1

spielwiese
Last change on this file since 1c809c1 was 1c809c1, checked in by Stefan Steidel <steidel@…>, 12 years ago
(1) Procedure name changed: signatureP --> signaturePuiseux, not static anymore and (2) signatureNemethi: input poly need not be irreducible anymore, the two possible variants run in parallel if no optional argument is used. git-svn-id: file:///usr/local/Singular/svn/trunk@14364 2c84dea3-7e68-4137-9b89-c4e89433aadc
• Property mode set to `100644`
File size: 14.7 KB
Line
1///////////////////////////////////////////////////////////////////////////////
2version="\$Id\$";
3category="Singularities";
4info="
5LIBRARY:  surfacesignature.lib        signature of surface singularity
6
7AUTHORS:  Gerhard Pfister             pfister@mathematik.uni-kl.de
9@*        Stefan Steidel              steidel@mathematik.uni-kl.de
10
11OVERVIEW:
12
13  A library for computing the signature of irreducible surface singularity.
14  The signature of a surface singularity is defined in [3]. The algorithm we
15  use has been proposed in [9].
16  Let g in C[x,y] define an isolated curve singularity at 0 in C^2 and
17  f:=z^N+g(x,y). The zero-set V:=V(f) in C^3 of f has an isolated singularity
18  at 0. For a small e>0 let V_e:=V(f-e) in C^3 be the Milnor fibre of (V,0) and
19  s: H_2(V_e,R) x H_2(V_e,R) ---> R be the intersection form (cf. [1],[7]).
20  H_2(V_e,R) is an m-dimensional R-vector space, m the Milnor number of (V,0)
21  (cf. [1],[4],[5],[6]), and s is a symmetric bilinear form.
22  Let sigma(f) be the signature of s, called the signature of the surface
23  singularity (V,0). Formulaes to compute the signature are given by Nemethi
24  (cf. [8],[9]) and van Doorn, Steenbrink (cf. [2]).
25  We have implemented three approaches using Puiseux expansions, the resolution
26  of singularities resp. the spectral pairs of the singularity.
27
28REFERENCES:
29
30 [1] Arnold, V.I.; Gusein-Zade, S.M.; Varchenko, A.N.: Singularities of
31     Differentiable Mappings. Vol. 1,2, Birkh\"auser (1988).
32 [2] van Doorn, M.G.M.; Steenbrink, J.H.M.: A supplement to the monodromy
33     theorem. Abh. Math. Sem. Univ. Hamburg 59, 225-233 (1989).
34 [3] Durfee, A.H.: The Signature of Smoothings of Complex Surface
35     Singularities. Mathematische Annalen 232, 85-98 (1978).
36 [4] de Jong, T.; Pfister, G.: Local Analytic Geometry. Vieweg (2000).
37 [5] Kerner, D.; Nemethi, A.: The Milnor fibre signature is not semi-continous.
38     arXiv:0907.5252 (2009).
39 [6] Kulikov, V.S.: Mixed Hodge Structures and Singularities. Cambridge Tracts
40     in Mathematics 132, Cambridge University Press (1998).
41 [7] Nemethi, A.: The real Seifert form and the spectral pairs of isolated
42     hypersurface singularities. Compositio Mathematica 98, 23-41 (1995).
43 [8] Nemethi, A.: Dedekind sums and the signature of f(x,y)+z^N. Selecta
44     Mathematica, New series, Vol. 4, 361-376 (1998).
45 [9] Nemethi, A.: The Signature of f(x,y)+z^\$. Proceedings of Real and Complex
46     Singularities (C.T.C. Wall's 60th birthday meeting, Liverpool (England),
47     August 1996), London Math. Soc. Lecture Notes Series 263, 131--149 (1999).
48
49PROCEDURES:
50 signatureBrieskorn(a1,a2,a3);  signature of singularity x^a1+y^a2+z^a3
51 signaturePuiseux(N,f);         signature of singularity z^N+f(x,y)=0, f irred.
52 signatureNemethi(N,f);         signature of singularity z^N+f(x,y)=0
53";
54
55LIB "hnoether.lib";
56LIB "alexpoly.lib";
57LIB "gmssing.lib";
58
59///////////////////////////////////////////////////////////////////////////////
60//------- sigma(z^N + f) in terms of Puiseux pairs of f for f irreducible -----
61
62static proc exponentSequence(poly f)
63//=== computes the sequence a_1,...,a_s of exponents as described in [Nemethi]
64//=== using the Puiseux pairs (m_1, n_1),...,(m_s, n_s) of f:
65//===  - a_1 = m_1,
66//===  - a_i = m_i - n_i * (m_[i-1] - n_[i-1] * a_[i-1]).
67//===
68//=== Return: list of two intvecs:
69//===         1st entry: A = (a_1,...,a_s)
70//===         2nd entry: N = (n_1,...,n_s)
71{
72   def R = basering;
73   ring S = 0,(x,y),dp;
74   poly f = fetch(R,f);
75   list puiseuxPairs = invariants(f);
76   setring R;
77
78   intvec M = puiseuxPairs[1][3];
79   intvec N = puiseuxPairs[1][4];
80
81   int i;
82   int a = M[1];
83   intvec A = a;
84   for(i = 2; i <= size(M); i++)
85   {
86      a = M[i] - N[i] * (M[i-1] - N[i-1] * a);
87      A[size(A)+1] = a;
88   }
89
90   return(list(A,N));
91}
92example
93{ "EXAMPLE:"; echo = 2;
94   ring r = 0,(x,y),dp;
95   exponentSequence(y4+2x3y2+x6+x5y);
96}
97
98///////////////////////////////////////////////////////////////////////////////
99
100proc signatureBrieskorn(int a1, int a2, int a3)
101"USAGE:  signatureBrieskorn(a1,a2,a3); a1,a2,a3 = integers
102RETURN:  signature of Brieskorn singularity x^a1+y^a2+z^a3
103EXAMPLE: example signatureBrieskorn; shows an example
104"
105{
106   int a_temp, t, k1, k2, k3, s_t, sigma;
107   number s;
108
109   if(a1 > a2) { a_temp = a1; a1 = a2; a2 = a_temp; }
110   if(a2 > a3) { a_temp = a2; a2 = a3; a3 = a_temp; }
111   if(a1 > a2) { a_temp = a1; a1 = a2; a2 = a_temp; }
112
113   for(t = 0; t <= 2; t++)
114   {
115      s_t = 0;
116      for(k1 = 1; k1 <= a1-1; k1++)
117      {
118         for(k2 = 1; k2 <= a2-1; k2++)
119         {
120            for(k3 = 1; k3 <= a3-1; k3++)
121            {
122               s = number(k1)/a1 + number(k2)/a2 + number(k3)/a3;
123               if(t < s)
124               {
125                  if(s < t+1)
126                  {
127                     s_t = s_t + 1;
128                  }
129                  else
130                  {
131                     break;
132                  }
133               }
134            }
135            if(k3 == 1) { break; }
136         }
137         if(k2 == 1) { break; }
138      }
139      sigma = sigma + (-1)^t * s_t;
140   }
141   return(sigma);
142}
143example
144{ "EXAMPLE:"; echo = 2;
145   ring R = 0,x,dp;
146   signatureBrieskorn(11,3,5);
147}
148
149///////////////////////////////////////////////////////////////////////////////
150
151proc signaturePuiseux(int N, poly f)
152"USAGE:  signaturePuiseux(N,f); N = int, f = irreducible poly in 2 variables
153RETURN:  signature of surface singularity defined by z^N + f(x,y) = 0
154EXAMPLE: example signaturePuiseux; shows an example
155"
156{
157   int i, d, prod, sigma;
158   list L = exponentSequence(f);
159   int s = size(L[2]);
160
161   if(s == 1)
162   {
163      return(signatureBrieskorn(L[1][1], L[2][1], N));
164   }
165
166   prod = 1;
167   sigma = signatureBrieskorn(L[1][s], L[2][s], N);
168   for(i = s - 1; i >= 1; i--)
169   {
170      prod = prod * L[2][i+1];
171      d = gcd(N, prod);
172      sigma = sigma + d * signatureBrieskorn(L[1][i], L[2][i], N div d);
173   }
174
175   return(sigma);
176}
177example
178{ "EXAMPLE:"; echo = 2;
179   ring r = 0,(x,y),dp;
180   int N  = 3;
181   poly f = x15-21x14+8x13y-6x13-16x12y+20x11y2-x12+8x11y-36x10y2
182            +24x9y3+4x9y2-16x8y3+26x7y4-6x6y4+8x5y5+4x3y6-y8;
183   signaturePuiseux(N,f);
184}
185
186///////////////////////////////////////////////////////////////////////////////
187//------- sigma(z^N + f) in terms of the imbedded resolution graph of f -------
188
189static proc dedekindSum(number b, number c, int a)
190{
191   number s,d,e;
192   int k;
193   for(k=1;k<=a-1;k++)
194   {
195      d=k*b mod a;
196      e=k*c mod a;
197      if(d*e!=0)
198      {
199         s=s+(d/a-1/2)*(e/a-1/2);
200      }
201   }
202   return(s);
203}
204
205///////////////////////////////////////////////////////////////////////////////
206
207static proc isRupture(intvec v)
208//=== decides whether the exceptional divisor given by the row v in the
209//=== incidence matrix of the resolution graph intersects at least 3 other
210//=== divisors
211{
212   int i,j;
213   for(i=1;i<=size(v);i++)
214   {
215       if(v[i]<0){return(0);}
216       if(v[i]!=0){j++;}
217   }
218   return(j>=4);
219}
220
221///////////////////////////////////////////////////////////////////////////////
222
223static proc sumExcepDiv(intmat N, list M, int K, int n)
224//=== computes part of the formulae for eta(g,K), g defining an
225//=== isolated curve singularity
226//=== N the incidence matrix of the resolution graph of g
227//=== M list of total multiplicities
228//=== n = nrows(N)
229{
230   int i,j,m,d;
231   for(i=1;i<=n;i++)
232   {
233      if(N[i,i]>0)
234      {
235         m=gcd(K,M[i]);
236         for(j=1;j<=n;j++)
237         {
238            if((i!=j)&&(N[i,j]!=0))
239            {
240               if(m==1){break;}
241               m=gcd(m,M[j]);
242            }
243         }
244         d=d+m-1;
245      }
246   }
247   return(d);
248}
249
250///////////////////////////////////////////////////////////////////////////////
251
252static proc sumEdges(intmat N, list M, int K, int n)
253//=== computes part of the formulae for eta(g,K), g defining an
254//=== isolated curve singularity
255//=== N the incidence matrix of the resolution graph of g
256//=== M list of total multiplicities
257//=== n = nrows(N)
258{
259   int i,j,d;
260   for(i=1;i<=n-1;i++)
261   {
262      for(j=i+1;j<=n;j++)
263      {
264         if(N[i,j]==1)
265         {
266            d=d+gcd(K,gcd(M[i],M[j]))-1;
267         }
268      }
269   }
270   return(d);
271}
272
273///////////////////////////////////////////////////////////////////////////////
274
275static proc etaRes(list L, int K)
276//=== L total multiplicities
277//=== eta-invariant in terms of the imbedded resolution graph of f
278{
279   int i,j,d;
280   intvec v;
281   number e;
282   intmat N = L[1];         // incidence matrix of the resolution graph
283   int n = ncols(L[1]);     // number of vertices in the resolution graph
284   int a = ncols(L[2]);     // number of branches
285   list M;                  // total multiplicities
286   for(i=1;i<=n;i++)
287   {
288      d=L[2][i,1];
289      for(j=2;j<=a;j++)
290      {
291         d=d+L[2][i,j];
292      }
293      if(d==0){d=1;}
294      M[i]=d;
295   }
296   for(i=1;i<=n;i++)
297   {
298      v=N[i,1..n];
299      if(isRupture(v))      // the divisor intersects more then two others
300      {
301         for(j=1;j<=n;j++)
302         {
303            if((i!=j)&&(v[j]!=0))
304            {
305               e=e+dedekindSum(M[j],K,M[i]);
306            }
307         }
308      }
309   }
310   if(a==1)
311   {
312      //the irreducible case
313      return(4*e);
314   }
315   return(a-1+4*e+sumEdges(N,M,K,n)-sumExcepDiv(N,M,K,n));
316}
317
318///////////////////////////////////////////////////////////////////////////////
319
320static proc signatureRes(int N, poly f)
321//=== computes signature of surface singularity defined by z^N + f(x,y) = 0
322//=== in terms of the imbedded resolution graph of f
323{
324   list L = totalmultiplicities(f);
325   return(etaRes(L,N) - N*etaRes(L,1));
326}
327
328///////////////////////////////////////////////////////////////////////////////
329//------------ sigma(z^N + f) in terms of the spectral pairs of f -------------
330
331static proc fracPart(number n)
332//=== computes the fractional part n2 of n
333//=== i.e. n2 is not in Z but n-n2 is in Z
334{
335   number a,b;
336   int r;
337   a = numerator(n);
338   b = denominator(n);
339   int z = int(number(a));
340   int y = int(number(b));
341   r = z mod y;
342   int q = (z-r) div y;
343   number n1 = q;
344   number n2 = n-n1;
345   return(n2);
346}
347
348///////////////////////////////////////////////////////////////////////////////
349
350static proc etaSpec(list L, int N)
351//=== L spectral numbers
352//=== eta-invariant in terms of the spectral pairs of f
353{
354   int i;
355   number e, h;
356
357   int n = ncols(L[1]);
358
359   if((n mod 2) == 0)
360   // 0 is not a spectral number, thus f is irreducible
361   {
362      for(i = n div 2+1; i <= n; i++)
363      {
364         e = e + (1 - 2 * fracPart(N * number(L[1][i]))) * L[3][i];
365      }
366      return(2*e);
367   }
368   else
369   // 0 is a spectral number, thus f is reducible
370   {
371      // sum of Hodge numbers in eta function
372      for(i = 1; i <= n; i++)
373      {
374         if((L[2][i] == 2) && ((denominator(leadcoef(N*L[1][i]))==1)
376         {
377            h = h + L[3][i];
378         }
379      }
380
381      // summand coming from spectral number 0 in eta function
382      h = h + L[3][(n+1) div 2];
383
384      // sum coming from non-zero spectral numbers in eta function
385      for(i = (n+3) div 2; i <= n; i++)
386      {
389         {
390            e = e + (1 - 2 * fracPart(N * number(L[1][i]))) * L[3][i];
391         }
392      }
393      return(h + 2*e);
394   }
395}
396
397///////////////////////////////////////////////////////////////////////////////
398
399static proc signatureSpec(int N, poly f)
400//=== computes signature of surface singularity defined by z^N + f(x,y) = 0
401//=== in terms of the spectral pairs of f
402{
403   def R = basering;
404   def Rds = changeord("ds");
405   setring Rds;
406   poly f = imap(R,f);
407   list L = sppairs(f);
408   setring R;
409   list L = imap(Rds,L);
410   return(etaSpec(L,N) - N*etaSpec(L,1));
411}
412
413///////////////////////////////////////////////////////////////////////////////
414//----------------- Consolidation of the two recent variants ------------------
415
416proc signatureNemethi(int N, poly f, list #)
417"USAGE:  signatureNemethi(N,f); N = integer, f = reduced poly in 2 variables,
418                                # empty or 1,2,3
419@*       - if #[1] = 1 then resolution of singularity is used
420@*       - if #[1] = 2 then spectral pairs are used
421@*       - if # is empty then both upper variants are used in parallel and the
422@*                 fastest returns the result
423RETURN:  signature of surface singularity defined by z^N + f(x,y) = 0
424REMARK:  computes the signature of some special surface singularities
425EXAMPLE: example signatureNemethi; shows an example
426"
427{
428   if(size(#) == 0)
429   {
430      link l(1) = "ssi:fork"; open(l(1));
431      link l(2) = "ssi:fork"; open(l(2));
432      list l = list(l(1),l(2));
433      write(l(1), quote(signatureRes(N,f)));
434      write(l(2), quote(signatureSpec(N,f)));
435      int winner = waitfirst(l);
437      close(l(1));
438      close(l(2));
439      if(printlevel >= 1)
440      {
441         if(winner == 1) { "Resolution of singularity has been used."; }
442         if(winner == 2) { "Spectral pairs have been used."; }
443      }
444      return(sigma);
445   }
446
447   if(#[1] == 1)
448   {
449      return(signatureRes(N,f));
450   }
451
452   if(#[1] == 2)
453   {
454      return(signatureSpec(N,f));
455   }
456}
457example
458{ "EXAMPLE:"; echo = 2;
459   ring r = 0,(x,y),dp;
460   int N  = 3;
461   poly f = x15-21x14+8x13y-6x13-16x12y+20x11y2-x12+8x11y-36x10y2
462            +24x9y3+4x9y2-16x8y3+26x7y4-6x6y4+8x5y5+4x3y6-y8;
463   signatureNemethi(N,f,1);
464   printlevel = 1;
465   signatureNemethi(N,f);
466}
467
468///////////////////////////////////////////////////////////////////////////////
469
470/*
471Further examples
472
473ring r = 0,(x,y),dp;
474int N;
475poly f,g,g1,g2,g3;
476
477
478// irreducible polynomials
479
480N = 5;
481f = x15-21x14+8x13y-6x13-16x12y+20x11y2-x12+8x11y-36x10y2
482    +24x9y3+4x9y2-16x8y3+26x7y4-6x6y4+8x5y5+4x3y6-y8;
483g = f^3 + x17y17;
484
485N = 6;
486f = y4+2x3y2+x6+x5y;
487g1 = f^2 + x5y5;
488g2 = f^3 + x11y11;
489g3 = f^3 + x17y17;
490
491N = 7;
492f = x5+y11;
493g1 = f^3 + x11y11;
494g2 = f^3 + x17y17;
495
496N = 6;
497// k0 = 30, k1 = 35, k2 = 71
498f = x71+6x65+15x59-630x52y6+20x53+6230x46y6+910x39y12+15x47
499    -7530x40y6+14955x33y12-285x26y18+6x41+1230x34y6+4680x27y12
500    +1830x20y18+30x13y24+x35-5x28y6+10x21y12-10x14y18+5x7y24-y30;
501
502// k0 = 16, k1 = 24, k2 = 28, k3 = 30, k4 = 31
503f = x31-781x30+16x29y-3010x29-2464x28y+104x27y2-2805x28-7024x27y
504    -5352x26y2+368x25y3+366x27-7136x26y-984x25y2-8000x24y3
505    +836x23y4+34x26-320x25y-6464x24y2+6560x23y3-8812x22y4+1392x21y5
506    -12x25+256x24y-1296x23y2-1536x22y3+4416x21y4-8864x20y5+1752x19y6
507    -x24+16x23y-88x22y2-16x21y3-404x20y4+3056x19y5-6872x18y6+1648x17y7
508    +8x21y2-96x20y3+524x19y4-1472x18y5+3464x17y6-3808x16y7+1290x15y8
509    -28x18y4+240x17y5-976x16y6+2208x15y7-2494x14y8+816x13y9+56x15y6
510    -320x14y7+844x13y8-1216x12y9+440x11y10-70x12y8+240x11y9-344x10y10
511    +240x9y11+56x9y10-96x8y11+52x7y12-28x6y12+16x5y13+8x3y14-y16;
512
513
514// reducible polynomials
515
516N = 12;
517f = ((y2-x3)^2 - 4x5y - x7)*(x2-y3);
518
519f = 2x3y3-2y5+x4-xy2;
520
521f = -x3y3+x6y+xy6-x4y4;
522*/
Note: See TracBrowser for help on using the repository browser.