Changeset 3c4dcc in git for Singular/LIB/hnoether.lib
- Timestamp:
- May 6, 2005, 4:39:20 PM (19 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 0d217d3f1cc4c0449bdb078c65fd1f43cd1a2b84
- Parents:
- e6fb5315eb32da00236163ce10f9bdafaaa0bd47
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/hnoether.lib
re6fb531 r3c4dcc 1 - version="$Id: hnoether.lib,v 1.47 2005-04-26 17:19:14 SingularExp $";1 version="$Id: hnoether.lib,v 1.48 2005-05-06 14:38:35 hannes Exp $"; 2 2 category="Singularities"; 3 3 info=" … … 7 7 8 8 OVERVIEW: 9 A library for computing the Hamburger-Noether expansion (analogue of 10 Puiseux expansion over fields of arbitrary characteristic) of a reduced 9 A library for computing the Hamburger-Noether expansion (analogue of 10 Puiseux expansion over fields of arbitrary characteristic) of a reduced 11 11 plane curve singularity following [Campillo, A.: Algebroid curves in 12 12 positive characteristic, Springer LNM 813 (1980)]. @* … … 219 219 f_neu=Tstar(f_neu); 220 220 refpoly=Tstar(refpoly); 221 //--- dividiere f_neu so lange durch x & y, wie die Division aufgeht, 222 // benutze ein Referenzpolynom mit gleichem Newtonpolynom wie f_neu zur 221 //--- dividiere f_neu so lange durch x & y, wie die Division aufgeht, 222 // benutze ein Referenzpolynom mit gleichem Newtonpolynom wie f_neu zur 223 223 // Beschleunigung: --- 224 224 for (hilf=refpoly/xp; hilf*xp==refpoly; hilf=refpoly/xp) {refpoly=hilf; s++;} … … 529 529 ); 530 530 } 531 531 532 532 string namex=varstr(1); string namey=varstr(2); 533 533 list return_error=matrix(maxideal(1)[2]),intvec(0),int(-1),poly(0),int(0); … … 807 807 f = T1_Transform(f,delt,M/ e); 808 808 dbprint(printlevel-voice+2,"a("+string(zeile)+","+string(Q)+") = " 809 +string(delt)); 809 +string(delt)); 810 810 a(zeile)[Q]=delt; 811 811 if (defined(HNDebugOn)) {"transformed polynomial: ",f;}} … … 815 815 //--------------------------- Fall R > 0 : ----------------------------------- 816 816 else { 817 dbprint(printlevel-voice+2, "h("+string(zeile)+ ") ="+string(Q)); 817 dbprint(printlevel-voice+2, "h("+string(zeile)+ ") ="+string(Q)); 818 818 hqs[zeile+1]=Q; // denn zeile beginnt mit dem Wert 0 819 819 a(zeile)[Q+1]=x; // Markierung des Zeilenendes der HNE … … 830 830 //--------------- schneidet das Newtonpolygon beide Achsen? ------------------ 831 831 if (M==-1) { 832 dbprint(printlevel-voice+2,"The HNE is finite!"); 832 dbprint(printlevel-voice+2,"The HNE is finite!"); 833 833 a(zeile)[Q+1]=x; // Markiere das Ende der Zeile 834 834 hqs[zeile+1]=Q; … … 915 915 "USAGE: param(L [,s]); L list, s any type (optional) 916 916 ASSUME: L is the output of @code{develop(f)}, or of 917 @code{extdevelop(develop(f),n)}, or (one entry in) the list of HN 917 @code{extdevelop(develop(f),n)}, or (one entry in) the list of HN 918 918 data created by @code{hnexpansion(f[,\"ess\"])}. 919 RETURN: If L are the HN data of an irreducible plane curve singularity f: a 919 RETURN: If L are the HN data of an irreducible plane curve singularity f: a 920 920 parametrization for f in the following format: @* 921 921 - if only the list L is given, the result is an ideal of two 922 922 polynomials p[1],p[2]: if the HNE was finite then f(p[1],p[2])=0}; 923 if not, the true parametrization will be given by two power series, 923 if not, the true parametrization will be given by two power series, 924 924 and p[1],p[2] are truncations of these series.@* 925 925 - if the optional parameter x is given, the result is a list l: … … 928 928 l[1] are exact (entry -1 means that the corresponding parametrization 929 929 is exact). 930 If L collects the HN data of a reducible plane curve singularity f, 931 the return value is a list of parametrizations in the respective 932 format. 930 If L collects the HN data of a reducible plane curve singularity f, 931 the return value is a list of parametrizations in the respective 932 format. 933 933 NOTE: If the basering has only 2 variables, the first variable is chosen 934 934 as indefinite. Otherwise, the 3rd variable is chosen. … … 947 947 for (int i=1; i<=size(L); i++) { 948 948 dbprint(printlevel-voice+4,"// Parametrization of branch number " 949 +string(i)+" computed."); 949 +string(i)+" computed."); 950 950 printlevel=printlevel+1; 951 951 if (return_list==1) { Ergebnis[i]=param(L[i],1); } … … 1026 1026 "// ** Warning: result is exact up to order "+string(fehlervor-1)+ 1027 1027 " in "+ string(var(1))+" and "+string(fehler-1)+" in " + 1028 string(var(2))+" !"); 1028 string(var(2))+" !"); 1029 1029 } 1030 1030 else { … … 1043 1043 "// ** Warning: result is exact up to order "+string(fehler-1)+ 1044 1044 " in "+ string(var(1))+" and "+string(fehlervor-1)+" in " + 1045 string(var(2))+" !"); 1045 string(var(2))+" !"); 1046 1046 } 1047 1047 else { … … 1080 1080 "USAGE: invariants(INPUT); INPUT list or poly 1081 1081 ASSUME: @code{INPUT} is the output of @code{develop(f)}, or of 1082 @code{extdevelop(develop(f),n)}, or one entry of the list of HN data 1082 @code{extdevelop(develop(f),n)}, or one entry of the list of HN data 1083 1083 computed by @code{hnexpansion(f[,\"ess\"])}. 1084 1084 RETURN: list @code{INV} of the following format: … … 1091 1091 INV[6]: intvec (sequence of multiplicities) 1092 1092 @end format 1093 If @code{INPUT} contains no valid HN expansion, the empty list is 1093 If @code{INPUT} contains no valid HN expansion, the empty list is 1094 1094 returned. 1095 ASSUME: @code{INPUT} is a bivariate polynomial f, or the output of 1096 @code{hnexpansion(f)}, or the list of HN data computed by 1095 ASSUME: @code{INPUT} is a bivariate polynomial f, or the output of 1096 @code{hnexpansion(f)}, or the list of HN data computed by 1097 1097 @code{hnexpansion(f [,\"ess\"])}. 1098 RETURN: list @code{INV}, such that @code{INV[i]} coincides with the output of 1099 @code{invariants(develop(f[i]))}, where f[i] is the i-th branch of 1100 f, and the last entry of @code{INV} contains further invariants of 1098 RETURN: list @code{INV}, such that @code{INV[i]} coincides with the output of 1099 @code{invariants(develop(f[i]))}, where f[i] is the i-th branch of 1100 f, and the last entry of @code{INV} contains further invariants of 1101 1101 f in the format: 1102 1102 @format … … 1129 1129 else { 1130 1130 return(invariants(L)); 1131 } 1131 } 1132 1132 } 1133 1133 if (typeof(#[1])=="ring") { … … 1137 1137 setring altring; 1138 1138 kill HNring; 1139 return(Ergebnis); 1139 return(Ergebnis); 1140 1140 } 1141 1141 if (typeof(#[1])=="list") { … … 1241 1241 { 1242 1242 tester=tester-1; 1243 } 1243 } 1244 1244 if ((multseq[tester]!=1) and (multseq[tester]!=k-tester)) 1245 1245 { … … 1247 1247 { 1248 1248 multseq[i]=1; 1249 } 1249 } 1250 1250 } 1251 1251 //--- Ende T.Keilen --- 06.05.02 … … 1279 1279 proc displayInvariants 1280 1280 "USAGE: displayInvariants(INPUT); INPUT list or poly 1281 ASSUME: @code{INPUT} is a bivariate polynomial, or the output of 1282 @code{develop(f)}, resp. of @code{extdevelop(develop(f),n)}, or (one 1283 entry of) the list of HN data computed by 1281 ASSUME: @code{INPUT} is a bivariate polynomial, or the output of 1282 @code{develop(f)}, resp. of @code{extdevelop(develop(f),n)}, or (one 1283 entry of) the list of HN data computed by 1284 1284 @code{hnexpansion(f[,\"ess\"])}. 1285 1285 RETURN: none … … 1356 1356 ""; 1357 1357 } 1358 if (size(#)>1) 1358 if (size(#)>1) 1359 1359 { 1360 1360 " -------------- contact numbers : -------------- ";""; 1361 1361 Ausgabe="branch | "; 1362 for (j=size(#); j>1; j--) 1362 for (j=size(#); j>1; j--) 1363 1363 { 1364 1364 if (size(string(j))==1) { Ausgabe=Ausgabe+" "+string(j)+" "; } 1365 1365 else { Ausgabe=Ausgabe+string(j)+" "; } 1366 } 1366 } 1367 1367 Ausgabe; 1368 1368 Ausgabe="-------+"; … … 1370 1370 Ausgabe=Ausgabe+"-----"; 1371 1371 Ausgabe; 1372 } 1373 for (j=1; j<size(#); j++) 1372 } 1373 for (j=1; j<size(#); j++) 1374 1374 { 1375 1375 if (size(string(j))==1) { Ausgabe=" "+string(j)+" |"; } 1376 1376 else { Ausgabe=" " +string(j)+" |"; } 1377 for (k=size(#); k>j; k--) 1377 for (k=size(#); k>j; k--) 1378 1378 { 1379 1379 mul=contact[j,k];//separateHNE(#[j],#[k]); … … 1385 1385 } 1386 1386 ""; 1387 if (size(#)>1) 1387 if (size(#)>1) 1388 1388 { 1389 1389 " -------------- intersection multiplicities : -------------- ";""; 1390 1390 Ausgabe="branch | "; 1391 for (j=size(#); j>1; j--) 1391 for (j=size(#); j>1; j--) 1392 1392 { 1393 1393 if (size(string(j))==1) { Ausgabe=Ausgabe+" "+string(j)+" "; } 1394 1394 else { Ausgabe=Ausgabe+string(j)+" "; } 1395 } 1395 } 1396 1396 Ausgabe; 1397 1397 Ausgabe="-------+"; … … 1399 1399 Ausgabe=Ausgabe+"-----"; 1400 1400 Ausgabe; 1401 } 1402 for (j=1; j<size(#); j++) 1401 } 1402 for (j=1; j<size(#); j++) 1403 1403 { 1404 1404 if (size(string(j))==1) { Ausgabe=" "+string(j)+" |"; } 1405 1405 else { Ausgabe=" " +string(j)+" |"; } 1406 for (k=size(#); k>j; k--) 1406 for (k=size(#); k>j; k--) 1407 1407 { 1408 1408 mul=intersectionmatrix[j,k];//intersection(#[j],#[k]); … … 1415 1415 ""; 1416 1416 " -------------- delta invariant of the curve : ",ergebnis[size(#)+1][3]; 1417 1417 1418 1418 } 1419 1419 return(); … … 1504 1504 proc intersection (list hn1, list hn2) 1505 1505 "USAGE: intersection(hne1,hne2); hne1, hne2 lists 1506 ASSUME: @code{hne1, hne2} represent an HN expansion of an irreducible plane 1506 ASSUME: @code{hne1, hne2} represent an HN expansion of an irreducible plane 1507 1507 curve singularity (that is, are the output of @code{develop(f)}, or of 1508 1508 @code{extdevelop(develop(f),n)}, or one entry of the list of HN data 1509 1509 computed by @code{hnexpansion(f[,\"ess\"])}). 1510 RETURN: int, the intersection multiplicity of the irreducible plane curve 1510 RETURN: int, the intersection multiplicity of the irreducible plane curve 1511 1511 singularities corresponding to @code{hne1} and @code{hne2}. 1512 1512 SEE ALSO: hnexpansion, displayInvariants … … 1611 1611 1612 1612 proc multsequence 1613 "USAGE: multsequence(INPUT); INPUT list or poly 1613 "USAGE: multsequence(INPUT); INPUT list or poly 1614 1614 ASSUME: @code{INPUT} is the output of @code{develop(f)}, or of 1615 @code{extdevelop(develop(f),n)}, or one entry of the list of HN data 1615 @code{extdevelop(develop(f),n)}, or one entry of the list of HN data 1616 1616 computed by @code{hnexpansion(f[,\"ess\"])}. 1617 1617 RETURN: intvec corresponding to the multiplicity sequence of the irreducible … … 1619 1619 coincides with @code{invariants(INPUT)[6]}). 1620 1620 1621 ASSUME: @code{INPUT} is a bivariate polynomial f, or the output of 1622 @code{hnexpansion(f)}, or the list of HN data computed by 1621 ASSUME: @code{INPUT} is a bivariate polynomial f, or the output of 1622 @code{hnexpansion(f)}, or the list of HN data computed by 1623 1623 @code{hnexpansion(f [,\"ess\"])}. 1624 1624 RETURN: list of two integer matrices: … … 1636 1636 @end table 1637 1637 @end texinfo 1638 NOTE: The order of the elements of the list of HN data obtained from 1638 NOTE: The order of the elements of the list of HN data obtained from 1639 1639 @code{hnexpansion(f [,\"ess\"])} must not be changed (because otherwise 1640 the coincident infinitely near points couldn't be grouped together, 1640 the coincident infinitely near points couldn't be grouped together, 1641 1641 see the meaning of the 2nd intmat in the example). 1642 1642 Hence, it is not wise to compute the HN expansion of polynomial factors 1643 separately, put them into a list INPUT and call 1643 separately, put them into a list INPUT and call 1644 1644 @code{multsequence(INPUT)}. @* 1645 1645 Use @code{displayMultsequence} to produce a better readable output for … … 1667 1667 else { 1668 1668 return(multsequence(L)); 1669 } 1669 } 1670 1670 } 1671 1671 if (typeof(#[1])=="ring") { … … 1675 1675 setring altring; 1676 1676 kill HNring; 1677 return(Ergebnis); 1677 return(Ergebnis); 1678 1678 } 1679 1679 //-- entferne ueberfluessige Daten zur Erhoehung der Rechengeschwindigkeit: -- … … 1710 1710 } 1711 1711 } 1712 //--- Ende T.Keilen --- 06.05.02 1712 //--- Ende T.Keilen --- 06.05.02 1713 1713 return(multseq); 1714 1714 } … … 1772 1772 proc displayMultsequence 1773 1773 "USAGE: displayMultsequence(INPUT); INPUT list or poly 1774 ASSUME: @code{INPUT} is a bivariate polynomial, or the output of 1775 @code{develop(f)}, resp. of @code{extdevelop(develop(f),n)}, or (one 1776 entry of) the list of HN data computed by @code{hnexpansion(f[,\"ess\"])}, 1774 ASSUME: @code{INPUT} is a bivariate polynomial, or the output of 1775 @code{develop(f)}, resp. of @code{extdevelop(develop(f),n)}, or (one 1776 entry of) the list of HN data computed by @code{hnexpansion(f[,\"ess\"])}, 1777 1777 or the output of @code{hnexpansion(f)}. 1778 1778 RETURN: nothing … … 1811 1811 displayMultsequence(L); 1812 1812 return(); 1813 } 1813 } 1814 1814 } 1815 1815 if (typeof(#[1])=="ring") { 1816 1816 def HNring = #[1]; setring HNring; 1817 1817 displayMultsequence(hne); 1818 return(); 1818 return(); 1819 1819 } 1820 1820 … … 1852 1852 } 1853 1853 } 1854 } 1854 } 1855 1855 example 1856 1856 { … … 1971 1971 "USAGE: displayHNE(L[,n]); L list, n int 1972 1972 ASSUME: L is the output of @code{develop(f)}, or of @code{exdevelop(f,n)}, 1973 or of @code{hnexpansion(f[,\"ess\"])}, or (one entry in) the list 1973 or of @code{hnexpansion(f[,\"ess\"])}, or (one entry in) the list 1974 1974 @code{hne} in the ring created by @code{hnexpansion(f[,\"ess\"])}. 1975 1975 RETURN: - if only one argument is given and if the input are the HN data … … 1988 1988 HN matrix.@* 1989 1989 - if a second argument is given and if the input are the HN data 1990 of an irreducible plane curve singularity, return a ring containing 1990 of an irreducible plane curve singularity, return a ring containing 1991 1991 an ideal @code{HNE} as described above.@* 1992 1992 - if L corresponds to the output of @code{hnexpansion(f)} 1993 1993 or to the list of HN data computed by @code{hnexpansion(f[,\"ess\"])}, 1994 @code{displayHNE(L[,n])} shows the HNE's of all branches of f in the 1994 @code{displayHNE(L[,n])} shows the HNE's of all branches of f in the 1995 1995 format described above. The optional parameter is then ignored. 1996 1996 NOTE: The 1st line of the above ideal (i.e., @code{HNE[1]}) means that … … 2061 2061 2062 2062 // lossen: output modified (06/2004) 2063 if (size(#) == 0) 2063 if (size(#) == 0) 2064 2064 { 2065 2065 if (switch==0) { … … 2071 2071 2072 2072 for (j=1; j<=ncols(HNE); j++){ 2073 string stHNE(j)=string(HNE[j]); 2073 string stHNE(j)=string(HNE[j]); 2074 2074 } 2075 2075 if (undef_bd<-1) 2076 { 2076 { 2077 2077 stHNE(size(v))=stHNE(size(v))+" + ..... (terms of degree >=" 2078 2078 +string(-undef_bd)+")"; 2079 2079 } 2080 2080 if (undef_bd==-1) 2081 { 2081 { 2082 2082 stHNE(size(v))=stHNE(size(v))+" + ..... (terms of degree >=" 2083 2083 +string(colM+1)+")"; … … 2086 2086 if (switch==0) { 2087 2087 stHNE(1) = " "+string(var(size(v)+2))+" = "+stHNE(1); 2088 } 2088 } 2089 2089 else { 2090 2090 stHNE(1) = " "+string(var(size(v)+1))+" = "+stHNE(1); 2091 } 2091 } 2092 2092 stHNE(1); 2093 2093 if (ncols(HNE)==1) {return();} 2094 2094 2095 2095 if (switch==0) { 2096 stHNE(2) = " "+string(var(size(v)+1))+" = "+stHNE(2); 2097 } 2096 stHNE(2) = " "+string(var(size(v)+1))+" = "+stHNE(2); 2097 } 2098 2098 else { 2099 stHNE(2) = " "+string(var(size(v)+2))+" = "+stHNE(2); 2100 } 2099 stHNE(2) = " "+string(var(size(v)+2))+" = "+stHNE(2); 2100 } 2101 2101 stHNE(2); 2102 2102 2103 2103 for (j=3; j<=ncols(HNE); j++){ 2104 stHNE(j)= " "+"z(" +string(j-2)+ ") = "+stHNE(j); 2104 stHNE(j)= " "+"z(" +string(j-2)+ ") = "+stHNE(j); 2105 2105 stHNE(j); 2106 2106 } … … 2161 2161 RETURN: list of intvecs (= coordinates x,y of the Newton polygon of f). 2162 2162 NOTE: Procedure uses @code{execute}; this can be avoided by calling 2163 @code{newtonpoly(f,1)} if the ordering of the basering is @code{ls}. 2163 @code{newtonpoly(f,1)} if the ordering of the basering is @code{ls}. 2164 2164 KEYWORDS: Newton polygon 2165 2165 EXAMPLE: example newtonpoly; shows an example … … 2194 2194 else 2195 2195 { 2196 map xytausch=@RR,var(2),var(1); 2197 } 2198 for (i=2; f!=0; i++) 2196 map xytausch=@RR,var(2),var(1); 2197 } 2198 for (i=2; f!=0; i++) 2199 2199 { 2200 2200 abbruch=0; 2201 while (abbruch==0) 2201 while (abbruch==0) 2202 2202 { 2203 C=leadexp(f); 2203 C=leadexp(f); 2204 2204 if(jet(f,A[2]*C[1]-A[1]*C[2]-1,intvec(A[2]-C[2],C[1]-A[1]))==0) 2205 { 2206 abbruch=1; 2207 } 2208 else 2209 { 2210 f=jet(f,-C[1]-1,intvec(-1,0)); 2205 { 2206 abbruch=1; 2207 } 2208 else 2209 { 2210 f=jet(f,-C[1]-1,intvec(-1,0)); 2211 2211 } 2212 2212 } 2213 2213 hilf=jet(f,A[2]*C[1]-A[1]*C[2],intvec(A[2]-C[2],C[1]-A[1])); 2214 2214 H=leadexp(xytausch(hilf)); 2215 A=H[2],H[1]; 2215 A=H[2],H[1]; 2216 2216 L[i]=A; 2217 2217 f=jet(f,A[2]*B[1]-1,intvec(A[2],B[1]-A[1])); … … 2241 2241 ASSUME: f is convenient, that is, f(x,0) != 0 != f(0,y);@* 2242 2242 mu (optional) is Milnor number of f.@* 2243 NP (optional) is output of @code{newtonpoly(f)}. 2243 NP (optional) is output of @code{newtonpoly(f)}. 2244 2244 RETURN: int: 1 if f in Newton non-degenerate, 0 otherwise. 2245 2245 SEE ALSO: newtonpoly … … 2269 2269 NP=newtonpoly(f); 2270 2270 i=size(NP)+1; 2271 } 2271 } 2272 2272 } 2273 2273 } … … 2290 2290 } 2291 2291 2292 if(mu==nN) 2292 if(mu==nN) 2293 2293 { // the Newton-polygon is non-degenerate 2294 2294 return(1); … … 2309 2309 2310 2310 // if already computed, one should give the Minor number and Newton polygon 2311 // as second and third input: 2311 // as second and third input: 2312 2312 int mu=milnor(g); 2313 2313 list NP=newtonpoly(g); … … 2495 2495 delt=-koeff(f,M,0)/koeff(f,M1,1); 2496 2496 a[Q]=delt; 2497 dbprint(printlevel-voice+2,"a("+string(zeile-1)+","+string(Q)+") = "+string(delt)); 2497 dbprint(printlevel-voice+2,"a("+string(zeile-1)+","+string(Q)+") = "+string(delt)); 2498 2498 if (Q<Exaktheit) { 2499 2499 f=T1_Transform(f,delt,Q); 2500 2500 if (defined(HNDebugOn)) { "transformed polynomial:",f; } 2501 2501 if (subst(f,y,0)==0) { 2502 dbprint(printlevel-voice+2,"The HNE is finite!"); 2502 dbprint(printlevel-voice+2,"The HNE is finite!"); 2503 2503 a[Q+1]=x; Exaktheit=Q; 2504 2504 f=0; // Speicherersparnis: f nicht mehr gebraucht … … 2629 2629 proc factorfirst(poly f, int M, int N) 2630 2630 "USAGE : factorfirst(f,M,N); f poly, M,N int 2631 RETURN: number d such that f=const*(y^(N/e) - d*x^(M/e))^e, where e=gcd(M,N), 2631 RETURN: number d such that f=const*(y^(N/e) - d*x^(M/e))^e, where e=gcd(M,N), 2632 2632 0 if such a d does not exist 2633 2633 EXAMPLE: example factorfirst; shows an example … … 2681 2681 ASSUME: f is a bivariate polynomial (in the first 2 ring variables) 2682 2682 RETURN: list @code{L}, containing Hamburger-Noether data of @code{f}: 2683 If the computation of the HNE required no field extension, @code{L} 2684 is a list of lists @code{L[i]} (corresponding to the output of 2683 If the computation of the HNE required no field extension, @code{L} 2684 is a list of lists @code{L[i]} (corresponding to the output of 2685 2685 @code{develop}, applied to a branch of @code{f}, but the last entry 2686 2686 being omitted): … … 2689 2689 @item @code{L[i][1]}; matrix: 2690 2690 Each row contains the coefficients of the corresponding line of the 2691 Hamburger-Noether expansion (HNE) for the i-th branch. The end of 2692 the line is marked in the matrix by the first ring variable 2691 Hamburger-Noether expansion (HNE) for the i-th branch. The end of 2692 the line is marked in the matrix by the first ring variable 2693 2693 (usually x). 2694 2694 @item @code{L[i][2]}; intvec: 2695 2695 indicating the length of lines of the HNE 2696 2696 @item @code{L[i][3]}; int: 2697 0 if the 1st ring variable was transversal (with respect to the 2697 0 if the 1st ring variable was transversal (with respect to the 2698 2698 i-th branch), @* 2699 2699 1 if the variables were changed at the beginning of the … … 2701 2701 -1 if an error has occurred. 2702 2702 @item @code{L[i][4]}; poly: 2703 the transformed equation of the i-th branch to make it possible 2704 to extend the Hamburger-Noether data a posteriori without having 2703 the transformed equation of the i-th branch to make it possible 2704 to extend the Hamburger-Noether data a posteriori without having 2705 2705 to do all the previous calculation once again (0 if not needed). 2706 2706 @end table … … 2708 2708 If the computation of the HNE required a field extension, the first 2709 2709 entry @code{L[1]} of the list is a ring, in which a list @code{hne} 2710 of lists (the HN data, as above) and a poly @code{f} (image of 2711 @code{f} over the new field) are stored. 2710 of lists (the HN data, as above) and a poly @code{f} (image of 2711 @code{f} over the new field) are stored. 2712 2712 @* 2713 If called with an additional input parameter, @code{hnexpansion} 2714 computes only one representative for each class of conjugate 2715 branches (over the ground field active when calling the procedure). 2716 In this case, the returned list @code{L} always has only two 2717 entries: @code{L[1]} is either a list of lists (the HN data) or a 2713 If called with an additional input parameter, @code{hnexpansion} 2714 computes only one representative for each class of conjugate 2715 branches (over the ground field active when calling the procedure). 2716 In this case, the returned list @code{L} always has only two 2717 entries: @code{L[1]} is either a list of lists (the HN data) or a 2718 2718 ring (as above), and @code{L[2]} is an integer vector (the number 2719 2719 of branches in the respective conjugacy classes). 2720 2720 2721 2721 NOTE: If f is known to be irreducible as a power series, @code{develop(f)} 2722 could be chosen instead to avoid a change of basering during the 2722 could be chosen instead to avoid a change of basering during the 2723 2723 computations. @* 2724 2724 Increasing @code{printlevel} leads to more and more comments. @* … … 2730 2730 " 2731 2731 { 2732 int essential; 2732 int essential; 2733 2733 if (size(#)==1) { essential=1; } 2734 2734 int field_ext; … … 2773 2773 // ----- display the multsequence in a nice way 2774 2774 if (size(hne)>2) 2775 { 2775 { 2776 2776 int i,j,k,m; 2777 2777 list dummy; … … 2781 2781 for (i=1;i<no_br;i++) 2782 2782 { 2783 for (j=i+1;j<=no_br;j++) 2784 { 2783 for (j=i+1;j<=no_br;j++) 2784 { 2785 2785 nbhd[i,j]=separateHNE(hne[i],hne[j]); 2786 2786 k=i+1; … … 2789 2789 k++; 2790 2790 } 2791 if (k<j) // branches have to be resorted 2791 if (k<j) // branches have to be resorted 2792 2792 { 2793 2793 dummy=hne[j]; … … 2805 2805 } 2806 2806 // ----- 2807 2807 2808 2808 if (field_ext==1) { 2809 2809 dbprint(printlevel-voice+3," 2810 2810 // 'hnexpansion' created a list of one ring. 2811 // To see the ring and the data stored in the ring, type (if you assigned 2812 // the name L to the list): 2811 // To see the ring and the data stored in the ring, type (if you assigned 2812 // the name L to the list): 2813 2813 show(L); 2814 // To display the computed HN expansion, type 2814 // To display the computed HN expansion, type 2815 2815 def HNring = L[1]; setring HNring; displayHNE(hne); "); 2816 2816 if (essential==1) { 2817 2817 dbprint(printlevel-voice+3,""+ 2818 "// As second entry of the returned list L, you obtain an integer vector, 2818 "// As second entry of the returned list L, you obtain an integer vector, 2819 2819 // indicating the number of conjugates for each of the computed branches."); 2820 2820 return(list(HNEring,hne_conj)); 2821 } 2821 } 2822 2822 return(list(HNEring)); 2823 2823 } … … 2832 2832 kill mmm,HNhelpring; 2833 2833 } 2834 else { 2834 else { 2835 2835 list hne=fetch(HNEring,hne); 2836 2836 } … … 2866 2866 basering; 2867 2867 setring r; kill R; 2868 2868 2869 2869 // Computing only one representative per conjugacy class: 2870 2870 L=hnexpansion((x4-y6)*(y2+x4),"ess"); … … 2881 2881 second entry = 0 if no change of base ring necessary 2882 2882 1 if change of base ring necessary 2883 third entry = numbers of conjugates ( if essential = 1 ) 2883 third entry = numbers of conjugates ( if essential = 1 ) 2884 2884 if some error has occured, the empty list is returned 2885 " 2885 " 2886 2886 { 2887 2887 def altring = basering; … … 2925 2925 "// ** WARNING: Algebraic extension of given ground field not possible!"; 2926 2926 "// ** We try to develop this polynomial, but if the need for a field"; 2927 "// ** extension occurs during the calculation, we cannot proceed with"; 2927 "// ** extension occurs during the calculation, we cannot proceed with"; 2928 2928 "// ** the corresponding branches."; 2929 2929 execute("ring HNEring=("+charstr(basering)+"),(x,y),ls;"); … … 2960 2960 } 2961 2961 } 2962 2962 2963 2963 if (defined(HNDebugOn)) 2964 2964 {"received polynomial: ",f,", with x =",namex,", y =",namey;} … … 2967 2967 int Abbruch,i,NullHNEx,NullHNEy; 2968 2968 string str; 2969 list Newton,hne; 2969 list Newton,hne; 2970 2970 2971 2971 // --- changed for SINGULAR 3: --- … … 3147 3147 3148 3148 //----- hier steht die Anzahl bisher benoetigter Ringerweiterungen drin: ----- 3149 int EXTHNEnumber=0; 3149 int EXTHNEnumber=0; 3150 3150 3151 3151 list EXTHNEring; … … 3162 3162 if (grenze1>0) { 3163 3163 if (EXTHNEnumber>0){ EXTHNEring = EXTHNEring(1..EXTHNEnumber); } 3164 HNE_RingDATA = list(HNEring, HNE_noparam, EXTHNEnumber, EXTHNEring, 3165 number_of_letztring); 3164 HNE_RingDATA = list(HNEring, HNE_noparam, EXTHNEnumber, EXTHNEring, 3165 number_of_letztring); 3166 3166 3167 3167 list hilflist=HN(HNE_RingDATA,f,grenze1,1,essential,0,hne_conj,1); … … 3186 3186 if (not(defined(f))) {poly f; f=hole(f); export f;} 3187 3187 else {f=hole(f);} 3188 } 3188 } 3189 3189 number_of_letztring = hilflist[2]; 3190 kill hilflist; 3190 kill hilflist; 3191 3191 } 3192 3192 … … 3210 3210 3211 3211 HNE_RingDATA = list(HNEring, HNE_noparam, EXTHNEnumber, EXTHNEring, 3212 number_of_letztring); 3212 number_of_letztring); 3213 3213 list hilflist=HN(HNE_RingDATA,xytausch(f),grenze2,1,essential,1,hne_conj,1); 3214 3214 kill HNEring, HNE_noparam; … … 3219 3219 for (i=1; i<=EXTHNEnumber; i++) { def EXTHNEring(i)=hilflist[1][4][i]; } 3220 3220 if (hilflist[2]==0) { setring HNEring; number_of_letztring=0; } 3221 else { setring EXTHNEring(hilflist[2]); 3221 else { setring EXTHNEring(hilflist[2]); 3222 3222 number_of_letztring=hilflist[2]; } 3223 3223 if (hilflist[3]==1){field_ext=1;} … … 3234 3234 3235 3235 // --- aufraeumen --- 3236 if (defined(HNEakut)){ 3236 if (defined(HNEakut)){ 3237 3237 kill HNEakut,faktoren,deltais,transformiert,teiler,leitf; 3238 3238 } … … 3264 3264 /////////////////////////////////////////////////////////////////////////////// 3265 3265 static proc HN (list HNE_RingDATA,poly fneu,int grenze,Aufruf_Ebene, 3266 essential,getauscht,intvec hne_conj,int conj_factor) 3266 essential,getauscht,intvec hne_conj,int conj_factor) 3267 3267 "NOTE: This procedure is only for internal use, it is called via pre_HN 3268 RETURN: list: first entry = list of HNErings, 3268 RETURN: list: first entry = list of HNErings, 3269 3269 second entry = number of new base ring (0 for HNEring, 3270 3270 -1 for HNE_noparam, … … 3290 3290 int number_of_letztring = HNE_RingDATA[5]; 3291 3291 if (defined(basering)) 3292 { 3292 { 3293 3293 if (number_of_letztring==0) { kill HNEring; def HNEring=basering; } 3294 else { kill EXTHNEring(number_of_letztring); 3294 else { kill EXTHNEring(number_of_letztring); 3295 3295 def EXTHNEring(number_of_letztring)=basering; } 3296 3296 } … … 3298 3298 { 3299 3299 if ( number_of_letztring==0) { setring HNEring; } 3300 else { setring EXTHNEring(number_of_letztring); } 3300 else { setring EXTHNEring(number_of_letztring); } 3301 3301 } 3302 3302 if (not(defined(hne))) {list hne;} … … 3376 3376 // voice abzufragen macht bei rekursiven procs keinen Sinn 3377 3377 azeilen[zeile+1][Q+1]=x; 3378 //----- Q wird nur in hqs eingetragen, wenn der Spezialfall nicht 3378 //----- Q wird nur in hqs eingetragen, wenn der Spezialfall nicht 3379 3379 // eintritt (siehe unten) ----- 3380 3380 Abbruch=2; … … 3388 3388 // Wir haben das Problem, dass die HNE eines Zweiges hier abbricht, 3389 3389 // aber ein anderer Zweig bis hierher genau die gleiche HNE hat, die 3390 // noch weiter geht 3391 // Loesung: mache Transform. rueckgaengig und behandle fneu im 3390 // noch weiter geht 3391 // Loesung: mache Transform. rueckgaengig und behandle fneu im 3392 3392 // Verzweigungsteil 3393 3393 //------------------------------------------------------------------ … … 3415 3415 list faktoren; 3416 3416 ideal deltais; 3417 list HNEakut=ideal(0); 3417 list HNEakut=ideal(0); 3418 3418 intvec eis; 3419 3419 int zaehler,hnezaehler,zl,zl1,M1,N1,R1,Q1,needext; … … 3430 3430 //======= Schleife fuer jede zu betrachtende Seite des Newtonpolygons: ====== 3431 3431 for(i=zeiger; i<size(Newton); i++) { 3432 if ((essential==1) and (EXTHNEnumber>number_of_letztring)) { 3432 if ((essential==1) and (EXTHNEnumber>number_of_letztring)) { 3433 3433 // ----- setze ring zurueck fuer neue Kante ----- 3434 3434 // ---- (damit konjugierte Zweige erkennbar) ----- … … 3439 3439 setring SaveRing; 3440 3440 if (not(defined(HNEs))) { // HN wurde zum 2.Mal von pre_HN aufgerufen 3441 list HNEs=ideal(0); 3441 list HNEs=ideal(0); 3442 3442 } 3443 3443 for (k=number_of_letztring+1; k<=EXTHNEnumber; k++) { kill EXTHNEring(k);} 3444 EXTHNEnumber=number_of_letztring; 3444 EXTHNEnumber=number_of_letztring; 3445 3445 if (EXTHNEnumber==0) { setring HNEring; } 3446 3446 else { setring EXTHNEring(EXTHNEnumber); } … … 3470 3470 for (numberofRingchanges=1; needext==1; numberofRingchanges++) { 3471 3471 leitf=redleit(fneu,Newton[i],Newton[i+1])/ 3472 (x^Newton[i][1]*y^Newton[i+1][2]); 3472 (x^Newton[i][1]*y^Newton[i+1][2]); 3473 3473 delt=factorfirst(leitf,M,N); 3474 3474 needext=0; … … 3476 3476 //---------- Sonderbehandlung: faktorisiere einige Polynome ueber Q(a): -- 3477 3477 if ((charstr(basering)=="0,a") and (essential==0)) { 3478 faktoren=factorize(charPoly(leitf,M,N)); 3478 faktoren=factorize(charPoly(leitf,M,N)); 3479 3479 conjugates=1; 3480 3480 for (k=2;k<=size(faktoren[2]);k++) {conjugates=conjugates,1;} … … 3499 3499 for (k=2;k<=size(hilf_id);k++) { 3500 3500 dd=dd+deg(hilf_id[k]); 3501 if (deg(hilf_id[k])<deg(fac)) { fac=hilf_id[k]; } 3501 if (deg(hilf_id[k])<deg(fac)) { fac=hilf_id[k]; } 3502 3502 } 3503 3503 faktoren[1][zaehler]=fac; 3504 kill fac; 3505 conjugates[zaehler]=conj_factor*dd; 3504 kill fac; 3505 conjugates[zaehler]=conj_factor*dd; 3506 3506 } 3507 else { 3508 faktoren[1][zaehler]=hilf_id[1]; 3509 conjugates[zaehler]=conj_factor; 3507 else { 3508 faktoren[1][zaehler]=hilf_id[1]; 3509 conjugates[zaehler]=conj_factor; 3510 3510 } 3511 3511 } … … 3548 3548 } 3549 3549 if (parstr(basering)=="") { 3550 EXTHNEnumber++; 3550 EXTHNEnumber++; 3551 3551 def EXTHNEring(EXTHNEnumber) = splitring(zerlege); 3552 3552 setring EXTHNEring(EXTHNEnumber); … … 3555 3555 poly transfproc=0; 3556 3556 ring_changed=1; 3557 export transfproc; 3557 export transfproc; 3558 3558 } 3559 3559 else { 3560 3560 if (numberofRingchanges>1) { // ein Ringwechsel hat nicht gereicht 3561 def helpring = splitring(zerlege,list(transf,transfproc,faktoren)); 3561 def helpring = splitring(zerlege,list(transf,transfproc,faktoren)); 3562 3562 kill EXTHNEring(EXTHNEnumber); 3563 3563 def EXTHNEring(EXTHNEnumber)=helpring; … … 3594 3594 } 3595 3595 //----------------------------------------------------------------------- 3596 // transf enthaelt jetzt den alten Parameter des Ringes, der aktiv war 3597 // vor Beginn der Schleife (evtl. also ueber mehrere Ringwechsel 3598 // weitergereicht), 3599 // transfproc enthaelt den alten Parameter des Ringes, der aktiv war zu 3596 // transf enthaelt jetzt den alten Parameter des Ringes, der aktiv war 3597 // vor Beginn der Schleife (evtl. also ueber mehrere Ringwechsel 3598 // weitergereicht), 3599 // transfproc enthaelt den alten Parameter des Ringes, der aktiv war zu 3600 3600 // Beginn der Prozedur, und der an die aufrufende Prozedur zurueckgegeben 3601 // werden muss 3601 // werden muss 3602 3602 // transf ist Null, falls der alte Ring keinen Parameter hatte, 3603 3603 // das gleiche gilt fuer transfproc … … 3622 3622 if (not defined(faktoren)) {list faktoren; } 3623 3623 faktoren=imap(letztring,faktoren); 3624 3624 3625 3625 if (not(defined(azeilen))){list azeilen,HNEs;} 3626 3626 azeilen=imap(letztring,azeilen); … … 3638 3638 poly f=hole(f); 3639 3639 list hne=hole(hne); 3640 export f,hne; 3640 export f,hne; 3641 3641 } 3642 3642 } … … 3665 3665 //============ Schleife fuer jeden gefundenen Faktor der Leitform: ========= 3666 3666 for (j=1; j<=size(eis); j++) { 3667 //---- Mache Transformation T1 oder T2, trage Daten in HNEs ein, 3667 //---- Mache Transformation T1 oder T2, trage Daten in HNEs ein, 3668 3668 // falls HNE abbricht: ---- 3669 3669 … … 3710 3710 // Werte von: zeile: aktuelle Zeilennummer der HNE (gemeinsamer Teil) 3711 3711 // zl : die HNE spaltet auf; zeile+zl ist der Index fuer die 3712 // Zeile des aktuellen Zweigs; (zeile+zl-2) ist die 3713 // tatsaechl. Zeilennr. (bei 0 angefangen) der HNE 3712 // Zeile des aktuellen Zweigs; (zeile+zl-2) ist die 3713 // tatsaechl. Zeilennr. (bei 0 angefangen) der HNE 3714 3714 // ([1] <- intvec(hqs), [2] <- 0. Zeile usw.) 3715 3715 //---------------------------------------------------------------------- … … 3757 3757 3758 3758 if (EXTHNEnumber>0){ EXTHNEring = EXTHNEring(1..EXTHNEnumber); } 3759 HNE_RingDATA = list( HNEring, HNE_noparam, EXTHNEnumber, EXTHNEring, 3760 lastRingnumber); 3759 HNE_RingDATA = list( HNEring, HNE_noparam, EXTHNEnumber, EXTHNEring, 3760 lastRingnumber); 3761 3761 if (defined(HNerg)) {kill HNerg;} 3762 3762 list HNerg=HN(HNE_RingDATA,transformiert,eis[j],Aufruf_Ebene+1, 3763 essential,getauscht,hne_conj,conj2[j]); 3763 essential,getauscht,hne_conj,conj2[j]); 3764 3764 HNE_RingDATA = HNerg[1]; 3765 3765 if (conj1==0) { conj1=HNerg[5]; } … … 3775 3775 {" ring change in HN(",Aufruf_Ebene+1,") detected";} 3776 3776 EXTHNEnumber = HNerg[1][3]; 3777 for (i=lastRingnumber+1; i<=EXTHNEnumber; i++) { 3778 def EXTHNEring(i)=HNerg[1][4][i]; 3779 } 3777 for (i=lastRingnumber+1; i<=EXTHNEnumber; i++) { 3778 def EXTHNEring(i)=HNerg[1][4][i]; 3779 } 3780 3780 if (HNerg[2]==0) { setring HNEring; } 3781 3781 else { setring EXTHNEring(HNerg[2]); } … … 3784 3784 kill tempRing; 3785 3785 3786 //--- stelle lokale Variablen im neuen Ring wieder her, und rette 3786 //--- stelle lokale Variablen im neuen Ring wieder her, und rette 3787 3787 // gegebenenfalls ihren Inhalt: ---- 3788 3788 list erg,faktoren,HNEakut; 3789 ideal hilfid; 3789 ideal hilfid; 3790 3790 erg=ideal(0); faktoren=erg; HNEakut=erg; 3791 3791 poly leitf,teiler,transformiert; … … 3816 3816 poly fneu=hole(fneu); 3817 3817 if (not(defined(f))) 3818 { 3818 { 3819 3819 poly f=hole(f); 3820 3820 list hne=hole(hne); … … 3827 3827 HNEs,hnezaehler=constructHNEs(HNEs,hnezaehler,aneu,azeilen,zeile, 3828 3828 deltais,Q,j); 3829 kill aneu; 3829 kill aneu; 3830 3830 } 3831 3831 else { … … 3859 3859 } 3860 3860 HNEakut[zeile+zl]=hilfid; 3861 // ------ vorher HNEs[.][zeile+zl]<-aneu[.][2], 3861 // ------ vorher HNEs[.][zeile+zl]<-aneu[.][2], 3862 3862 // jetzt [zeile+zl+1] <- [3] usw.: -------- 3863 3863 for (zl1=3; zl1<=size(aneu[zaehler]); zl1++) { … … 3890 3890 setring HNE_noparam; 3891 3891 if (not(defined(a_x))){ map a_x,a_y; poly mp_save, mp_new; } 3892 mp_save=imap(SaveRing,miniPol); 3893 mp_new=imap(EXTHNEring(EXTHNEnumber-1),miniPol); 3892 mp_save=imap(SaveRing,miniPol); 3893 mp_new=imap(EXTHNEring(EXTHNEnumber-1),miniPol); 3894 3894 if (mp_save==mp_new) { // Sonderfall: wieder gleicher Ring 3895 3895 def EXTHNEring(EXTHNEnumber)=SaveRing; … … 3901 3901 HNEs[size(HNEs)+1..size(HNEs)+size(dummyL)]=dummyL[1..size(dummyL)]; 3902 3902 kill dummyL,SaveRing; 3903 } 3903 } 3904 3904 else { // verschiedene Ringe 3905 3905 a_x=HNE_noparam,x,0,0; … … 3912 3912 poly fac=Lfac[1][1]; 3913 3913 for (k=2;k<=size(Lfac[1]);k++) { 3914 if (deg(Lfac[1][k])<deg(fac)) { fac=Lfac[1][k]; } 3914 if (deg(Lfac[1][k])<deg(fac)) { fac=Lfac[1][k]; } 3915 3915 } 3916 3916 … … 3937 3937 kill erg; 3938 3938 setring HNE_noparam; 3939 if (not(defined(HNEs1))) { list HNEs1=ideal(0); } 3939 if (not(defined(HNEs1))) { list HNEs1=ideal(0); } 3940 3940 HNEs1=imap(EXTHNEring(EXTHNEnumber-1),HNEs); 3941 if (not(defined(hne))) { list hne=ideal(0); } 3941 if (not(defined(hne))) { list hne=ideal(0); } 3942 3942 hne=imap(SaveRing,hne); 3943 3943 HNEs=imap(SaveRing,HNEs); … … 3945 3945 map hole=HNE_noparam,transf,x,y; 3946 3946 poly fneu=hole(fneu); 3947 poly f=hole(f); 3947 poly f=hole(f); 3948 3948 map phi=HNE_noparam,transb,x,y; 3949 3949 list HNEs=hole(HNEs); … … 3958 3958 } 3959 3959 else { // nur bei letzter Kante muss was getan werden 3960 if (i==size(Newton)-1) { 3960 if (i==size(Newton)-1) { 3961 3961 EXTHNEnumber++; 3962 3962 if (number_of_letztring==0) { def letztring=HNEring; } 3963 3963 else { def letztring=EXTHNEring(EXTHNEnumber); } 3964 if (minpoly==0) { 3964 if (minpoly==0) { 3965 3965 def EXTHNEring(EXTHNEnumber)=SaveRing; 3966 3966 setring EXTHNEring(EXTHNEnumber); … … 3973 3973 else { // muessen Daten nach SaveRing uebertragen; 3974 3974 setring HNE_noparam; 3975 if (not(defined(HNEs))) { list HNEs; } 3975 if (not(defined(HNEs))) { list HNEs; } 3976 3976 HNEs=imap(letztring,HNEs); 3977 3977 def EXTHNEring(EXTHNEnumber)=SaveRing; … … 3988 3988 } 3989 3989 } 3990 // -----------------end of new part (loop for essential=1) ---------------- 3990 // -----------------end of new part (loop for essential=1) ---------------- 3991 3991 } // end (Loop uber Kanten) 3992 3992 if (defined(SaveRing)) { kill SaveRing; } … … 3995 3995 HNEs[1]=list(hqs)+azeilen+list(fneu); // fneu ist transform. Poly oder Null 3996 3996 conj1[1]=conj_factor; 3997 } 3997 } 3998 3998 3999 3999 if (Aufruf_Ebene == 1) 4000 4000 { 4001 4001 if ((number_of_letztring!=EXTHNEnumber) and (not(defined(hne)))) 4002 { 4002 { 4003 4003 //----- falls Zweige in transz. Erw. berechnet werden konnten --------- 4004 if (defined(transfproc)) 4004 if (defined(transfproc)) 4005 4005 { // --- Ringwechsel hat stattgefunden --- 4006 4006 if (defined(HNDebugOn)) {" ring change in HN(",1,") detected";} … … 4029 4029 } 4030 4030 else 4031 { // HN wurde rekursiv aufgerufen 4031 { // HN wurde rekursiv aufgerufen 4032 4032 if (number_of_letztring!=EXTHNEnumber) 4033 4033 { // Ringwechsel hatte stattgefunden 4034 4034 string mipl_alt = string(minpoly); 4035 4035 execute("ring tempRing = ("+charstr(basering)+"),("+varstr(basering)+ 4036 "),("+ordstr(basering)+");"); 4036 "),("+ordstr(basering)+");"); 4037 4037 execute("minpoly="+ mipl_alt +";"); 4038 4038 list HNEs=imap(EXTHNEring(EXTHNEnumber),HNEs); 4039 4039 export HNEs; 4040 if (defined(HNDebugOn)) {" ! tempRing defined ! ";} 4041 } 4040 if (defined(HNDebugOn)) {" ! tempRing defined ! ";} 4041 } 4042 4042 if (conj1!=0) { hne_conj=conj1; } 4043 4043 else { hne_conj=conj_factor; } … … 4121 4121 { 4122 4122 int k; 4123 if ((size(#)>=1) and ((typeof(#[1])=="intvec") or (typeof(#[1])=="int"))) { 4124 int with_conj = 1; intvec C = #[1]; 4125 } 4126 else { 4127 int with_conj = 0; intvec C = L[2]; 4123 if ((size(#)>=1) and ((typeof(#[1])=="intvec") or (typeof(#[1])=="int"))) { 4124 int with_conj = 1; intvec C = #[1]; 4125 } 4126 else { 4127 int with_conj = 0; intvec C = L[2]; 4128 4128 } 4129 4129 // eine Sortierung der Faktoren eruebrigt sich, weil keine zwei versch. … … 4209 4209 or the list of HN data computed by @code{hnexpansion(f)}. 4210 4210 RETURN: int, the delta invariant of the singularity at 0, that is, the vector 4211 space dimension of R~/R, (R~ the normalization of the local ring of 4211 space dimension of R~/R, (R~ the normalization of the local ring of 4212 4212 the singularity. 4213 4213 NOTE: In case the Hamburger-Noether expansion of the curve f is needed … … 4229 4229 else { 4230 4230 return(delta(L)); 4231 } 4231 } 4232 4232 } 4233 4233 if (typeof(#[1])=="ring") { // INPUT = HNEring of curve … … 4235 4235 return(delta(hne)); 4236 4236 } 4237 if (typeof(#[1])=="matrix") 4238 { // INPUT = hne of an irreducible curve 4237 if (typeof(#[1])=="matrix") 4238 { // INPUT = hne of an irreducible curve 4239 4239 return(invariants(#)[5]/2); 4240 4240 } 4241 else 4241 else 4242 4242 { // INPUT = hne of a reducible curve 4243 4243 list INV=invariants(#);
Note: See TracChangeset
for help on using the changeset viewer.