Changeset 7b3971 in git
- Timestamp:
- Feb 5, 2001, 1:01:39 PM (23 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 7658571fa599a7581bd2feaa67021a15b67187a4
- Parents:
- d2087041ae4c66e9858042b1fd1cdc41851a03d4
- Location:
- Singular/LIB
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/equising.lib
rd208704 r7b3971 1 version="$Id: equising.lib,v 1. 6 2001-01-31 15:36:02lossen Exp $";1 version="$Id: equising.lib,v 1.7 2001-02-05 12:01:37 lossen Exp $"; 2 2 category="Singularities"; 3 3 info=" … … 7 7 PROCEDURES: 8 8 esStratum(F[,m]); computes the equisingularity stratum of a deformation 9 isEquising(F[,m]); tests , whethera given deformation is equisingular9 isEquising(F[,m]); tests if a given deformation is equisingular 10 10 "; 11 11 … … 752 752 753 753 proc esStratum (poly p_F, list #) 754 "USAGE: esStratum(F[,m]); F a polynomial, m an integer754 "USAGE: esStratum(F[,m]); F poly, m int 755 755 ASSUME: F defines a deformation of an irreducible bivariate polynomial f 756 and th at char(basering) does not divide mult(f).756 and the characteristic of the basering does not divide mult(f). @* 757 757 If nv is the number of variables of the basering, then the first nv-2 758 ringvariables are the deformation parameters.758 variables are the deformation parameters. @* 759 759 If the basering is a qring, ideal(basering) must only depend 760 760 on the deformation parameters. 761 RETURN: A list l of an ideal and an integer, where 762 l[1] is the ideal in the deformation parameters, defining the 763 equisingularity stratum of F, 764 l[2] = 1 if some error has occured, l[2] = 0 otherwise. 765 If m is given, the computation stops after m steps of the iteration. 766 NOTE: printlevel > 0 displays comments and pauses after intermediate 767 computations (default: printlevel=0) 768 This proc uses 'execute' or calls a procedure using 'execute'. 761 RETURN: list l of an ideal and an integer, where 762 @format 763 l[1] is the ideal in the deformation parameters, defining the ES-stratum of F, 764 l[2]=1 if some error has occured, l[2]=0 otherwise. 765 @end format 766 NOTE: If m is given, the computation stops after m steps of the iteration. @* 767 printlevel > 0 displays comments and pauses after intermediate 768 computations (default: printlevel=0) @* 769 This procedure uses @code{execute} or calls a procedure using 770 @code{execute}. 769 771 EXAMPLE: example esStratum; shows an example 770 772 " … … 847 849 "EXAMPLE:"; echo=2; 848 850 ring r = 11,(a,b,c,d,e,f,g,x,y),ds; 849 poly F = 850 xa+yb+x2+2xy+y2c+y^2+y3d+y4e+y5f+y6g+x^7; 851 poly F = (x2+2xy+y2+x5)+ax+by+cx2+dxy+ey2+fx3+gx4; 851 852 esStratum(F); 852 853 esStratum(F,2); 853 ideal I 854 ideal I = f-fa,e+b; 854 855 qring q = std(I); 855 856 poly F = imap(r,F); … … 1159 1160 1160 1161 proc isEquising (poly p_F, list #) 1161 "USAGE: isEquising(F[,m]); F a polynomial, m an integer1162 ASSUME: F defines a deformation of an irreducible bivariate polynomial f1163 and th at char(basering) does not divide mult(f).1162 "USAGE: isEquising(F[,m]); F poly, m int 1163 ASSUME: F defines a deformation of an irreducible bivariate polynomial f 1164 and the characteristic of the basering does not divide mult(f). @* 1164 1165 If nv is the number of variables of the basering, then the first nv-2 1165 ringvariables are the deformation parameters.1166 variables are the deformation parameters. @* 1166 1167 If the basering is a qring, ideal(basering) must only depend 1167 1168 on the deformation parameters. 1168 RETURN: A list l of two integers, where 1169 l[1] = 1 if F is an equisingular deformation,l[1] = 0 otherwise. 1170 l[2] = 1 if some error has occured, l[2] = 0 otherwise. 1171 If m is given, the computation stops after m steps of the iteration. 1172 NOTE: This proc uses 'execute' or calls a procedure using 'execute'. 1169 RETURN: list l of two integers, where 1170 @format 1171 l[1]=1 if F is an equisingular deformation, l[1]=0 otherwise. 1172 l[2]=1 if some error has occured, l[2]=0 otherwise. 1173 @end format 1174 NOTE: If m is given, the computation stops after m steps of the iteration. @* 1175 This procedure uses @code{execute} or calls a procedure using 1176 @code{execute}. 1173 1177 EXAMPLE: example isEquising; shows an example 1174 1178 " … … 1242 1246 { 1243 1247 "EXAMPLE:"; echo=2; 1244 ring r = 11,( T,x,y),ds;1245 poly F = (x +y)^2+y^3*T+x^7;1248 ring r = 11,(a,b,x,y),ds; 1249 poly F = (x2+2xy+y2+x5)+ay3+bx5; 1246 1250 isEquising(F); 1247 1251 isEquising(F,1); 1248 isEquising(F,2); 1249 ideal I = ideal(T); 1252 ideal I = ideal(a); 1250 1253 qring q = std(I); 1251 1254 poly F = imap(r,F); 1252 isEquising(F ,2);1255 isEquising(F); 1253 1256 } 1254 1257 /////////////////////////////////////////////////////////////////////////////// -
Singular/LIB/hnoether.lib
rd208704 r7b3971 3 3 // This library is for Singular 1-3-7 or newer 4 4 5 version="$Id: hnoether.lib,v 1.2 7 2001-01-16 13:48:30 SingularExp $";6 category="Singularities";5 version="$Id: hnoether.lib,v 1.28 2001-02-05 12:01:39 lossen Exp $"; 6 //category="Singularities"; 7 7 info=" 8 8 LIBRARY: hnoether.lib Hamburger-Noether (Puiseux) Development … … 10 10 11 11 OVERVIEW: 12 A library for computing the Hamburger-Noether resp. Puiseuxdevelopment13 of a plane curve singularity following A. Campillo: Algebroid curves14 in positive characteristic, Lecture Notes in Math. 813, Springer (1980).12 A library for computing the Hamburger-Noether, resp. Puiseux, development 13 of a plane curve singularity following [Campillo, A.: Algebroid curves 14 in positive characteristic, Springer LNM 813 (1980)]. @* 15 15 The library contains also procedures for computing the (topological) 16 16 numerical invariants of plane curve singularities. … … 50 50 proc further_hn_proc() 51 51 "USAGE: further_hn_proc(); 52 The library `hnoether.lib' contains some more procedures which are not 53 shown when typing @code{help hnoether.lib}. They may be useful for 54 interactive use (e.g. if you want to do the calculation of a HNE 55 \"by hand\" to see the intermediate results), and they can be enumerated by 56 calling further_hn_proc. Use @code{help <procedure>;} for detailed 57 information about each of them. 52 NOTE: The library @code{hnoether.lib} contains some more procedures which 53 are not shown when typing @code{help hnoether.lib;}. They may be useful 54 for interactive use (e.g. if you want to do the calculation of an HN 55 development \"by hand\" to see the intermediate results), and they 56 can be enumerated by calling @code{further_hn_proc()}. @* 57 Use @code{help <procedure>;} for detailed information about each of 58 them. 58 59 " 59 60 { 60 61 " 61 The following procedures are also part of the library`hnoether.lib':62 The following procedures are also part of `hnoether.lib': 62 63 63 64 newtonpoly(f); Newton polygon of polynom f 64 getnm(f); intersection pts. of Newton polygon with theaxes65 getnm(f); intersection pts. of Newton polygon with axes 65 66 T_Transform(f,Q,N); returns f(y,xy^Q)/y^NQ (f: poly, Q,N: int) 66 67 T1_Transform(f,d,M); returns f(x,y+d*x^M) (f: poly,d:number,M:int) … … 73 74 find_in_list(L,p); find int p in list L 74 75 get_last_divisor(M,N); last divisor in Euclid's algorithm 75 factorfirst(f,M,N); try to factor f in a trivial waywithout `factorize'76 factorfirst(f,M,N); try to factor f without `factorize' 76 77 factorlist(L); factorize a list L of polynomials 77 78 referencepoly(D); a polynomial f s.t. D is the Newton diagram of f"; … … 257 258 258 259 proc squarefree (poly f) 259 "USAGE: squarefree(f); f a bivariate polynomial 260 RETURN: a squarefree divisor of f. 261 Normally the return value is a greatest squarefree divisor, but there 262 is an exception: factors with a p-th root, p the ring characteristic, 263 are lost. 260 "USAGE: squarefree(f); f poly 261 ASSUME: f is a bivariate polynomial (in the first 2 ring variables). 262 RETURN: poly, a squarefree divisor of f. 263 NOTE: Usually, the return value is the greatest squarefree divisor, but 264 there is one exception: factors with a p-th root, p the 265 characteristic of the basering, are lost. 264 266 SEE ALSO: allsquarefree 265 267 EXAMPLE: example squarefree; shows some examples. … … 342 344 { "EXAMPLE:"; echo = 2; 343 345 ring exring=3,(x,y),dp; 344 squarefree(x3+y); 345 squarefree(x3); 346 squarefree(x2); 347 squarefree(xy+x); 348 squarefree((x+y)^3*(x-y)^2); // (x+y)^3 is lost 346 squarefree((x3+y)^2); 347 squarefree((x+y)^3*(x-y)^2); // Warning: (x+y)^3 is lost 349 348 squarefree((x+y)^4*(x-y)^2); // result is (x+y)*(x-y) 350 349 } … … 352 351 353 352 proc allsquarefree (poly f, poly l) 354 "USAGE : allsquarefree(f, l); poly f,l355 l is the squarefree divisor of f you get by @code{l=squarefree(f);} 356 RETURN: the squarefree divisor of f consisting of all irreducible factors of f357 NOTE : This proc uses factorize to get the missing factors of f not in l and358 therefore may be slow.353 "USAGE : allsquarefree(f,g); f,g poly 354 ASSUME: g is the output of @code{squarefree(f)}. 355 RETURN: the greatest squarefree divisor of f. 356 NOTE : This proc uses factorize to get the missing factors of f not in g and, 357 therefore, may be slow. 359 358 SEE ALSO: squarefree 360 359 EXAMPLE: example allsquarefree; shows an example … … 405 404 ring exring=7,(x,y),dp; 406 405 poly f=(x+y)^7*(x-y)^8; 407 poly l=squarefree(f);408 l; // x-y found because 7 does not divide 8409 allsquarefree(f, l);// all factors (x+y)*(x-y) found406 poly g=squarefree(f); 407 g; // factor x+y lost, since characteristic=7 408 allsquarefree(f,g); // all factors (x+y)*(x-y) found 410 409 } 411 410 /////////////////////////////////////////////////////////////////////////////// 412 411 413 412 proc is_irred (poly f) 414 "USAGE: is_irred(f); f a squarefree bivariate polynomial 415 RETURN: an integer: 416 @* is_irred(f) @math{= 1} if f is irreducible as a formal power series 417 over the algebraic closure of its coefficient field (f defines an 418 analytically irreducible curve at zero), 419 @* is_irred(f) @math{= 0} else. 420 NOTE: @math{f = 0} and units in the ring of formal power series are not 421 considered irreducible. 413 "USAGE: is_irred(f); f poly 414 ASSUME: f is a squarefree bivariate polynomial (in the first 2 ring 415 variables). 416 RETURN: int (0 or 1): @* 417 - @code{is_irred(f)=1} if f is irreducible as a formal power 418 series over the algebraic closure of its coefficient field (f 419 defines an analytically irreducible curve at zero), @* 420 - @code{is_irred(f)=0} otherwise. 421 NOTE: 0 and units in the ring of formal power series are considered to be 422 not irreducible. 422 423 KEYWORDS: irreducible power series 423 424 EXAMPLE: example is_irred; shows an example … … 465 466 466 467 proc develop 467 "USAGE: develop(f [,n]); f polynomial in two variables, n integer 468 RETURN: Hamburger-Noether development of f, in form of a list: 469 @* [1]: Hamburger-Noether matrix: 470 Each row contains the coefficients of the corresponding line of the 471 Hamburger-Noether expansion (HNE). The end of the line is marked in 472 the matrix as the first ring variable (usually x). 473 @* [2]: intvec indicating the length of lines of the HNE 474 @* [3]: int: 475 0 if the 1st ring variable was transversal (with respect to f), 476 @* 1 if the variables were changed at the beginning of the 477 computation, 478 -1 if an error has occurred. 479 @* [4]: the transformed polynomial of f to make it possible to extend the 480 Hamburger-Noether development a posteriori without having to do 481 all the previous calculation once again (0 if not needed) 482 @* [5]: int: 483 1 if the curve has exactly one branch (i.e. is irreducible), 484 @* 0 else (i.e. the curve has more than one HNE or f is not valid). 485 486 ASSUME: f irreducible as a power series (for reducible f use 487 @code{reddevelop}) 468 "USAGE: develop(f [,n]); f poly, n int 469 ASSUME: f is a bivariate polynomial (in the first 2 ring variables) and 470 irreducible as power series (for reducible f use @code{reddevelop}). 471 RETURN: list @code{L} with: 472 @texinfo 473 @table @asis 474 @item @code{L[1]}; matrix: 475 Each row contains the coefficients of the corresponding line of the 476 Hamburger-Noether expansion (HNE). The end of the line is marked in 477 the matrix by the first ring variable (usually x). 478 @item @code{L[2]}; intvec: 479 indicating the length of lines of the HNE 480 @item @code{L[3]}; int: 481 0 if the 1st ring variable was transversal (with respect to f), @* 482 1 if the variables were changed at the beginning of the 483 computation, @* 484 -1 if an error has occurred. 485 @item @code{L[4]}; poly: 486 the transformed polynomial of f to make it possible to extend the 487 Hamburger-Noether development a posteriori without having to do 488 all the previous calculation once again (0 if not needed) 489 @item @code{L[5]}; int: 490 1 if the curve has exactly one branch (i.e., is irreducible), @* 491 0 else (i.e., the curve has more than one HNE, or f is not valid). 492 @end table 493 @end texinfo 488 494 DISPLAY: The (non zero) elements of the HNE (if not called by another proc). 489 490 NOTE: If the optional parameter @math{n} is given, the HN-matrix will have 491 at least @math{n} columns. Otherwise the number of columns will be chosen 492 minimal s.t. the matrix contains all necessary information (i.e. all 493 lines of the HNE but the last (which is in general infinite) have place). 494 If @math{n} is negative, the algorithm is stopped as soon as possible, 495 i.e. the information computed is enough for `@code{invariants}', but the 496 HN-matrix may contain undetermined elements, which are marked with the 497 2nd variable (of the basering). 498 In any case, the optional parameter only affects the calculation of 499 the LAST line of the HNE; @code{develop}(f) gives already all necessary 500 information for the procedure `@code{invariants}'. A negative value of 501 @math{n} will result in a very poor parametrization, but it can make 502 `@code{develop}' faster; a positive value will improve the exactness of 503 the parametrization. 504 505 For time critical computations it is recommended to use 506 \"@code{ring ...,(x,y),ls}\" as basering - it increases the algorithm's 507 speed. 508 495 NOTE: The optional parameter @code{n} affects only the computation of 496 the LAST line of the HNE. If it is given, the HN-matrix @code{L[1]} 497 will have at least @code{n} columns. @* 498 Otherwise, the number of columns will be chosen minimal such that the 499 matrix contains all necessary information (i.e., all lines of the HNE 500 but the last (which is in general infinite) have place). @* 501 If @code{n} is negative, the algorithm is stopped as soon as the 502 computed information is sufficient for @code{invariants(L)}, but the 503 HN-matrix @code{L[1]} may still contain undetermined elements, which 504 are marked with the 2nd variable (of the basering). @* 505 For time critical computations it is recommended to use 506 @code{ring ...,(x,y),ls} as basering - it increases the algorithm's 507 speed. @* 508 If @code{printlevel>=0} comments are displayed (default is 509 @code{printlevel=0}). 509 510 SEE ALSO: reddevelop, extdevelop, displayHNE 510 511 EXAMPLES: example develop; shows an example … … 889 890 // therefore the HNE is: 890 891 // z(-1)= 3*z(0)^7 + z(0)^7*z(1), 891 // z(0) = z(1)*z(2), 892 // (note that there is 1 zero in the 2nd row before x) 893 // z(1) = z(2)^3*z(3), (there are 3 zeroes in the 3rd row) 892 // z(0) = z(1)*z(2), (there is 1 zero in the 2nd row before x) 893 // z(1) = z(2)^3*z(3), (there are 3 zeroes in the 3rd row) 894 894 // z(2) = z(3)*z(4), 895 895 // z(3) = -z(4)^2 + 0*z(4)^3 +...+ 0*z(4)^8 + ?*z(4)^9 + ... 896 // (the missing x in the matrix indicates that this line 897 // is not complete. It can only occur in the last line of the 898 // HNE, and normally does.) 896 // (the missing x in the last line indicates that it is not complete.) 899 897 hne[2]; 900 898 param(hne); 901 // returns the parametrization 902 // x(t)= -t^14+O(t^21), y(t)= -3t^98+O(t^105) 899 // parametrization: x(t)= -t^14+O(t^21), y(t)= -3t^98+O(t^105) 903 900 // (the term -t^109 in y may have a wrong coefficient) 904 901 displayHNE(hne); … … 910 907 911 908 proc param 912 "USAGE: param(l [,x]) takes the output of develop(f) 913 (list l (matrix m, intvec v, int s[,poly g,...])) 914 and gives a parametrization for f; the first variable of the active 915 ring is chosen as indefinite. If the ring contains more than 916 two variables, the 3rd variable is chosen (remember that develop takes 917 the first two variables and therefore the other vars should be unused). 918 @* x is an optional parameter of any type. 919 RETURN: If only the list l is given: 920 ideal of two polynomials: if the HNE was finite, f(param[1],param[2]) 921 will be zero. If not, the real parametrization will be 922 two power series; then param will return a truncation of these series. 923 924 If the optional parameter x is given: 925 list L with L[1]=param(l) (the ideal containing the parametrization) 926 and L[2]=intvec with two entries indicating the highest degree unto 927 which the coefficients of the monomials in L[1] are exact (a value of 928 -1 is for infinity, i.e. the corresponding polynomial is exact). 909 "USAGE: param(L [,x]); L list, x any type (optional) 910 ASSUME: L is the output of @code{develop(f)}, or of 911 @code{extdevelop(develop(f),n)}, or one entry of the output of 912 @code{reddevelop(f)}. 913 RETURN: a parametrization for f in the following format: @* 914 - if only the list L is given, the result is an ideal of two 915 polynomials p[1],p[2]: if the HNE was finite then f(p[1],p[2])=0}; 916 if not, the \"real\" parametrization will be two power series and 917 p[1],p[2] are truncations of these series.@* 918 - if the optional parameter x is given, the result is a list l: 919 l[1]=param(L) (ideal) and l[2]=intvec with two entries indicating 920 the highest degree up to which the coefficients of the monomials in 921 l[1] are exact (entry -1 means that the corresponding parametrization 922 is exact). 923 NOTE: If the basering has only 2 variables, the first variable is chosen 924 as indefinite. Otherwise, the 3rd variable is chosen. 929 925 SEE ALSO: develop, extdevelop 930 926 KEYWORDS: parametrization … … 1040 1036 poly f=x3+2xy2+y2; 1041 1037 list hne=develop(f); 1042 list hne_extended1=develop(f,6); 1043 list hne_extended2=develop(f,10); 1044 // compare the different matrices ... 1038 list hne_extended=extdevelop(hne,10); 1039 // compare the matrices ... 1045 1040 print(hne[1]); 1046 print(hne_extended1[1]); 1047 print(hne_extended2[1]); 1041 print(hne_extended[1]); 1048 1042 // ... and the resulting parametrizations: 1049 1043 param(hne); 1050 param(hne_extended1); 1051 param(hne_extended2); 1052 param(hne_extended2,0); 1044 param(hne_extended); 1045 param(hne_extended,0); 1053 1046 } 1054 1047 /////////////////////////////////////////////////////////////////////////////// 1055 1048 1056 1049 proc invariants 1057 "USAGE: invariants(l) takes the output of develop(f) 1058 (list l (matrix m, intvec v, int s[,poly g,...])) 1059 and computes the following irreducible curve invariants: 1060 RETURN: a list, if l contains a valid HNE: 1061 @format 1062 - invariants(l)[1]: intvec (characteristic exponents) 1063 - invariants(l)[2]: intvec (generators of the semigroup) 1064 - invariants(l)[3],[4]: 2 x intvec (Puiseux pairs, 1st and 2nd components) 1065 - invariants(l)[5]: int (degree of the conductor) 1066 - invariants(l)[6]: intvec (sequence of multiplicities) 1067 @end format 1068 an empty list, if an error occurred in the procedure develop. 1050 "USAGE: invariants(L); L list 1051 ASSUME: L is the output of @code{develop(f)}, or of 1052 @code{extdevelop(develop(f),n)}, or one entry of the output of 1053 @code{reddevelop(f)}. 1054 RETURN: list, if L contains a valid HNE: 1055 @format 1056 invariants(L)[1]: intvec (characteristic exponents) 1057 invariants(L)[2]: intvec (generators of the semigroup) 1058 invariants(L)[3]: intvec (Puiseux pairs, 1st components) 1059 invariants(L)[4]: intvec (Puiseux pairs, 2nd components) 1060 invariants(L)[5]: int (degree of the conductor) 1061 invariants(L)[6]: intvec (sequence of multiplicities) 1062 @end format 1063 an empty list, if L contains no valid HNE. 1069 1064 SEE ALSO: develop, displayInvariants, multsequence, intersection 1070 1065 KEYWORDS: characteristic exponents; semigroup of values; Puiseux pairs; … … 1157 1152 1158 1153 proc displayInvariants 1159 "USAGE: displayInvariants(l); takes the output both of1160 develop(f) and reddevelop(f) 1161 ( list l (matrix m, intvec v, int s[,poly g,...])1162 or list of lists in the form l )1163 RETURN: no thing1154 "USAGE: displayInvariants(L); L list 1155 ASSUME: L is the output of @code{develop(f)}, or of 1156 @code{extdevelop(develop(f),n)}, or (one entry of) the output of 1157 @code{reddevelop(f)}. 1158 RETURN: none 1164 1159 DISPLAY: invariants of the corresponding branch, resp. of all branches, 1165 1160 in a better readable form. … … 1244 1239 1245 1240 proc multiplicities 1246 "USAGE: multiplicities(l) takes the output of develop(f) 1247 (list l (matrix m, intvec v, int s[,poly g,...])) 1248 RETURN: intvec of the different multiplicities that occur during the 1249 successive blowing up of the curve corresponding to f 1241 "USAGE: multiplicities(L); L list 1242 ASSUME: L is the output of @code{develop(f)}, or of 1243 @code{extdevelop(develop(f),n)}, or one entry of the output of 1244 @code{reddevelop(f)}. 1245 RETURN: intvec of the different multiplicities that occur when successively 1246 blowing-up the curve singularity corresponding to f. 1250 1247 SEE ALSO: develop 1251 1248 EXAMPLE: example multiplicities; shows an example … … 1287 1284 1288 1285 proc puiseux2generators (intvec m, intvec n) 1289 "USAGE: puiseux2generators(m,n); 1290 m,n intvecs with 1st resp. 2nd components of Puiseux pairs 1291 RETURN: intvec of the generators of the semigroup of values 1286 "USAGE: puiseux2generators(m,n); m,n intvec 1287 ASSUME: m, resp. n, represent the 1st, resp. 2nd, components of Puiseux pairs 1288 (e.g., @code{m=invariants(L)[3]}, @code{n=invariants(L)[4]}). 1289 RETURN: intvec of the generators of the semigroup of values. 1292 1290 SEE ALSO: invariants 1293 1291 EXAMPLE: example puiseux2generators; shows an example … … 1316 1314 1317 1315 proc intersection (list hn1, list hn2) 1318 "USAGE: intersection(hne1,hne2); 1319 hne1,hne2: two lists representing a HNE (normally two entries out of 1320 the output of reddevelop), i.e. list(matrix,intvec,int[,poly]). 1321 RETURN: The intersection multiplicity of the branches corresponding to 1322 hne1 & hne2 (of type int). 1316 "USAGE: intersection(hne1,hne2); hne1, hne2 lists 1317 ASSUME: hne1, hne2 represent a HNE (i.e., are the output of 1318 @code{develop(f)}, or of @code{extdevelop(develop(f),n)}, or 1319 one entry of the output of @code{reddevelop(f)}). 1320 RETURN: int, the intersection multiplicity of the branches corresponding to 1321 hne1 and hne2. 1323 1322 SEE ALSO: reddevelop, displayInvariants 1324 1323 KEYWORDS: intersection multiplicity … … 1421 1420 // ------ the example starts here ------- 1422 1421 "EXAMPLE:"; echo = 2; 1422 int plevel=printlevel; printlevel=-1; 1423 1423 ring r=0,(x,y),dp; 1424 1424 list hne=reddevelop((x2-y3)*(x2+y3)); 1425 1425 intersection(hne[1],hne[2]); 1426 kill HNEring,r; 1427 echo = 0;1426 kill HNEring,r; 1427 printlevel=plevel; echo = 0; 1428 1428 // --- restore HNEring if previously defined --- 1429 1429 if (defined(rettering)) { … … 1436 1436 1437 1437 proc multsequence 1438 "USAGE: multsequence(l); 1439 l is the output of either develop(f) or reddevelop(f) 1440 RETURN: - if l=@code{develop}(f) or l=@code{reddevelop}(f)[i]: 1441 intvec of the sequence of multiplicities of the curve 1442 resp. of the i-th branch (the same as @code{invariants}(l)[6]; ) 1443 1444 - if l=@code{reddevelop}(f) : list of two integer matrices: 1445 @* @code{multsequence}(l)[1][i,*] contains the multiplicities of the branches 1446 at their infinitely near point of 0 in its (i-1) order 1447 neighbourhood (i.e. i=1: multiplicity of the branches themselves, 1448 i=2: multiplicity of their 1st quadratic transformed etc., 1449 @* or to say it in another way: @code{multsequence}(l)[1][*,j] is the 1450 sequence of multiplicities of the j-th branch). 1451 @* @code{multsequence}(l)[2][i,*] contains the information which of these 1452 infinitely near points coincide. 1453 NOTE: The order of elements of the list obtained from @code{reddevelop} must 1454 not be changed (because then the coincident infinitely near points 1438 "USAGE: multsequence(L); L list 1439 ASSUME: L is the output of @code{develop(f)}, or of 1440 @code{extdevelop(develop(f),n)}, or one entry of the output of 1441 @code{reddevelop(f)}. 1442 RETURN: intvec corresponding to the multiplicity sequence of (a branch) 1443 of the curve (the same as @code{invariants(L)[6]}). 1444 ASSUME: L is the output of @code{reddevelop(f)}. 1445 RETURN: list of two integer matrices: 1446 @texinfo 1447 @table @asis 1448 @item @code{multsequence(L)[1][i,*]} 1449 contains the multiplicities of the branches at their infinitely near point 1450 of 0 in its (i-1) order neighbourhood (i.e., i=1: multiplicity of the 1451 branches themselves, i=2: multiplicity of their 1st quadratic transformed, 1452 etc., @* 1453 Hence, @code{multsequence(L)[1][*,j]} is the multiplicity sequence 1454 of branch j. 1455 @item @code{multsequence(L)[2][i,*]}: 1456 contains the information which of these infinitely near points coincide. 1457 @end table 1458 @end texinfo 1459 NOTE: The order of elements of the list obtained from @code{reddevelop(f)} 1460 must not be changed (because then the coincident infinitely near points 1455 1461 couldn't be grouped together, cf. meaning of 2nd intmat in example). 1456 Hence it is not wise to compute the HNE of several polynomials 1457 separately, put them into a list l and call @code{multsequence}(l). 1458 1462 Hence, it is not wise to compute the HNE of several polynomials 1463 separately, put them into a list L and call @code{multsequence(L)}. @* 1459 1464 Use @code{displayMultsequence} to produce a better readable output for 1460 1465 reducible curves on the screen. … … 1537 1542 } 1538 1543 // ------ the example starts here ------- 1539 "EXAMPLE:"; echo = 2; 1544 "EXAMPLE:"; echo = 2; 1545 int plevel=printlevel; printlevel=-1; 1540 1546 ring r=0,(x,y),dp; 1541 list hne=reddevelop((x6-y10)*(x+y2-y3)*(x+y2+y3)); 1542 1547 list hne=reddevelop((x6-y10)*(x+y2-y3)*(x+y2+y3)); // 4 branches 1543 1548 multsequence(hne[1])," | ",multsequence(hne[2])," | ", 1544 1549 multsequence(hne[3])," | ",multsequence(hne[4]); … … 1547 1552 displayMultsequence(hne); 1548 1553 kill HNEring,r; 1554 printlevel=plevel; 1549 1555 echo = 0; 1550 1556 // --- restore HNEring if previously defined --- … … 1558 1564 1559 1565 proc displayMultsequence 1560 "USAGE: displayMultsequence(l); 1561 l is the output of either develop(f) or reddevelop(f) 1566 "USAGE: displayMultsequence(L); 1567 ASSUME: L is the output of @code{develop(f)}, or of 1568 @code{extdevelop(develop(f),n)}, or (one entry of) the output of 1569 @code{reddevelop(f)}. 1562 1570 RETURN: nothing 1563 1571 DISPLAY: the sequence of multiplicities: 1564 if l=develop(f) or l=reddevelop(f)[i] : just the sequence a,b,c,...,1 1565 @* if l=reddevelop(f) : a sequence of the following form: 1566 1567 @* @math{[(a_1,....,b_1,....,c_1)]}, 1568 @* @math{[(a_2,...),...,(...,c_2)]}, 1569 @* @math{ ...................} 1570 @* @math{[(a_n),(b_n),.....,(c_n)]} 1571 1572 @* with @math{a_1,...,a_n} the sequence of multiplicities of the 1st branch 1573 @* [...] the multiplicities of the j-th transformed of all branches 1574 @* (...) the multiplicities of those branches meeting in the same 1575 infinitely near point. 1576 NOTE: The same restrictions for l as in `@code{multsequence}' apply. 1572 @format 1573 - if @code{L=develop(f)} or @code{L=reddevelop(f)[i]}: 1574 @code{a , b , c , ....... , 1} 1575 - if @code{L=reddevelop(f)}: 1576 @code{[(a_1, .... , b_1 , .... , c_1)],} 1577 @code{[(a_2, ... ), ... , (... , c_2)],} 1578 @code{ ........................................ ,} 1579 @code{[(a_n),(b_n), ....., (c_n)]} 1580 with: 1581 @code{a_1 , ... , a_n} the sequence of multiplicities of the 1st branch, 1582 @code{[...]} the multiplicities of the j-th transformed of all branches, 1583 @code{(...)} indicating branches meeting in an infinitely near point. 1584 @end format 1585 NOTE: The same restrictions for L as in @code{multsequence} apply. 1577 1586 SEE ALSO: multsequence, develop, reddevelop, separateHNE 1578 1587 EXAMPLE: example displayMultsequence; shows an example … … 1622 1631 // ------ the example starts here ------- 1623 1632 "EXAMPLE:"; echo = 2; 1633 int plevel=printlevel; printlevel=-1; 1624 1634 ring r=0,(x,y),dp; 1625 1635 list hne=reddevelop((x6-y10)*(x+y2-y3)*(x+y2+y3)); 1626 1627 1636 displayMultsequence(hne[1]); 1628 1637 displayMultsequence(hne); 1629 1638 kill HNEring,r; 1639 printlevel=plevel; 1630 1640 echo = 0; 1631 1641 // --- restore HNEring if previously defined --- … … 1639 1649 1640 1650 proc separateHNE (list hn1,list hn2) 1641 "USAGE: separateHNE(hne1,hne2); list hne1,hne2: output of develop 1642 RETURN: number of quadratic transformations needed to separate both curves 1651 "USAGE: separateHNE(hne1,hne2); hne1, hne2 lists 1652 ASSUME: hne1, hne2 are HNEs (=output of 1653 @code{develop(f)}, @code{extdevelop(develop(f),n)}, or 1654 one entry of the output of @code{reddevelop(f)}). 1655 RETURN: number of quadratic transformations needed to separate both curves 1656 (branches). 1643 1657 SEE ALSO: develop, reddevelop, multsequence, displayMultsequence 1644 1658 EXAMPLE: example separateHNE; shows an example … … 1736 1750 1737 1751 proc displayHNE(list ldev,list #) 1738 "USAGE: displayHNE(ldev,[,n]); ldev=list (the output of develop(f) or 1739 reddevelop(f)), n=int 1752 "USAGE: displayHNE(L[,n]); L list, n int 1753 ASSUME: L has the format of the output of @code{develop(f)}, resp. of 1754 @code{reddevelop(f)}. 1740 1755 RETURN: - if only one argument is given, no return value, but 1741 1756 display an ideal HNE of the following form: … … 1747 1762 HNE[r+1]= []*z(r)^2+[]*z(r)^3+...... 1748 1763 @end example 1749 where x,y are the indeterminates of the basering. The values of @code{[]}1750 are the coefficients of the Hamburger-Noether matrix, the values of1751 @code{<>} are represented in the HN-matrix as `x'.1752 @* The 1st line (@code{HNE[1]}) means that1753 @math{y=}@code{[]}@math{*z(0)^1+...},1754 the 2nd line (@code{HNE[2]}) means that1755 @math{x=}@code{[]}@math{*z(1)^2+...},1756 so you can see which indeterminate corresponds to which line1757 (it's also possible that x corresponds to the 1st line and y to the 2nd).1758 @* - if a second argument is given, create and export a new ring with1759 name `displayring' containing an ideal `HNE' as described above. 1760 1761 If ldev contains the output of @code{reddevelop}(f), @code{displayHNE}1762 shows the HNE's of all branches of f in the form described above.1763 The optional parameter is then ignored.1764 1764 where @code{x},@code{y} are the first 2 variables of the basering. 1765 The values of @code{[]} are the coefficients of the Hamburger-Noether 1766 matrix, the values of @code{<>} are represented by @code{x} in the 1767 HN-matrix.@* 1768 - if a second argument is given, create and export a new ring with 1769 name @code{displayring} containing an ideal @code{HNE} as described 1770 above.@* 1771 - if L corresponds to the output of @code{reddevelop(f)}, 1772 @code{displayHNE(L[,n])} shows the HNE's of all branches of f in the form 1773 described above. The optional parameter is then ignored. 1774 NOTE: The 1st line of the above ideal (i.e., @code{HNE[1]}) means that 1775 @code{y=[]*z(0)^1+...}, the 2nd line (@code{HNE[2]}) means that 1776 @code{x=[]*z(1)^2+...}, so you can see which indeterminate 1777 corresponds to which line (it's also possible that @code{x} corresponds 1778 to the 1st line and @code{y} to the 2nd). 1779 1765 1780 SEE ALSO: develop, reddevelop 1766 1781 EXAMPLE: example displayHNE; shows an example … … 1999 2014 2000 2015 proc extdevelop (list l, int Exaktheit) 2001 "USAGE: extdevelop(l,n); 2002 list l (matrix m, intvec v, int s, poly g[,int b]), int n 2003 @* takes the output l of develop(f) ( or extdevelop(L,N), 2004 or one entry of the output of reddevelop(f)) and 2005 RETURN: an extension of the Hamburger-Noether development of f in the same 2006 form as l (i.e. list(matrix, intvec, int, poly) ). 2007 The new HN-matrix will have at least n columns 2008 (if the HNE isn't finite). 2009 Thus if f is irreducible, @code{extdevelop}(@code{develop}(f),n); 2010 (in most cases) will produce the same result as @code{develop}(f,n). 2011 Type `help develop;' for more details. 2012 NOTE: If the matrix m of l has N columns, the exactness of 2013 @code{param}(@code{extdevelop}(l,n)) will be increased by at least 2014 (n-N) more significant monomials compared with @code{param}(l). 2016 "USAGE: extdevelop(L,N); list L, int N 2017 ASSUME: L is the output of @code{develop(f)}, or of @code{extdevelop(l,n)}, 2018 or one entry of the output of @code{reddevelop(f)}. 2019 RETURN: an extension of the Hamburger-Noether development of f as a list 2020 in the same format as L has (up to the last entry in the output 2021 of @code{develop(f)}).@* 2022 Type @code{help develop;}, resp. @code{help reddevelop;} for more 2023 details. 2024 NOTE: The new HN-matrix will have at least N columns (if the HNE is not 2025 finite). In particular, if f is irreducible then (in most cases) 2026 @code{extdevelop(develop(f),N)} will produce the same result as 2027 @code{develop(f,N)}.@* 2028 If the matrix M of L has n columns then, compared with 2029 @code{param(L)}, @code{param(extdevelop(L,N))} will increase the 2030 exactness by at least (N-n) more significant monomials. 2015 2031 SEE ALSO: develop, reddevelop, param 2016 2032 EXAMPLE: example extdevelop; shows an example … … 2145 2161 } 2146 2162 // ------ the example starts here ------- 2147 "EXAMPLE:"; echo = 2; 2163 "EXAMPLE:"; echo = 2; 2148 2164 ring exring=0,(x,y),dp; 2149 2165 list hne=reddevelop(x14-3y2x11-y3x10-y2x9+3y4x8+y5x7+3y4x6+x5*(-y6+y5) 2150 2166 -3y6x3-y7x2+y8); 2151 print(hne[1][1]); // finite HNE2167 print(hne[1][1]); // HNE of 1st branch is finite 2152 2168 print(extdevelop(hne[1],5)[1]); 2153 // ------------------------------------------ 2154 print(hne[2][1]); // HNE that can be extended 2169 print(hne[2][1]); // HNE of 2nd branch can be extended 2155 2170 list ehne=extdevelop(hne[2],5); 2156 print(ehne[1]); // new HN-matrix has 5 columns2171 print(ehne[1]); // new HN-matrix has 5 columns 2157 2172 param(hne[2]); 2158 2173 param(ehne); … … 2169 2184 2170 2185 proc stripHNE (list l) 2171 "USAGE: stripHNE(l); takes the output both of develop(f) and reddevelop(f) 2172 @* ( list l (matrix m, intvec v, int s[,poly g,...]) 2173 or list of lists in the form l ) 2174 RETURN: a list in the same format as l, but all polynomials g are set to zero 2186 "USAGE: stripHNE(L); L list 2187 ASSUME: L is the output of @code{develop(f)}, or of 2188 @code{extdevelop(develop(f),n)}, or (one entry of) the output of 2189 @code{reddevelop(f)}. 2190 RETURN: list in the same format as L, but all polynomials L[4], resp. 2191 L[i][4], are set to zero. 2175 2192 NOTE: The purpose of this procedure is to remove huge amounts of data 2176 2193 no longer needed. It is useful, if one or more of the polynomials 2177 in l consumesmuch memory. It is still possible to compute invariants,2194 in L consume much memory. It is still possible to compute invariants, 2178 2195 parametrizations etc. with the stripped HNE(s), but it is not possible 2179 to use extdevelopwith them.2196 to use @code{extdevelop} with them. 2180 2197 SEE ALSO: develop, reddevelop, extdevelop 2181 2198 EXAMPLE: example stripHNE; shows an example … … 2194 2211 } 2195 2212 example 2196 { "EXAMPLE:"; echo = 2; 2213 { 2214 "EXAMPLE:"; echo = 2; 2215 int plevel=printlevel; printlevel=-1; 2197 2216 ring r=0,(x,y),dp; 2198 2217 list hne=develop(x2+y3+y4); 2199 2218 hne; 2200 2219 stripHNE(hne); 2220 printlevel=plevel; echo = 0; 2201 2221 } 2202 2222 /////////////////////////////////////////////////////////////////////////////// … … 2288 2308 proc HNdevelop (poly f) 2289 2309 "USAGE: HNdevelop(f); f poly 2290 RETURN: Hamburger-Noether development of f: 2291 A list of lists in the form of develop(f) 2292 (matrix,intvec,int,poly -- the last int indicating irreducibility is 2293 omitted); each entry contains the data for one of the branches of f. 2294 For more details type `help develop;' 2295 CREATE: a ring with name `HNEring', variables `x,y' and ordering `ls' over 2296 a field extension of the current basering's ground field. 2297 As the Hamburger-Noether development normally does not exist 2310 ASSUME: f is a bivariate polynomial (in the first 2 ring variables) 2311 CREATE: ring with name @code{HNEring}, variables @code{x,y} and ordering 2312 @code{ls} over a field extension of the current basering's ground 2313 field. @* 2314 Since the Hamburger-Noether development usually does not exist 2298 2315 in the originally given basering, @code{HNdevelop} always defines 2299 HNEring and changes to it. The field extension is chosen minimal. 2316 @code{HNEring} and CHANGES to it. The field extension is chosen 2317 minimally. 2318 RETURN: list @code{L} of lists @code{L[i]} (corresponding to the output of 2319 @code{develop(f[i])}, f[i] a branch of f, but the last entry being 2320 omitted). 2321 @texinfo 2322 @table @asis 2323 @item @code{L[i][1]}; matrix: 2324 Each row contains the coefficients of the corresponding line of the 2325 Hamburger-Noether expansion (HNE) for f[i]. The end of the line is 2326 marked in the matrix by the first ring variable (usually x). 2327 @item @code{L[i][2]}; intvec: 2328 indicating the length of lines of the HNE 2329 @item @code{L[i][3]}; int: 2330 0 if the 1st ring variable was transversal (with respect to f[i]), @* 2331 1 if the variables were changed at the beginning of the 2332 computation, @* 2333 -1 if an error has occurred. 2334 @item @code{L[i][4]}; poly: 2335 the transformed polynomial of f[i] to make it possible to extend the 2336 Hamburger-Noether development a posteriori without having to do 2337 all the previous calculation once again (0 if not needed) 2338 @end table 2339 @end texinfo 2300 2340 NOTE: @code{HNdevelop} decides which procedure (@code{develop} or 2301 @code{reddevelop}) applies best to the given problem and calls it. 2302 SEE ALSO: develop, reddevelop, extdevelop 2341 @code{reddevelop}) applies best to the given problem and calls it. @* 2342 If f is known to be irreducible as a power series, @code{develop(f)} 2343 should be chosen instead to avoid the change of basering. @* 2344 If @code{printlevel>=0} comments are displayed (default is 2345 @code{printlevel=0}). 2346 SEE ALSO: develop, reddevelop, extdevelop, essdevelop, param, displayHNE 2303 2347 EXAMPLE: example HNdevelop; shows an example 2304 2348 " … … 2367 2411 list hne=HNdevelop(x4-y6); 2368 2412 nameof(basering); 2369 size(hne); // i.e. x4-y6 has twobranches2413 size(hne); // number of branches 2370 2414 print(hne[1][1]); // HN-matrix of 1st branch 2371 param(hne[1]); 2372 param(hne[2]); 2373 displayInvariants(hne); 2415 param(hne[1]); // parametrization of 1st branch 2416 param(hne[2]); // parametrization of 2nd branch 2374 2417 kill HNEring,r; 2375 2418 echo = 0; … … 2385 2428 proc reddevelop (poly f) 2386 2429 "USAGE: reddevelop(f); f poly 2387 RETURN: Hamburger-Noether development of f: 2388 A list of lists in the form of develop(f) 2389 (matrix,intvec,int,poly -- the last int indicating irreducibility is 2390 omitted); each entry contains the data for one of the branches of f. 2391 For more details type `help develop;' 2392 CREATE: a ring with name `HNEring', variables `x,y' and ordering `ls' over 2393 a field extension of the current basering's ground field. 2394 As the Hamburger-Noether development of a reducible curve normally 2395 does not exist in the given basering, @code{reddevelop} always defines 2396 HNEring and changes to it. The field extension is chosen minimal. 2397 SEE ALSO: develop, extdevelop, displayHNE 2430 ASSUME: f is a bivariate polynomial (in the first 2 ring variables) 2431 CREATE: ring with name @code{HNEring}, variables @code{x,y} and ordering 2432 @code{ls} over a field extension of the current basering's ground 2433 field. @* 2434 Since the Hamburger-Noether development of a reducible curve 2435 singularity usually does not exist in the originally given basering, 2436 @code{reddevelop} always defines @code{HNEring} and CHANGES to it. 2437 The field extension is chosen minimally. 2438 RETURN: list @code{L} of lists @code{L[i]} (corresponding to the output of 2439 @code{develop(f[i])}, f[i] a branch of f, but the last entry being 2440 omitted). 2441 @texinfo 2442 @table @asis 2443 @item @code{L[i][1]}; matrix: 2444 Each row contains the coefficients of the corresponding line of the 2445 Hamburger-Noether expansion (HNE) for f[i]. The end of the line is 2446 marked in the matrix by the first ring variable (usually x). 2447 @item @code{L[i][2]}; intvec: 2448 indicating the length of lines of the HNE 2449 @item @code{L[i][3]}; int: 2450 0 if the 1st ring variable was transversal (with respect to f[i]), @* 2451 1 if the variables were changed at the beginning of the 2452 computation, @* 2453 -1 if an error has occurred. 2454 @item @code{L[i][4]}; poly: 2455 the transformed polynomial of f[i] to make it possible to extend the 2456 Hamburger-Noether development a posteriori without having to do 2457 all the previous calculation once again (0 if not needed) 2458 @end table 2459 @end texinfo 2460 NOTE: If @code{printlevel>=0} comments are displayed (default is 2461 @code{printlevel=0}). 2462 SEE ALSO: develop, extdevelop, essdevelop, param, displayHNE 2398 2463 EXAMPLE: example reddevelop; shows an example 2399 2464 " … … 2418 2483 // ------ the example starts here ------- 2419 2484 "EXAMPLE:"; echo = 2; 2420 ring r=0,(x,y),dp;2421 list hne=reddevelop(x4-y6);2422 size(hne); // i.e. x4-y6 has two branches2423 print(hne[1][1]); // HN-matrix of 1st branch2424 param(hne[1]);2425 param(hne[2]);2426 displayInvariants(hne);2427 kill HNEring,r;2428 // ----------------- a more interesting example: --------------------2429 2485 ring r = 32003,(x,y),dp; 2430 2486 poly f = x25+x24-4x23-1x22y+4x22+8x21y-2x21-12x20y-4x19y2+4x20+10x19y … … 2433 2489 +126x10y4+4x8y6-126x8y5+84x6y6-36x4y7+9x2y8-1y9; 2434 2490 list hne=reddevelop(f); 2435 size(hne); 2436 print(hne[1][1]); 2437 print(hne[4][1]); 2491 size(hne); // number of branches 2492 print(hne[1][1]); // HN-matrix of 1st branch 2493 print(hne[4][1]); // HN-matrix of 4th branch 2438 2494 // a ring change was necessary, a is a parameter 2439 2495 HNEring; … … 2769 2825 proc essdevelop (poly f) 2770 2826 "USAGE: essdevelop(f); f poly 2771 RETURN: Hamburger-Noether development of essential branches of f: 2772 A list of lists in the form of develop(f) 2773 (matrix,intvec,int,poly -- the last int indicating irreducibility is 2774 omitted); each entry contains the data for one of the branches of f. 2775 For more details type `help develop;' 2776 CREATE: a ring with name `HNEring', variables `x,y' and ordering `ls' over 2777 a field extension of the current basering's ground field. 2778 As the Hamburger-Noether development of a reducible curve normally 2779 does not exist in the given basering, @code{essdevelop} always defines 2780 HNEring and changes to it. The field extension is chosen minimal. 2827 ASSUME: f is a bivariate polynomial (in the first 2 ring variables) 2828 CREATE: ring with name @code{HNEring}, variables @code{x,y} and ordering 2829 @code{ls} over a field extension of the current basering's ground 2830 field. @* 2831 Since the Hamburger-Noether development of a reducible curve 2832 singularity usually does not exist in the originally given basering, 2833 @code{essdevelop} always defines @code{HNEring} and CHANGES to it. 2834 The field extension is chosen minimally. 2835 RETURN: list @code{L} of lists @code{L[i]} (corresponding to the output of 2836 @code{develop(f[i])}, f[i] an \"essential\" branch of f, but the last 2837 entry being omitted).@* 2838 For more details type @code{help reddevelop;}. 2781 2839 NOTE: If the HNE needs a field extension, some of the branches will be 2782 2840 conjugate. In this case @code{essdevelop} reduces the computation to 2783 one representative for each group of conjugate branches. 2841 one representative for each group of conjugate branches.@* 2784 2842 Note that the degree of each branch is in general less than the degree 2785 of the field extension in which all HNEs can be put. 2786 2843 of the field extension in which all HNEs can be put.@* 2787 2844 Use @code{reddevelop} or @code{HNdevelop} to compute a complete HNE, 2788 i.e. a HNE for all branches. 2845 i.e., a HNE for all branches.@* 2846 If @code{printlevel>=0} comments are displayed (default is 2847 @code{printlevel=0}). 2789 2848 SEE ALSO: develop, reddevelop, HNdevelop, extdevelop 2790 2849 EXAMPLE: example essdevelop; shows an example … … 2817 2876 // --------- compute all branches: --------- 2818 2877 list hne=reddevelop(f); 2819 displayHNE(hne); 2878 displayHNE(hne[1]); // HN-matrix of 1st branch 2879 displayHNE(hne[4]); // HN-matrix of 4th branch 2820 2880 setring r; 2881 kill HNEring; 2821 2882 // --- compute only one of conjugate branches: --- 2822 2883 list hne=essdevelop(f); 2823 2884 displayHNE(hne); 2824 // nr. 1 of essdevelop represents nr. 1 - 3 of reddevelop and 2825 // nr. 2 of essdevelop represents nr. 4 + 5 of reddevelop 2885 // no. 1 of essdevelop represents no. 1 - 3 of reddevelop and 2886 // no. 2 of essdevelop represents no. 4 + 5 of reddevelop 2887 kill HNEring,r; 2826 2888 echo = 0; 2827 2889 // --- restore HNEring if previously defined --- -
Singular/LIB/primdec.lib
rd208704 r7b3971 1 1 /////////////////////////////////////////////////////////////////////////////// 2 version="$Id: primdec.lib,v 1.9 4 2001-01-16 13:48:38 SingularExp $";2 version="$Id: primdec.lib,v 1.95 2001-02-05 12:01:38 lossen Exp $"; 3 3 category="Commutative Algebra"; 4 4 info=" … … 10 10 OVERVIEW: 11 11 Algorithms for primary decomposition based on the ideas of 12 Gianni, Trager,Zacharias was written by Gerhard Pfister.13 Algorithms for primary decomposition based on the ideas of14 Shimoyama/Yokoyama was written by Wolfram Decker and Hans Schoenemann.15 @* The se procedures are implemented to be used in characteristic 016 12 Gianni, Trager and Zacharias (implementation by Gerhard Pfister), 13 respectively based on the ideas of Shimoyama and Yokoyama (implementation 14 by Wolfram Decker and Hans Schoenemann). 15 @* The procedures are implemented to be used in characteristic 0. 16 @* They also work in positive characteristic >> 0. 17 17 @* In small characteristic and for algebraic extensions, primdecGTZ and 18 minAssGTZ may not terminate andprimdecSY and minAssChar may not give18 minAssGTZ may not terminate, while primdecSY and minAssChar may not give 19 19 a complete decomposition. 20 20 Algorithms for the computation of the radical based on the ideas of 21 Krick /Logar and Kemper was written by Gerhard Pfister.21 Krick, Logar and Kemper (implementation by Gerhard Pfister). 22 22 23 23 PROCEDURES: … … 815 815 If ser!=(0) and ser is contained in j or if j is not zero-dimen- 816 816 sional then ideal(1),ideal(1) is returned 817 NOTE: Algorithm of Gianni , Traeger,Zacharias817 NOTE: Algorithm of Gianni/Trager/Zacharias 818 818 EXAMPLE: example zero_decomp; shows an example 819 819 " … … 1752 1752 proc equidim(ideal i,list #) 1753 1753 "USAGE: equidim(i) or equidim(i,1) ; i ideal 1754 equidim(i,1) uses the algorithm of Eisenbud, Hunecke and Vasconcelos 1755 RETURN: list of equidimensional ideals a_1,...,a_s such that the following 1756 holds: 1757 @* a_s is the equidimensional locus of i, a1,...a_s-1 are the lower 1758 dimensional equidimensional loci with (perhaps) modified embedded 1759 components. I.e. an embedded component q (primary ideal) of i can be 1760 replaced in the decomposition by a primary ideal q1 with the same 1761 radical as q. 1754 RETURN: list of equidimensional ideals a[1],...,a[s] with: 1755 - a[s] the equidimensional locus of i, 1756 - a[1],...,a[s-1] the lower dimensional equidimensional loci. 1757 NOTE: An embedded component q (primary ideal) of i can be replaced in the 1758 decomposition by a primary ideal q1 with the same radical as q. @* 1759 @code{equidim(i,1)} uses the algorithm of Eisenbud/Huneke/Vasconcelos. 1760 1762 1761 EXAMPLE:example equidim; shows an example 1763 1762 " … … 1858 1857 { "EXAMPLE:"; echo = 2; 1859 1858 ring r = 32003,(x,y,z),dp; 1860 ideal i =intersect(ideal(z),ideal(x,y),ideal(x2,z2),ideal(x5,y5,z5));1859 ideal i = intersect(ideal(z),ideal(x,y),ideal(x2,z2),ideal(x5,y5,z5)); 1861 1860 equidim(i); 1862 1861 } … … 1975 1974 { "EXAMPLE:"; echo = 2; 1976 1975 ring r = 32003,(x,y,z),dp; 1977 ideal i =intersect(ideal(z),ideal(x,y),ideal(x2,z2),ideal(x5,y5,z5));1976 ideal i = intersect(ideal(z),ideal(x,y),ideal(x2,z2),ideal(x5,y5,z5)); 1978 1977 equidimMax(i); 1979 1978 } … … 1986 1985 (at even positions in the list) 1987 1986 (resp. a list of the minimal associated primes) 1988 NOTE: Algorithm of Gianni , Traeger,Zacharias1987 NOTE: Algorithm of Gianni/Trager/Zacharias 1989 1988 EXAMPLE: example decomp; shows an example 1990 1989 " … … 3150 3149 "USAGE: radicalEHV(i); i ideal. 3151 3150 RETURN: ideal, the radical of i. 3152 NOTE: The algorithm of Eisenbud ,Huneke,Vasconcelos is used.3151 NOTE: The algorithm of Eisenbud/Huneke/Vasconcelos is used. 3153 3152 Works only in characteristic 0 or p large. 3154 3153 EXAMPLE: example radicalEHV; shows an example … … 4381 4380 "USAGE: primdecGTZ(i); i ideal 4382 4381 RETURN: a list pr of primary ideals and their associated primes: 4383 @* - pr[i][1] the i-th primary component, 4384 @* - pr[i][2] the i-th prime component. 4385 NOTE: Algorithm of Gianni, Traeger, Zacharias. 4382 @format 4383 pr[i][1] the i-th primary component, 4384 pr[i][2] the i-th prime component. 4385 @end format 4386 NOTE: Algorithm of Gianni/Trager/Zacharias. 4386 4387 Designed for characteristic 0, works also in char k > 0, if it 4387 4388 terminates (may result in an infinite loop in small characteristic!) … … 4408 4409 /////////////////////////////////////////////////////////////////////////////// 4409 4410 4410 proc primdecSY(ideal i, list #) )4411 proc primdecSY(ideal i, list #) 4411 4412 "USAGE: primdecSY(i); i ideal, c int 4412 @* if c=0, the given ordering of the variables is used.4413 @* if c=1, minAssChar tries to use an optimal ordering,4414 @* if c=2, minAssGTZ is used4415 @* if c=3, minAssGTZ and facstd is used4416 4413 RETURN: a list pr of primary ideals and their associated primes: 4417 @* - pr[i][1] the i-th primary component, 4418 @* - pr[i][2] the i-th prime component. 4419 NOTE: Algorithm of Shimoyama-Yokoyama. 4414 @format 4415 pr[i][1] the i-th primary component, 4416 pr[i][2] the i-th prime component. 4417 @end format 4418 NOTE: Algorithm of Shimoyama/Yokoyama. 4419 @format 4420 if c=0, the given ordering of the variables is used, 4421 if c=1, minAssChar tries to use an optimal ordering, 4422 if c=2, minAssGTZ is used, 4423 if c=3, minAssGTZ and facstd are used. 4424 @end format 4420 4425 Due to a bug in the factorization, the result may be not completely 4421 4426 decomposed in small characteristic. … … 4472 4477 /////////////////////////////////////////////////////////////////////////////// 4473 4478 proc minAssChar(ideal i, list #) 4474 "USAGE: minAssChar(i[,c]); i ideal. 4475 If c=0, the given ordering of the variables is used. 4479 "USAGE: minAssChar(i[,c]); i ideal, c int. 4480 RETURN: list, the minimal associated prime ideals of i. 4481 NOTE: If c=0, the given ordering of the variables is used. @* 4476 4482 Otherwise, the system tries to find an optimal ordering, 4477 which in some cases may considerably speed up the algorithm. 4478 RETURN: a list, the minimal associated prime ideals of i. 4479 NOTE: Due to a bug in the factorization, the result may be not completely 4483 which in some cases may considerably speed up the algorithm. @* 4484 Due to a bug in the factorization, the result may be not completely 4480 4485 decomposed in small characteristic. 4481 4486 EXAMPLE: example minAssChar; shows an example … … 4590 4595 proc prepareAss(ideal i) 4591 4596 "USAGE: prepareAss(i); i ideal 4592 RETURN: alist, the radicals of the maximal dimensional components of i.4593 NOTE: Uses algorithm of Eisenbud , Huneke andVasconcelos.4597 RETURN: list, the radicals of the maximal dimensional components of i. 4598 NOTE: Uses algorithm of Eisenbud/Huneke/Vasconcelos. 4594 4599 EXAMPLE: example prepareAss; shows an example 4595 4600 " … … 4673 4678 4674 4679 proc testPrimary(list pr, ideal k) 4675 "USAGE: testPrimary(pr,k); pr a list, result of primdecGTZ(k) or primdecSY(k) 4676 RETURN: int, 1 if intersection of the primary ideals in pr is k, 0 if not 4680 "USAGE: testPrimary(pr,k); pr a list, k an ideal. 4681 ASSUME: pr is the result of primdecGTZ(k) or primdecSY(k). 4682 RETURN: int, 1 if the intersection of the ideals in pr is k, 0 if not 4677 4683 EXAMPLE: example testPrimary; shows an example 4678 4684 " … … 4700 4706 proc zerodec(ideal I) 4701 4707 "USAGE: zerodec(I); I ideal 4702 RETURN: A list of primary ideals, the zero-dimensional decomposition of I 4703 ASSUME: I is zero-dimensional, the characterisitic of the ground field is 0 4704 NOTE: The algorithm (of C. Monico), works well only forsmall total number4705 of solutions ( vdim(std(I)) should be < 100) and without parameters.4706 In practice, it works also in big characteristic p>0 but may fail4707 for small p.4708 @* If printlevel > 0 (default = 0) additional information is displayed4708 ASSUME: I is zero-dimensional, the characteristic of the ground field is 0 4709 RETURN: list of primary ideals, the zero-dimensional decomposition of I 4710 NOTE: The algorithm (of Monico), works well only for a small total number 4711 of solutions (@code{vdim(std(I))} should be < 100) and without 4712 parameters. In practice, it works also in large characteristic p>0 4713 but may fail for small p. 4714 @* If printlevel > 0 (default = 0) additional information is displayed. 4709 4715 EXAMPLE: example zerodec; shows an example 4710 4716 " -
Singular/LIB/primitiv.lib
rd208704 r7b3971 3 3 // This library is for Singular 1.2 or newer 4 4 5 version="$Id: primitiv.lib,v 1.1 4 2001-01-16 13:48:40 SingularExp $";5 version="$Id: primitiv.lib,v 1.15 2001-02-05 12:01:39 lossen Exp $"; 6 6 category="Commutative Algebra"; 7 7 info=" … … 19 19 20 20 proc primitive(ideal i) 21 "USAGE: primitive(i); i ideal of the following form: 22 Let k be the ground field of your basering, a_1,...,a_n algebraic 23 over k, m_1(x_1), m_2(x_1,x_2),...,m_n(x_1,...,x_n) polynomials over 24 k such that m_j(a_1,...,a_(j-1),x_j) is minimal polynomial for 25 a_j over k(a_1,...,a_(j-1)) for all j=1,...,n. 26 Then i has to be generated by m_1,...,m_n. 27 RETURN: ideal j in k[x_n] such that 28 j[1] is minimal polynomial for a primitive element b of 29 k(a_1,...,a_n)=k(b) over k 30 j[2],...,j[n+1] polynomials in k[x_n] : j[i+1](b)=a_i for i=1,...,n 31 NOTE: the number of variables in the basering has to be exactly the number 32 n of given algebraic elements (and minimal polynomials). 33 If k has few elements it may happen that no linear combination 34 of a_1,...,a_n is a primitive element. In this case `primitive' 35 returns the zero ideal. If this occurs use primitive_extra instead. 21 "USAGE: primitive(i); i ideal 22 ASSUME: i is given by generators m[1],...,m[n] such that for j=1,...,n @* 23 - m[j] is a polynomial in k[x(1),...,x(j)] @* 24 - m[j](a[1],...,a[j-1],x(j)) is the minimal polynomial for a[j] over 25 k(a[1],...,a[j-1]) @* 26 (k the ground field of the current basering and x(1),...,x(n) 27 the ring variables). 28 RETURN: ideal j in k[x(n)] with 29 - j[1] a minimal polynomial for a primitive element b of 30 k(a[1],...,a[n]) over k, 31 - j[2],...,j[n+1] polynomials in k[x(n)] such that j[i+1](b)=a[i] 32 for i=1,...,n. 33 NOTE: the number of variables in the basering has to be exactly n, 34 the number of given generators (i.e., minimal polynomials).@* 35 If the ground field k has only a few elements it may happen that no 36 linear combination of a[1],...,a[n] is a primitive element. In this 37 case @code{primitive(i)} returns the zero ideal, and one should use 38 @code{primitive_extra(i)} instead. 36 39 SEE ALSO: primitive_extra 37 40 KEYWORDS: primitive element … … 122 125 ring exring=0,(x,y),dp; 123 126 ideal i=x2+1,y2-x; // compute Q(i,i^(1/2))=:L 124 ideal j=primitive(i); // -> we have L=Q(a):125 "minimal polynomial of a:",j[1]; // =>a=(-1)^(1/4)126 "polynomial for i: ",j[2]; // =>i=a^2127 "polynomial for i^(1/2): ",j[3]; // =>i^(1/2)=a128 // ==>the 2nd element was already primitive!127 ideal j=primitive(i); 128 j[1]; // L=Q(a) with a=(-1)^(1/4) 129 j[2]; // i=a^2 130 j[3]; // i^(1/2)=a 131 // the 2nd element was already primitive! 129 132 j=primitive(ideal(x2-2,y2-3)); // compute Q(sqrt(2),sqrt(3)) 130 "minimal polynomial:",j[1];131 "polynomial p s.t. p(a)=sqrt(2):",j[2];132 "polynomial r s.t. r(a)=sqrt(3):",j[3];133 // ==> no element was primitive -- the calculation of a is based134 // 133 j[1]; 134 j[2]; 135 j[3]; 136 // no element was primitive -- the calculation of primitive elements 137 // is based on a random choice. 135 138 } 136 139 /////////////////////////////////////////////////////////////////////////////// 137 140 138 141 proc primitive_extra(ideal i) 139 "USAGE: primitive_extra(i); ideal i=f,g; with the following properties: @* 140 Let k=Q or k=Z/pZ be the ground field of the basering, a,b algebraic 141 over k, x the name of the first ring variable, y the name of the 142 second, then: 143 f is the minimal polynomial of a in k[x], g is a polynomial in 144 k[x,y] s.t. g(a,y) is the minimal polynomial of b in k(a)[y] 142 "USAGE: primitive_extra(i); i ideal 143 ASSUME: The ground field of the basering is k=Q or k=Z/pZ and the ideal 144 i is given by 2 generators f,g with the following properties: 145 @format 146 f is the minimal polynomial of a in k[x], 147 g is a polynomial in k[x,y] s.th. g(a,y) is the minpoly of b in k(a)[y]. 148 @end format 149 Here, x is the name of the first ring variable, y the name of the 150 second. 145 151 RETURN: ideal j in k[y] such that 146 j[1] is minimal polynomial over k for a primitive element c of 147 k(a,b)=k(c) 148 j[2] is a polynomial s.t. j[2](c)=a 149 NOTE: While `primitive' may fail for finite fields, this proc tries all 150 elements of k(a,b) and hence finds by assurance a primitive element. 151 In order to do this (try all elements) field extensions like Z/pZ(a) 152 are not allowed for the ground field k. 153 primitive_extra assumes that g is monic as polynomial in (k[x])[y] 152 @format 153 j[1] is the minimal polynomial for a primitive element c of k(a,b) over k, 154 j[2] is a polynomial s.th. j[2](c)=a. 155 @end format 156 NOTE: While @code{primitive(i)} may fail for finite fields, 157 @code{primitive_extra(i)} tries all elements of k(a,b) and, hence, 158 always finds a primitive element. @* 159 In order to do this (try all elements), field extensions like Z/pZ(a) 160 are not allowed for the ground field k. @* 161 @code{primitive_extra(i)} assumes that the second generator, g, is 162 monic as polynomial in (k[x])[y]. 154 163 EXAMPLE: example primitive_extra; shows an example 155 164 " … … 245 254 246 255 proc splitring 247 "USAGE: splitring(f,R[,L]); f poly, univariate and irreducible(!) over the 248 active basering; R string, L list of polys and/or ideals (optional) 249 CREATE: a ring with name R, in which f is reducible, and change to it. 250 If the old ring has no parameter, the name 'a' is chosen for the 251 parameter of R (if a is no variable; if it is, the proc takes 'b', 252 etc.; if a,b,c,o are variables of the ring, produce an error message), 253 otherwise the name of the parameter is kept and only the 254 minimal polynomial is changed. 255 The names of variables and orderings are not affected. 256 It is also allowed to call splitring with R==\"\". 257 Then the old basering will be REPLACED by the new ring 258 (with the same name as the old ring). 256 "USAGE: splitring(f,R[,L]); f poly, R string, L list of polys and/or ideals 257 (optional) 258 ASSUME: f is univariate and irreducible over the active basering. @* 259 The active ring must allow an algebraic extension (e.g., it cannot 260 be a transcendent ring extension of Q or Z/p). 261 CREATE: a ring with name R, in which f is reducible, and CHANGE to it. 259 262 RETURN: list L mapped into the new ring R, if L is given; else nothing 260 ASSUME: The active ring must allow an algebraic extension 261 (e.g. it cannot be a transcendent ring extension of Q or Z/p). 263 NOTE: If the old ring has no parameter, the name @code{a} is chosen for the 264 parameter of R (if @code{a} is no ring variable; if it is, @code{b} is 265 chosen, etc.; if @code{a,b,c,o} are ring variables, 266 @code{splitring(f,R[,L])} produces an error message), otherwise the 267 name of the parameter is kept and only the minimal polynomial is 268 changed. @* 269 The names of the ring variables and the orderings are not affected. @* 270 It is also allowed to call @code{splitring} with R=\"\". 271 Then the old basering will be REPLACED by the new ring (with the 272 same name as the old ring). 262 273 KEYWORDS: algebraic field extension; extension of rings 263 274 EXAMPLE: example splitring; shows an example … … 389 400 ring r=0,(x,y),dp; 390 401 splitring(x2-2,"r1"); // change to Q(sqrt(2)) 391 splitring(x2-a,"r2",a); // change to Q(sqrt(2),sqrt(sqrt(2)))=Q(a) 392 // and return the transformed old parameter 393 // the result is (a2) == (sqrt(sqrt(2)))^2 402 // change to Q(sqrt(2),sqrt(sqrt(2)))=Q(a) and return the transformed 403 // old parameter: 404 splitring(x2-a,"r2",a); 405 // the result is (a)^2 = (sqrt(sqrt(2)))^2 394 406 nameof(basering); 395 407 r2;
Note: See TracChangeset
for help on using the changeset viewer.