Changeset ae9fd9 in git
- Timestamp:
- Jul 28, 2009, 12:26:27 PM (14 years ago)
- Branches:
- (u'spielwiese', '828514cf6e480e4bafc26df99217bf2a1ed1ef45')
- Children:
- 3f4e526e3cc452dc07c10ec2049456a441cf11d8
- Parents:
- 1c5fa50a543d43c7bb0c21bc2e1c9a5f9849e140
- Location:
- Singular/LIB
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/tropical.lib
r1c5fa5 rae9fd9 1 version="$Id: tropical.lib,v 1.1 8 2009-07-09 12:20:30 keilenExp $";1 version="$Id: tropical.lib,v 1.19 2009-07-28 10:26:27 Singular Exp $"; 2 2 category="Tropical Geometry"; 3 3 info=" … … 8 8 @* Thomas Markwig, email: keilen@mathematik.uni-kl.de 9 9 10 WARNING: 10 WARNING: 11 11 - tropicalLifting will only work with LINUX and if in addition gfan is installed. 12 @*- drawTropicalCurve and drawTropicalNewtonSubdivision will only display the 13 @* tropical curve with LINUX and if in addition latex and kghostview 12 @*- drawTropicalCurve and drawTropicalNewtonSubdivision will only display the 13 @* tropical curve with LINUX and if in addition latex and kghostview 14 14 @* are installed. 15 @*- For tropicalLifting in the definition of the basering the parameter t 15 @*- For tropicalLifting in the definition of the basering the parameter t 16 16 @* from the Puiseux series field C{{t}} must be defined as a variable, 17 17 @* while for all other procedures it must be defined as a parameter. 18 18 19 19 THEORY: 20 Fix some base field K and a bunch of lattice points v0,...,vm in the integer 21 lattice Z^n, then this defines a toric variety as the closure of (K*)^n in 22 the projective space P^m, where the torus is embedded via the map sending a 20 Fix some base field K and a bunch of lattice points v0,...,vm in the integer 21 lattice Z^n, then this defines a toric variety as the closure of (K*)^n in 22 the projective space P^m, where the torus is embedded via the map sending a 23 23 point x in (K*)^n to the point (x^v0,...,x^vm). 24 The generic hyperplane sections are just the images of the hypersurfaces 24 The generic hyperplane sections are just the images of the hypersurfaces 25 25 in (K*)^n defined by the polynomials f=a0*x^v0+...+am*x^vm=0. Some properties 26 of these hypersurfaces can be studied via tropicalisation. 27 28 For this we suppose that K=C{{t}} is the field of Puiseux series over the 26 of these hypersurfaces can be studied via tropicalisation. 27 28 For this we suppose that K=C{{t}} is the field of Puiseux series over the 29 29 field of complex numbers (or any other field with a valuation into the real 30 numbers). One associates to the hypersurface given by f=a0*x^v0+...+am*x^vm 30 numbers). One associates to the hypersurface given by f=a0*x^v0+...+am*x^vm 31 31 the tropical hypersurface defined by the tropicalisation 32 trop(f)=min{val(a0)+<v0,x>,...,val(am)+<vm,x>}. 32 trop(f)=min{val(a0)+<v0,x>,...,val(am)+<vm,x>}. 33 33 Here, <v,x> denotes the standard scalar product of the integer vector v in Z^n 34 34 with the vector x=(x1,...,xn) of variables, so that trop(f) is a piecewise 35 linear function on R^n. The corner locus of this function (i.e. the points 36 at which the minimum is attained a least twice) is the tropical hypersurface 37 defined by trop(f). 38 The theorem of Newton-Kapranov states that this tropical hypersurface is 39 the same as if one computes pointwise the valuation of the hypersurface 40 given by f. The analogue holds true if one replaces one equation f by an 41 ideal I. A constructive proof of the theorem is given by an adapted 42 version of the Newton-Puiseux algorithm. The hard part is to find a point 43 in the variety over C{{t}} which corresponds to a given point in the 35 linear function on R^n. The corner locus of this function (i.e. the points 36 at which the minimum is attained a least twice) is the tropical hypersurface 37 defined by trop(f). 38 The theorem of Newton-Kapranov states that this tropical hypersurface is 39 the same as if one computes pointwise the valuation of the hypersurface 40 given by f. The analogue holds true if one replaces one equation f by an 41 ideal I. A constructive proof of the theorem is given by an adapted 42 version of the Newton-Puiseux algorithm. The hard part is to find a point 43 in the variety over C{{t}} which corresponds to a given point in the 44 44 tropical variety. 45 45 46 It is the purpose of this library to provide basic means to deal with 47 tropical varieties. Of course we cannot represent the field of Puiseux 48 series over C in its full strength, however, in order to compute interesting 49 examples it will be sufficient to replace the complex numbers C by the 50 rational numbers Q and to replace Puiseux series in t by rational functions 51 in t, i.e. we replace C{{t}} by Q(t), or sometimes even by Q[t]. 46 It is the purpose of this library to provide basic means to deal with 47 tropical varieties. Of course we cannot represent the field of Puiseux 48 series over C in its full strength, however, in order to compute interesting 49 examples it will be sufficient to replace the complex numbers C by the 50 rational numbers Q and to replace Puiseux series in t by rational functions 51 in t, i.e. we replace C{{t}} by Q(t), or sometimes even by Q[t]. 52 52 Note, that this in particular forbids rational exponents for the t's. 53 53 54 54 Moreover, in @sc{Singular} no negative exponents of monomials are allowed, so 55 that the integer vectors vi will have to have non-negative entries. 56 Shifting all exponents by a fixed integer vector does not change the 57 tropicalisation nor does it change the toric variety. Thus this does not 55 that the integer vectors vi will have to have non-negative entries. 56 Shifting all exponents by a fixed integer vector does not change the 57 tropicalisation nor does it change the toric variety. Thus this does not 58 58 cause any restriction. 59 If, however, for some reason you prefer to work with general vi, then you 60 have to pass right away to the tropicalisation of the equations, whereever 59 If, however, for some reason you prefer to work with general vi, then you 60 have to pass right away to the tropicalisation of the equations, whereever 61 61 this is allowed -- these are linear polynomials where the constant coefficient 62 corresponds to the valuation of the original coefficient and where 63 the non-constant coefficient correspond to the exponents of the monomials, 64 thus they may be rational numbers respectively negative numbers: 62 corresponds to the valuation of the original coefficient and where 63 the non-constant coefficient correspond to the exponents of the monomials, 64 thus they may be rational numbers respectively negative numbers: 65 65 e.g. if f=t^{1/2}*x^{-2}*y^3+2t*x*y+4 then trop(f)=min{1/2-2x+3y,1+x+y,0}. 66 66 67 67 The main tools provided in this library are as follows: 68 @* - tropicalLifting implements the constructive proof of the Theorem of 69 Newton-Kapranov and constructs a point in the variety 70 over C{{t}} corresponding to a given point in the 71 corresponding tropical variety associated to an 72 ideal I; the generators of I have to be in the 73 polynomial ring Q[t,x1,...,xn] considered as a 74 subring of C{{t}}[x1,...,xn]; a solution will be 75 constructed up to given order; note that several 68 @* - tropicalLifting implements the constructive proof of the Theorem of 69 Newton-Kapranov and constructs a point in the variety 70 over C{{t}} corresponding to a given point in the 71 corresponding tropical variety associated to an 72 ideal I; the generators of I have to be in the 73 polynomial ring Q[t,x1,...,xn] considered as a 74 subring of C{{t}}[x1,...,xn]; a solution will be 75 constructed up to given order; note that several 76 76 field extensions of Q might be necessary throughout 77 77 the intermediate computations; the procedures use 78 78 the external program gfan 79 @* - drawTropicalCurve visualises a tropical plane curve either given by a 80 polynomial in Q(t)[x,y] or by a list of linear 81 polynomials of the form ax+by+c with a,b in Z and c 79 @* - drawTropicalCurve visualises a tropical plane curve either given by a 80 polynomial in Q(t)[x,y] or by a list of linear 81 polynomials of the form ax+by+c with a,b in Z and c 82 82 in Q; latex must be installed on your computer 83 @* - tropicalJInvariant computes the tropical j-invaiant of a tropical 83 @* - tropicalJInvariant computes the tropical j-invaiant of a tropical 84 84 elliptic curve 85 85 @* - jInvariant computes the j-invariant of an elliptic curve 86 @* - weierstrassForm computes the Weierstrass form of an elliptic curve 86 @* - weierstrassForm computes the Weierstrass form of an elliptic curve 87 87 88 88 PROCEDURES FOR TROPICAL LIFTING: 89 tropicalLifting() computes a point in the tropical variety 89 tropicalLifting() computes a point in the tropical variety 90 90 displayTropicalLifting() displays the output of tropicalLifting 91 91 … … 107 107 tInitialIdeal() computes the tInitial ideal of an ideal in Q[t,x_1,...,x_n] 108 108 initialForm() computes the initial form of poly in Q[x_1,...,x_n] 109 initialIdeal() computes the initial ideal of an ideal in Q[x_1,...,x_n] 109 initialIdeal() computes the initial ideal of an ideal in Q[x_1,...,x_n] 110 110 111 111 PROCEDURES FOR LATEX CONVERSION: … … 115 115 texDrawBasic() embeds output of texDrawTropical in a texdraw environment 116 116 texDrawTropical() computes the texdraw commands for a tropical curve 117 texDrawNewtonSubdivision() computes texdraw commands for a Newton subdivision 117 texDrawNewtonSubdivision() computes texdraw commands for a Newton subdivision 118 118 texDrawTriangulation() computes texdraw commands for a triangulation 119 119 … … 121 121 radicalMemberShip() checks radical membership 122 122 tInitialFormPar() computes the t-initial form of poly in Q(t)[x_1,...,x_n] 123 tInitialFormParMax() same as tInitialFormPar, but uses maximum 123 tInitialFormParMax() same as tInitialFormPar, but uses maximum 124 124 solveTInitialFormPar() displays approximated solution of a 0-dim ideal 125 125 detropicalise() computes the detropicalisation of a linear form 126 dualConic() computes the dual of an affine plane conic 126 dualConic() computes the dual of an affine plane conic 127 127 parameterSubstitute() substitutes in the polynomial the parameter t by t^N 128 128 tropicalSubst() makes certain substitutions in a tropical polynomial … … 155 155 /// - eliminatecomponents 156 156 /// - findzerosAndBasictransform 157 /// - ordermaximalideals 157 /// - ordermaximalideals 158 158 /// - verticesTropicalCurve 159 159 /// - bunchOfLines … … 204 204 205 205 /////////////////////////////////////////////////////////////////////////////// 206 /// Procedures concerned with tropical parametrisation 206 /// Procedures concerned with tropical parametrisation 207 207 /////////////////////////////////////////////////////////////////////////////// 208 208 209 209 proc tropicalLifting (ideal i,intvec w,int ordnung,list #) 210 210 "USAGE: tropicalLifting(i,w,ord[,opt]); i ideal, w intvec, ord int, opt string 211 ASSUME: - i is an ideal in Q[t,x_1,...,x_n], w=(w_0,w_1,...,w_n) 212 and (w_1/w_0,...,w_n/w_0) is in the tropical variety of i, 213 and ord is the order up to which a point in V(i) over Q{{t}} 214 lying over (w_1/w_0,...,w_n/w_0) shall be computed; 211 ASSUME: - i is an ideal in Q[t,x_1,...,x_n], w=(w_0,w_1,...,w_n) 212 and (w_1/w_0,...,w_n/w_0) is in the tropical variety of i, 213 and ord is the order up to which a point in V(i) over Q{{t}} 214 lying over (w_1/w_0,...,w_n/w_0) shall be computed; 215 215 w_0 may NOT be ZERO 216 @* - the basering should not have any parameters on its own 217 and it should have a global monomial ordering, 216 @* - the basering should not have any parameters on its own 217 and it should have a global monomial ordering, 218 218 e.g. ring r=0,(t,x(1..n)),dp; 219 @* - the first variable of the basering will be treated as the 219 @* - the first variable of the basering will be treated as the 220 220 parameter t in the Puiseux series field 221 @* - the optional parameter opt should be one or more strings among 221 @* - the optional parameter opt should be one or more strings among 222 222 the following: 223 223 @* 'isZeroDimensional' : the dimension i is zero (not to be checked); 224 @* 'isPrime' : the ideal is prime over Q(t)[x_1,...,x_n] 224 @* 'isPrime' : the ideal is prime over Q(t)[x_1,...,x_n] 225 225 (not to be checked); 226 @* 'isInTrop' : (w_1/w_0,...,w_n/w_0) is in the tropical 226 @* 'isInTrop' : (w_1/w_0,...,w_n/w_0) is in the tropical 227 227 variety (not to be checked); 228 @* 'oldGfan' : uses gfan version 0.2.1 or less 229 @* 'findAll' : find all solutions of a zero-dimensional 228 @* 'oldGfan' : uses gfan version 0.2.1 or less 229 @* 'findAll' : find all solutions of a zero-dimensional 230 230 ideal over (w_1/w_0,...,w_n/w_0) 231 231 @* 'noAbs' : do NOT use absolute primary decomposition … … 233 233 RETURN: IF THE OPTION 'findAll' WAS NOT SET THEN: 234 234 @* list, containing one lifting of the given point (w_1/w_0,...,w_n/w_0) 235 in the tropical variety of i to a point in V(i) over Puiseux 235 in the tropical variety of i to a point in V(i) over Puiseux 236 236 series field up to the first ord terms; more precisely: 237 237 @* IF THE OPTION 'noAbs' WAS NOT SET, THEN: … … 248 248 @* IF THE OPITON 'findAll' WAS SET, THEN: 249 249 @* list, containing ALL liftings of the given point ((w_1/w_0,...,w_n/w_0) 250 in the tropical variety of i to a point in V(i) over Puiseux 251 series field up to the first ord terms, if the ideal is 250 in the tropical variety of i to a point in V(i) over Puiseux 251 series field up to the first ord terms, if the ideal is 252 252 zero-dimensional over Q{{t}}; 253 more precisely, each entry of the list is a list l as computed 253 more precisely, each entry of the list is a list l as computed 254 254 if 'findAll' was NOT set 255 255 @* WE NOW DESCRIBE THE LIST ENTRIES IF 'findAll' WAS NOT SET: 256 @* - the ring l[1] contains an ideal LIFT, which contains 256 @* - the ring l[1] contains an ideal LIFT, which contains 257 257 a point in V(i) lying over w up to the first ord terms; 258 @* - and if the integer l[2] is N then t has to be replaced by t^1/N 258 @* - and if the integer l[2] is N then t has to be replaced by t^1/N 259 259 in the lift, or alternatively replace t by t^N in the defining ideal 260 @* - if the k+1st entry of l[3] is non-zero, then the kth component of 261 LIFT has to be multiplied t^(-l[3][k]/l[3][1]) AFTER substituting t 260 @* - if the k+1st entry of l[3] is non-zero, then the kth component of 261 LIFT has to be multiplied t^(-l[3][k]/l[3][1]) AFTER substituting t 262 262 by t^1/N 263 @* - unless the option 'noResubst' was set, the kth entry of list l[4] 263 @* - unless the option 'noResubst' was set, the kth entry of list l[4] 264 264 is a string which represents the kth generator of 265 the ideal i where the coordinates have been replaced by the result 265 the ideal i where the coordinates have been replaced by the result 266 266 of the lift; 267 the t-order of the kth entry should in principle be larger than the 267 the t-order of the kth entry should in principle be larger than the 268 268 t-degree of LIFT 269 @* - if the option 'noAbs' was set, then the string in l[5] defines 270 a maximal ideal in the field Q[X(1),...,X(k)], where X(1),...,X(k) 269 @* - if the option 'noAbs' was set, then the string in l[5] defines 270 a maximal ideal in the field Q[X(1),...,X(k)], where X(1),...,X(k) 271 271 are the parameters of the ring in l[1]; 272 the basefield of the ring in l[1] should be considered modulo this 272 the basefield of the ring in l[1] should be considered modulo this 273 273 ideal 274 REMARK: - it is best to use the procedure displayTropicalLifting to 274 REMARK: - it is best to use the procedure displayTropicalLifting to 275 275 display the result 276 276 @* - the option 'findAll' cannot be used if 'noAbs' is set 277 277 @* - if the parameter 'findAll' is set AND the ideal i is zero-dimensional 278 in Q{{t}}[x_1,...,x_n] then ALL points in V(i) lying over w are 278 in Q{{t}}[x_1,...,x_n] then ALL points in V(i) lying over w are 279 279 computed up to order ord; if the ideal is not-zero dimenisonal, then 280 280 only the points in the ideal after cutting down to dimension zero 281 281 will be computed 282 282 @* - the procedure requires that the program GFAN is installed on your 283 computer; if you have GFAN version less than 0.3.0 then you must 283 computer; if you have GFAN version less than 0.3.0 then you must 284 284 use the optional parameter 'oldGfan' 285 285 @* - the procedure requires the @sc{Singular} procedure absPrimdecGTZ to be 286 286 present in the package primdec.lib, unless the option 'noAbs' is set; 287 but even if absPrimdecGTZ is present it might be necessary to set 288 the option 'noAbs' in order to avoid the costly absolute primary 289 decomposition; the side effect is that the field extension which is 287 but even if absPrimdecGTZ is present it might be necessary to set 288 the option 'noAbs' in order to avoid the costly absolute primary 289 decomposition; the side effect is that the field extension which is 290 290 computed throughout the recursion might need more than one 291 291 parameter to be described 292 292 @* - since Q is infinite, the procedure finishes with probability one 293 @* - you can call the procedure with Z/pZ as base field instead of Q, 293 @* - you can call the procedure with Z/pZ as base field instead of Q, 294 294 but there are some problems you should be aware of: 295 @* + the Puiseux series field over the algebraic closure of Z/pZ is 296 NOT algebraicall closed, and thus there may not exist a point in 297 V(i) over the Puiseux series field with the desired valuation; 295 @* + the Puiseux series field over the algebraic closure of Z/pZ is 296 NOT algebraicall closed, and thus there may not exist a point in 297 V(i) over the Puiseux series field with the desired valuation; 298 298 so there is no chance that the procedure produced a sensible output 299 - e.g. if i=tx^p-tx-1 300 @* + if the dimension of i over Z/pZ(t) is not zero the process of 301 reduction to zero might not work if the characteristic is small 299 - e.g. if i=tx^p-tx-1 300 @* + if the dimension of i over Z/pZ(t) is not zero the process of 301 reduction to zero might not work if the characteristic is small 302 302 and you are unlucky 303 @* + the option 'noAbs' has to be used since absolute primary 303 @* + the option 'noAbs' has to be used since absolute primary 304 304 decomposition in @sc{Singular} only works in characteristic zero 305 @* - the basefield should either be Q or Z/pZ for some prime p; 306 field extensions will be computed if necessary; if you need 307 parameters or field extensions from the beginning they should 308 rather be simulated as variables possibly adding their relations to 305 @* - the basefield should either be Q or Z/pZ for some prime p; 306 field extensions will be computed if necessary; if you need 307 parameters or field extensions from the beginning they should 308 rather be simulated as variables possibly adding their relations to 309 309 the ideal; the weights for the additional variables should be zero 310 310 EXAMPLE: example tropicalLifting; shows an example" … … 357 357 noabs=1; 358 358 } 359 // this option is not documented -- it prevents the execution of gfan and 360 // just asks for wneu to be inserted -- it can be used to check problems 361 // with the precedure without calling gfan, if wneu is know from previous 359 // this option is not documented -- it prevents the execution of gfan and 360 // just asks for wneu to be inserted -- it can be used to check problems 361 // with the precedure without calling gfan, if wneu is know from previous 362 362 // computations 363 363 if (#[j]=="noGfan") … … 370 370 } 371 371 } 372 // if the basering has characteristic not equal to zero, 372 // if the basering has characteristic not equal to zero, 373 373 // then absolute factorisation 374 374 // is not available, and thus we need the option noAbs … … 384 384 { 385 385 Error("The first coordinate of your input w must be NON-ZERO, since it is a DENOMINATOR!"); 386 } 386 } 387 387 // if w_0<0, then replace w by -w, so that the "denominator" w_0 is positive 388 388 if (w[1]<0) … … 391 391 } 392 392 intvec prew=w; // stores w for later reference 393 // for our computations, w[1] represents the weight of t and this 393 // for our computations, w[1] represents the weight of t and this 394 394 // should be -w_0 !!! 395 395 w[1]=-w[1]; … … 401 401 w[1]=-1; 402 402 } 403 // if some entry of w is positive, we have to make a transformation, 403 // if some entry of w is positive, we have to make a transformation, 404 404 // which moves it to something non-positive 405 405 for (j=2;j<=nvars(basering);j++) … … 427 427 { 428 428 variablen=variablen+var(j); 429 } 429 } 430 430 map GRUNDPHI=BASERING,t,variablen; 431 431 ideal i=GRUNDPHI(i); 432 // compute the initial ideal of i and test if w is in the tropical 433 // variety of i 432 // compute the initial ideal of i and test if w is in the tropical 433 // variety of i 434 434 // - the last entry 1 only means that t is the last variable in the ring 435 435 ideal ini=tInitialIdeal(i,w,1); 436 436 if (isintrop==0) // test if w is in trop(i) only if isInTrop has not been set 437 { 437 { 438 438 poly product=1; 439 439 for (j=1;j<=nvars(basering)-1;j++) … … 453 453 int dd=dim(i); 454 454 setring GRUNDRING; 455 // if the dimension is not zero, we cut the ideal down to dimension zero 455 // if the dimension is not zero, we cut the ideal down to dimension zero 456 456 // and compute the 457 457 // t-initial ideal of the new ideal at the same time 458 458 if(dd!=0) 459 459 { 460 // the procedurce cutdown computes a new ring, in which there lives a 460 // the procedurce cutdown computes a new ring, in which there lives a 461 461 // zero-dimensional 462 // ideal which has been computed by cutting down the input with 462 // ideal which has been computed by cutting down the input with 463 463 // generic linear forms 464 // of the type x_i1-p_1,...,x_id-p_d for some polynomials 465 // p_1,...,p_d not depending 466 // on the variables x_i1,...,x_id; that way we have reduced 464 // of the type x_i1-p_1,...,x_id-p_d for some polynomials 465 // p_1,...,p_d not depending 466 // on the variables x_i1,...,x_id; that way we have reduced 467 467 // the number of variables by dd !!! 468 // the new zero-dimensional ideal is called i, its t-initial 468 // the new zero-dimensional ideal is called i, its t-initial 469 469 // ideal (with respect to 470 // the new w=CUTDOWN[2]) is ini, and finally there is a list 471 // repl in the ring 470 // the new w=CUTDOWN[2]) is ini, and finally there is a list 471 // repl in the ring 472 472 // which contains at the polynomial p_j at position i_j and 473 473 //a zero otherwise; … … 492 492 list liftrings; // will contain the final result 493 493 // if the procedure is called without 'findAll' then it may happen, that no 494 // proper solution is found when dd>0; in that case we have 494 // proper solution is found when dd>0; in that case we have 495 495 // to start all over again; 496 496 // this is controlled by the while-loop … … 508 508 // compute the liftrings by resubstitution 509 509 kk=1; // counts the liftrings 510 int isgood; // test in the non-zerodimensional case 510 int isgood; // test in the non-zerodimensional case 511 511 // if the result has the correct valuation 512 512 for (jj=1;jj<=size(TP);jj++) 513 513 { 514 // the list TP contains as a first entry the ring over which the 515 // tropical parametrisation 514 // the list TP contains as a first entry the ring over which the 515 // tropical parametrisation 516 516 // of the (possibly cutdown ideal) i lives 517 517 def LIFTRING=TP[jj][1]; 518 // if the dimension of i originally was not zero, 518 // if the dimension of i originally was not zero, 519 519 // then we have to fill in the missing 520 520 // parts of the parametrisation 521 521 if (dd!=0) 522 522 { 523 // we need a ring where the parameters X_1,...,X_k 523 // we need a ring where the parameters X_1,...,X_k 524 524 // from LIFTRING are present, 525 525 // and where also the variables of CUTDOWNRING live 526 526 execute("ring REPLACEMENTRING=("+charstr(LIFTRING)+"),("+varstr(CUTDOWNRING)+"),dp;"); 527 list repl=imap(CUTDOWNRING,repl); // get the replacement rules 527 list repl=imap(CUTDOWNRING,repl); // get the replacement rules 528 528 // from CUTDOWNRING 529 ideal PARA=imap(LIFTRING,PARA); // get the zero-dim. parametrisatio 529 ideal PARA=imap(LIFTRING,PARA); // get the zero-dim. parametrisatio 530 530 // from LIFTRING 531 531 // compute the lift of the solution of the original ideal i … … 533 533 k=1; 534 534 // the lift has as many components as GRUNDRING has variables!=t 535 for (j=1;j<=nvars(GRUNDRING)-1;j++) 535 for (j=1;j<=nvars(GRUNDRING)-1;j++) 536 536 { 537 537 // if repl[j]=0, then the corresponding variable was not eliminated 538 if (repl[j]==0) 538 if (repl[j]==0) 539 539 { 540 LIFT[j]=PARA[k]; // thus the lift has been 540 LIFT[j]=PARA[k]; // thus the lift has been 541 541 // computed by tropicalparametrise 542 542 k++; // k checks how many entries of PARA have already been used … … 544 544 else // if repl[j]!=0, repl[j] contains replacement rule for the lift 545 545 { 546 LIFT[j]=repl[j]; // we still have to replace the vars 546 LIFT[j]=repl[j]; // we still have to replace the vars 547 547 // in repl[j] by the corresp. entries of PARA 548 548 // replace all variables!=t (from CUTDOWNRING) 549 for (l=1;l<=nvars(CUTDOWNRING)-1;l++) 549 for (l=1;l<=nvars(CUTDOWNRING)-1;l++) 550 550 { 551 551 // substitute the kth variable by PARA[k] 552 LIFT[j]=subst(LIFT[j],var(l),PARA[l]); 552 LIFT[j]=subst(LIFT[j],var(l),PARA[l]); 553 553 } 554 554 } 555 555 } 556 556 setring LIFTRING; 557 ideal LIFT=imap(REPLACEMENTRING,LIFT); 558 // test now if the LIFT has the correct valuation !!! 559 // note: it may happen, that when resubstituting PARA into 557 ideal LIFT=imap(REPLACEMENTRING,LIFT); 558 // test now if the LIFT has the correct valuation !!! 559 // note: it may happen, that when resubstituting PARA into 560 560 // the replacement rules 561 // there occured some unexpected cancellation; 561 // there occured some unexpected cancellation; 562 562 // we only know that for SOME 563 // solution of the zero-dimensional reduction NO 564 // canellation will occur, 565 // but for others this may very well happen; 563 // solution of the zero-dimensional reduction NO 564 // canellation will occur, 565 // but for others this may very well happen; 566 566 // this in particular means that 567 // we possibly MUST compute all zero-dimensional 567 // we possibly MUST compute all zero-dimensional 568 568 // solutions when cutting down! 569 569 intvec testw=precutdownw[1]; … … 589 589 kill PARA; 590 590 // only if LIFT has the right valuation we have to do something 591 if (isgood==1) 592 { 593 // it remains to reverse the original substitutions, 591 if (isgood==1) 592 { 593 // it remains to reverse the original substitutions, 594 594 // where appropriate !!! 595 // if some entry of the original w was positive, 595 // if some entry of the original w was positive, 596 596 // we replace the corresponding 597 597 // variable x_i by t^-w[i]*x_i, so we must now replace … … 610 610 */ 611 611 // if LIFTRING contains a parameter @a, change it to a 612 if ((noabs==0) and (defined(@a)==-1)) 612 if ((noabs==0) and (defined(@a)==-1)) 613 613 { 614 // pass first to a ring where a and @a 614 // pass first to a ring where a and @a 615 615 // are variables in order to use maps 616 616 poly mp=minpoly; … … 621 621 // replace @a by a in minpoly and in LIFT 622 622 map phi=INTERRING,t,a,a; 623 mp=phi(mp); 623 mp=phi(mp); 624 624 LIFT=phi(LIFT); 625 625 // pass now to a ring whithout @a and with a as parameter … … 628 628 ideal LIFT=imap(INTERRING,LIFT); 629 629 kill INTERRING; 630 } 630 } 631 631 // then export LIFT 632 export(LIFT); 632 export(LIFT); 633 633 // test the result by resubstitution 634 setring GRUNDRING; 634 setring GRUNDRING; 635 635 list resubst; 636 636 if (noresubst==0) … … 641 641 } 642 642 else 643 { 643 { 644 644 resubst=tropicalliftingresubstitute(substitute(i,t,t^(TP[jj][2])),list(LIFTRING),N*TP[jj][2]); 645 645 } 646 646 } 647 647 setring BASERING; 648 // Finally, if t has been replaced by t^N, then we have to change the 648 // Finally, if t has been replaced by t^N, then we have to change the 649 649 // third entry of TP by multiplying by N. 650 650 if (noabs==1) … … 662 662 kill LIFTRING; 663 663 } 664 // if dd!=0 and the procedure was called without the 664 // if dd!=0 and the procedure was called without the 665 665 // option findAll, then it might very well 666 // be the case that no solution is found, since 666 // be the case that no solution is found, since 667 667 // only one solution for the zero-dimensional 668 // reduction was computed and this one might have 668 // reduction was computed and this one might have 669 669 // had cancellations when resubstituting; 670 670 // if so we have to restart the process with the option findAll … … 674 674 "The procedure will be restarted with the option 'findAll'."; 675 675 "Go on by hitting RETURN!"; 676 findall=1; 676 findall=1; 677 677 noabs=0; 678 678 setring CUTDOWNRING; … … 680 680 "i";i; 681 681 "ini";tInitialIdeal(i,w,1); 682 682 683 683 /* 684 684 setring GRUNDRING; … … 698 698 } 699 699 } 700 // if internally the option findall was set, then return 700 // if internally the option findall was set, then return 701 701 // only the first solution 702 702 if (defined(hadproblems)!=0) … … 707 707 if (voice+printlevel>=2) 708 708 { 709 709 710 710 "The procedure has created a list of lists. The jth entry of this list 711 711 contains a ring, an integer and an intvec. 712 712 In this ring lives an ideal representing the wanted lifting, 713 713 if the integer is N then in the parametrisation t has to be replaced by t^1/N, 714 and if the ith component of the intvec is w[i] then the ith component in LIFT 714 and if the ith component of the intvec is w[i] then the ith component in LIFT 715 715 should be multiplied by t^-w[i]/N in order to get the parametrisation. 716 716 717 717 Suppose your list has the name L, then you can access the 1st ring via: 718 718 "; 719 719 if (findall==1) 720 720 { 721 "def LIFTRing=L[1][1]; setring LIFTRing; LIFT; 721 "def LIFTRing=L[1][1]; setring LIFTRing; LIFT; 722 722 "; 723 723 } 724 724 else 725 725 { 726 "def LIFTRing=L[1]; setring LIFTRing; LIFT; 726 "def LIFTRing=L[1]; setring LIFTRing; LIFT; 727 727 "; 728 } 728 } 729 729 } 730 730 if (findall==1) // if all solutions have been computed, return a list of lists … … 751 751 def LIFTRing=LIST[1]; 752 752 setring LIFTRing; 753 // LIFT contains the first 4 terms of a point in the variety of i 753 // LIFT contains the first 4 terms of a point in the variety of i 754 754 // over the Puiseux series field C{{t}} whose order is -w[1]/w[0]=1 755 755 LIFT; … … 779 779 // NOTE: since the last component of v is positive, the lifting 780 780 // must start with a negative power of t, which in Singular 781 // is not allowed for a variable. 781 // is not allowed for a variable. 782 782 def LIFTRing3=LIST[1]; 783 783 setring LIFTRing3; … … 834 834 string Kstring="Z/"+string(char(LIFTRing))+"Z"; 835 835 } 836 // this means that tropicalLifting was called with 836 // this means that tropicalLifting was called with 837 837 // absolute primary decomposition 838 if (size(troplift)==4) 839 { 838 if (size(troplift)==4) 839 { 840 840 setring LIFTRing; 841 841 "The lifting of the point in the tropical variety lives in the ring"; 842 842 if ((size(LIFTpar)==0) and (N==1)) 843 843 { 844 Kstring+"[[t]]"; 844 Kstring+"[[t]]"; 845 845 } 846 846 if ((size(LIFTpar)==0) and (N!=1)) 847 847 { 848 Kstring+"[[t^(1/"+string(N)+")]]"; 848 Kstring+"[[t^(1/"+string(N)+")]]"; 849 849 } 850 850 if ((size(LIFTpar)!=0) and (N!=1)) 851 { 852 Kstring+"["+LIFTpar+"]/"+string(minpoly)+"[[t^(1/"+string(N)+")]]"; 851 { 852 Kstring+"["+LIFTpar+"]/"+string(minpoly)+"[[t^(1/"+string(N)+")]]"; 853 853 } 854 854 if ((size(LIFTpar)!=0) and (N==1)) 855 { 856 Kstring+"["+LIFTpar+"]/"+string(minpoly)+"[[t]]"; 855 { 856 Kstring+"["+LIFTpar+"]/"+string(minpoly)+"[[t]]"; 857 857 } 858 858 } … … 871 871 } 872 872 if ((size(LIFTpar)!=0) and (N!=1)) 873 { 874 Kstring+"["+LIFTpar+"]/M[[t^(1/"+string(N)+")]]"; 873 { 874 Kstring+"["+LIFTpar+"]/M[[t^(1/"+string(N)+")]]"; 875 875 "where M is the maximal ideal"; 876 876 "M=<"+m+">"; 877 877 } 878 878 if ((size(LIFTpar)!=0) and (N==1)) 879 { 880 Kstring+"["+LIFTpar+"]/M[[t]]"; 879 { 880 Kstring+"["+LIFTpar+"]/M[[t]]"; 881 881 "where M is the maximal ideal"; 882 882 "M=<"+m+">"; 883 } 883 } 884 884 } 885 885 ""; … … 908 908 } 909 909 } 910 } 910 } 911 911 } 912 912 example … … 922 922 923 923 /////////////////////////////////////////////////////////////////////////////// 924 /// Procedures concerned with drawing a tropical curve or a Newton subdivision 924 /// Procedures concerned with drawing a tropical curve or a Newton subdivision 925 925 /////////////////////////////////////////////////////////////////////////////// 926 926 927 927 proc tropicalCurve (def tp,list #) 928 928 "USAGE: tropicalCurve(tp[,#]); tp list, # optional list 929 ASSUME: tp is list of linear polynomials of the form ax+by+c 930 with integers a, b and a rational number c representing 929 ASSUME: tp is list of linear polynomials of the form ax+by+c 930 with integers a, b and a rational number c representing 931 931 a tropical Laurent polynomial defining a tropical plane curve; 932 alternatively tp can be a polynomial in Q(t)[x,y] defining a 933 tropical plane curve via the valuation map; 934 the basering must have a global monomial ordering, 932 alternatively tp can be a polynomial in Q(t)[x,y] defining a 933 tropical plane curve via the valuation map; 934 the basering must have a global monomial ordering, 935 935 two variables and up to one parameter! 936 RETURN: list, each entry i=1,...,size(l)-1 corresponds to a vertex 936 RETURN: list, each entry i=1,...,size(l)-1 corresponds to a vertex 937 937 in the tropical plane curve defined by tp 938 938 l[i][1] = x-coordinate of the ith vertex 939 939 l[i][2] = y-coordinate of the ith vertex 940 l[i][3] = intmat, if j is an entry in the first row 940 l[i][3] = intmat, if j is an entry in the first row 941 941 of intmat then the ith vertex of 942 the tropical curve is connected to the 942 the tropical curve is connected to the 943 943 jth vertex with multiplicity given 944 944 by the corresponding entry in the second row 945 l[i][4] = list of lists, the first entry of a list is 946 a primitive integer vector defining the direction 947 of an unbounded edge emerging from the ith vertex 948 of the graph, the corresponding second entry in 945 l[i][4] = list of lists, the first entry of a list is 946 a primitive integer vector defining the direction 947 of an unbounded edge emerging from the ith vertex 948 of the graph, the corresponding second entry in 949 949 the list is the multiplicity of the unbounded edge 950 l[i][5] = a polynomial whose monomials mark the vertices 950 l[i][5] = a polynomial whose monomials mark the vertices 951 951 in the Newton polygon corresponding to the entries 952 in tp which take the common minimum at the ith 953 vertex -- if some coefficient a or b of the 954 linear polynomials in the input was negative, 952 in tp which take the common minimum at the ith 953 vertex -- if some coefficient a or b of the 954 linear polynomials in the input was negative, 955 955 then each monomial has to be shifted by 956 956 the values in l[size(l)][3] 957 l[size(l)][1] = list, the entries describe the boundary 957 l[size(l)][1] = list, the entries describe the boundary 958 958 points of the Newton subdivision 959 l[size(l)][2] = list, the entries are pairs of integer 959 l[size(l)][2] = list, the entries are pairs of integer 960 960 vectors defining an interior 961 961 edge of the Newton subdivision 962 l[size(l)][3] = intvec, the monmials occuring in l[i][5] 963 have to be shifted by this vector 964 in order to represent marked 962 l[size(l)][3] = intvec, the monmials occuring in l[i][5] 963 have to be shifted by this vector 964 in order to represent marked 965 965 vertices in the Newton polygon 966 NOTE: here the tropical polynomial is supposed to be the MINIMUM 967 of the linear forms in tp, unless the optional input #[1] 966 NOTE: here the tropical polynomial is supposed to be the MINIMUM 967 of the linear forms in tp, unless the optional input #[1] 968 968 is the string 'max' 969 969 EXAMPLE: example tropicalCurve; shows an example" … … 978 978 ERROR("The basering should have a global monomial ordering, e.g. ring r=(0,t),(x,y),dp;"); 979 979 } 980 // if you insert a single polynomial instead of an ideal 980 // if you insert a single polynomial instead of an ideal 981 981 // representing a tropicalised polynomial, 982 // then we compute first the tropicalisation of this polynomial 982 // then we compute first the tropicalisation of this polynomial 983 983 // -- this feature is not documented in the above help string 984 984 if (typeof(tp)=="poly") 985 985 { 986 // exclude the case that the basering has not precisely 986 // exclude the case that the basering has not precisely 987 987 // one parameter and two indeterminates 988 988 if ((npars(basering)!=1) or (nvars(basering)!=2)) 989 989 { 990 ERROR("The basering should have precisely one parameter and two indeterminates!"); 990 ERROR("The basering should have precisely one parameter and two indeterminates!"); 991 991 } 992 992 poly f=tp; … … 997 997 if (nvars(basering) != 2) 998 998 { 999 ERROR("The basering should have precisely two indeterminates!"); 1000 } 1001 // -1) Exclude the pathological case that the defining 999 ERROR("The basering should have precisely two indeterminates!"); 1000 } 1001 // -1) Exclude the pathological case that the defining 1002 1002 // tropical polynomial has only one term, 1003 1003 // so that the tropical variety is not defined. … … 1007 1007 intmat M[2][1]=0,0; 1008 1008 return(list(list(0,0,M,list(),detropicalise(tp[1])),list(list(leadexp(detropicalise(tp[1]))),list()))); 1009 } 1010 // 0) If the input was a list of linear polynomials, 1009 } 1010 // 0) If the input was a list of linear polynomials, 1011 1011 // then some coefficient of x or y can be negative, 1012 // i.e. the input corresponds to the tropical curve 1012 // i.e. the input corresponds to the tropical curve 1013 1013 // of a Laurent polynomial. In that case we should 1014 // add some ax+by, so that all coefficients are positive. 1014 // add some ax+by, so that all coefficients are positive. 1015 1015 // This does not change the tropical curve. 1016 // however, we have to save (a,b), since the Newton 1016 // however, we have to save (a,b), since the Newton 1017 1017 // polygone has to be shifted by (-a,-b). 1018 1018 poly aa,bb; // koeffizienten … … 1026 1026 { 1027 1027 bb=koeffizienten(tp[i],2); 1028 } 1028 } 1029 1029 } 1030 1030 if ((aa!=0) or (bb!=0)) … … 1035 1035 } 1036 1036 } 1037 // 1) compute the vertices of the tropical curve 1037 // 1) compute the vertices of the tropical curve 1038 1038 // defined by tp and the Newton subdivision 1039 1039 list vtp=verticesTropicalCurve(tp,#); 1040 // if vtp is empty, then the Newton polygone is just 1040 // if vtp is empty, then the Newton polygone is just 1041 1041 // a line segment and constitutes a bunch of lines 1042 1042 // which can be computed by bunchOfLines … … 1045 1045 return(bunchOfLines(tp)); 1046 1046 } 1047 // 2) store all vertices belonging to the ith part of the 1047 // 2) store all vertices belonging to the ith part of the 1048 1048 // Newton subdivision in the list vtp[i] as 4th entry, 1049 1049 // and store those, which are not corners of the ith subdivision polygon 1050 1050 // in vtp[i][6] 1051 poly nwt; 1051 poly nwt; 1052 1052 list boundaryNSD; // stores the boundary of a Newton subdivision 1053 intmat zwsp[2][1]; // used for intermediate storage 1053 intmat zwsp[2][1]; // used for intermediate storage 1054 1054 for (i=1;i<=size(vtp);i++) 1055 1055 { 1056 1056 k=1; 1057 nwt=vtp[i][3]; // the polynomial representing the 1057 nwt=vtp[i][3]; // the polynomial representing the 1058 1058 // ith part of the Newton subdivision 1059 // store the vertices of the ith part of the 1059 // store the vertices of the ith part of the 1060 1060 // Newton subdivision in the list newton 1061 list newton; 1061 list newton; 1062 1062 while (nwt!=0) 1063 1063 { … … 1066 1066 k++; 1067 1067 } 1068 boundaryNSD=findOrientedBoundary(newton);// a list of the vertices 1069 // of the Newton subdivision 1070 // as integer vectors (only those 1071 // on the boundary, and oriented 1068 boundaryNSD=findOrientedBoundary(newton);// a list of the vertices 1069 // of the Newton subdivision 1070 // as integer vectors (only those 1071 // on the boundary, and oriented 1072 1072 // clockwise) 1073 1073 vtp[i][4]=boundaryNSD[1]; 1074 1074 vtp[i][5]=boundaryNSD[2]; 1075 vtp[i][6]=zwsp; // the entries of the first row will denote to which 1076 // vertex the ith one is connected 1077 // and the entries of the second row will denote 1075 vtp[i][6]=zwsp; // the entries of the first row will denote to which 1076 // vertex the ith one is connected 1077 // and the entries of the second row will denote 1078 1078 //with which multiplicity 1079 1079 kill newton; // we kill the superflous list 1080 1080 } 1081 // 3) Next we build for each part of the Newton 1081 // 3) Next we build for each part of the Newton 1082 1082 // subdivision the list of all pairs of vertices on the 1083 1083 // boundary, which are involved, including those which are not corners … … 1096 1096 kill ipairs; 1097 1097 } 1098 // 4) Check for all pairs of verticies in the Newton diagram if they 1098 // 4) Check for all pairs of verticies in the Newton diagram if they 1099 1099 // occur in two different parts of the Newton subdivision 1100 int deleted; // if a pair occurs in two NSD, it can be removed 1100 int deleted; // if a pair occurs in two NSD, it can be removed 1101 1101 // from both - deleted is then set to 1 1102 list inneredges; // contains the list of all pairs contained in two NSD 1102 list inneredges; // contains the list of all pairs contained in two NSD 1103 1103 // - these are inner the edges of NSD 1104 1104 int ggt; 1105 1105 d=1; // counts the inner edges 1106 1106 for (i=1;i<=size(pairs)-1;i++) 1107 { 1107 { 1108 1108 for (j=i+1;j<=size(pairs);j++) 1109 1109 { … … 1112 1112 deleted=0; 1113 1113 for (l=size(pairs[j]);l>=1 and deleted==0;l--) 1114 { 1114 { 1115 1115 if (((pairs[i][k][1]==pairs[j][l][1]) and (pairs[i][k][2]==pairs[j][l][2])) or ((pairs[i][k][1]==pairs[j][l][2]) and (pairs[i][k][2]==pairs[j][l][1]))) 1116 1116 { … … 1118 1118 d++; 1119 1119 ggt=abs(gcd(pairs[i][k][1][1]-pairs[i][k][2][1],pairs[i][k][1][2]-pairs[i][k][2][2])); 1120 zwsp=j,ggt; // and it is recorded that the ith and jth 1120 zwsp=j,ggt; // and it is recorded that the ith and jth 1121 1121 // vertex should be connected with mult ggt 1122 1122 vtp[i][6]=intmatconcat(vtp[i][6],zwsp); 1123 1123 zwsp=i,ggt; 1124 1124 vtp[j][6]=intmatconcat(vtp[j][6],zwsp); 1125 pairs[i]=delete(pairs[i],k); // finally the pair is deleted 1125 pairs[i]=delete(pairs[i],k); // finally the pair is deleted 1126 1126 // from both sets of pairs 1127 1127 pairs[j]=delete(pairs[j],l); … … 1163 1163 } 1164 1164 } 1165 // 6.3) Order the vertices such that passing from one to the next we 1165 // 6.3) Order the vertices such that passing from one to the next we 1166 1166 // travel along the boundary of the Newton polytope clock wise. 1167 1167 boundaryNSD=findOrientedBoundary(vertices); 1168 1168 list orderedvertices=boundaryNSD[1]; 1169 1169 // 7) Find the unbounded edges emerging from a vertex in the tropical curve. 1170 // For this we check the remaining pairs for the ith NSD. 1170 // For this we check the remaining pairs for the ith NSD. 1171 1171 // Each pair is ordered according 1172 // to the order in which the vertices occur in orderedvertices. 1172 // to the order in which the vertices occur in orderedvertices. 1173 1173 // The direction of the 1174 // unbounded edge is then the outward pointing primitive normal 1174 // unbounded edge is then the outward pointing primitive normal 1175 1175 // vector to the vector 1176 1176 // pointing from the first vertex in a pair to the second one. … … 1182 1182 for (i=1;i<=size(pairs);i++) 1183 1183 { 1184 list ubedges; // stores the unbounded edges 1184 list ubedges; // stores the unbounded edges 1185 1185 k=1; // counts the unbounded edges 1186 1186 for (j=1;j<=size(pairs[i]);j++) 1187 1187 { 1188 1188 // computes the position of the vertices in the 1189 pos1=positionInList(orderedvertices,pairs[i][j][1]); 1189 pos1=positionInList(orderedvertices,pairs[i][j][1]); 1190 1190 // pair in the list orderedvertices 1191 pos2=positionInList(orderedvertices,pairs[i][j][2]); 1191 pos2=positionInList(orderedvertices,pairs[i][j][2]); 1192 1192 if (((pos1>pos2) and !((pos1==size(orderedvertices)) and (pos2==1))) or ((pos2==size(orderedvertices)) and (pos1==1))) // reorders them if necessary 1193 1193 { … … 1197 1197 } 1198 1198 // the vector pointing from vertex 1 in the pair to vertex2 1199 normalvector=pairs[i][j][2]-pairs[i][j][1]; 1199 normalvector=pairs[i][j][2]-pairs[i][j][1]; 1200 1200 ggt=gcd(normalvector[1],normalvector[2]); // the gcd of the entries 1201 1201 zw=normalvector[2]; // create the outward pointing normal vector … … 1229 1229 kill ubedges; 1230 1230 } 1231 // 8) Store the computed information for the ith part 1231 // 8) Store the computed information for the ith part 1232 1232 // of the NSD in the list graph[i]. 1233 1233 list graph,gr; … … 1235 1235 { 1236 1236 // the first coordinate of the ith vertex of the tropical curve 1237 gr[1]=vtp[i][1]; 1237 gr[1]=vtp[i][1]; 1238 1238 // the second coordinate of the ith vertex of the tropical curve 1239 gr[2]=vtp[i][2]; 1239 gr[2]=vtp[i][2]; 1240 1240 // to which vertices is the ith vertex of the tropical curve connected 1241 gr[3]=vtp[i][6]; 1242 // the directions unbounded edges emerging from the ith 1241 gr[3]=vtp[i][6]; 1242 // the directions unbounded edges emerging from the ith 1243 1243 // vertex of the trop. curve 1244 gr[4]=vtp[i][7]; 1245 // the vertices of the boundary of the ith part of the NSD 1246 gr[5]=vtp[i][3]; 1244 gr[4]=vtp[i][7]; 1245 // the vertices of the boundary of the ith part of the NSD 1246 gr[5]=vtp[i][3]; 1247 1247 graph[i]=gr; 1248 1248 } … … 1263 1263 } 1264 1264 } 1265 // 10) Finally store the boundary vertices and 1265 // 10) Finally store the boundary vertices and 1266 1266 // the inner edges as last entry in the list graph. 1267 1267 // This represents the NSD. … … 1280 1280 // the coordinates of the first vertex are graph[1][1],graph[1][2]; 1281 1281 graph[1][1],graph[1][2]; 1282 // the first vertex is connected to the vertices 1282 // the first vertex is connected to the vertices 1283 1283 // graph[1][3][1,1..ncols(graph[1][3])] 1284 1284 intmat M=graph[1][3]; 1285 1285 M[1,1..ncols(graph[1][3])]; 1286 // the weights of the edges to these vertices are 1286 // the weights of the edges to these vertices are 1287 1287 // graph[1][3][2,1..ncols(graph[1][3])] 1288 1288 M[2,1..ncols(graph[1][3])]; 1289 1289 // from the first vertex emerge size(graph[1][4]) unbounded edges 1290 1290 size(graph[1][4]); 1291 // the primitive integral direction vector of the first unbounded edge 1291 // the primitive integral direction vector of the first unbounded edge 1292 1292 // of the first vertex 1293 1293 graph[1][4][1][1]; 1294 1294 // the weight of the first unbounded edge of the first vertex 1295 1295 graph[1][4][1][2]; 1296 // the monomials which are part of the Newton subdivision of the first vertex 1296 // the monomials which are part of the Newton subdivision of the first vertex 1297 1297 graph[1][5]; 1298 // connecting the points in graph[size(graph)][1] we get 1298 // connecting the points in graph[size(graph)][1] we get 1299 1299 // the boundary of the Newton polytope 1300 1300 graph[size(graph)][1]; 1301 // an entry in graph[size(graph)][2] is a pair of points 1301 // an entry in graph[size(graph)][2] is a pair of points 1302 1302 // in the Newton polytope bounding an inner edge 1303 1303 graph[size(graph)][2][1]; … … 1308 1308 proc drawTropicalCurve (def f,list #) 1309 1309 "USAGE: drawTropicalCurve(f[,#]); f poly or list, # optional list 1310 ASSUME: f is list of linear polynomials of the form ax+by+c with 1311 integers a, b and a rational number c representing a tropical 1310 ASSUME: f is list of linear polynomials of the form ax+by+c with 1311 integers a, b and a rational number c representing a tropical 1312 1312 Laurent polynomial defining a tropical plane curve; 1313 alternatively f can be a polynomial in Q(t)[x,y] defining 1314 a tropical plane curve via the valuation map; 1315 the basering must have a global monomial ordering, two 1313 alternatively f can be a polynomial in Q(t)[x,y] defining 1314 a tropical plane curve via the valuation map; 1315 the basering must have a global monomial ordering, two 1316 1316 variables and up to one parameter! 1317 1317 RETURN: NONE 1318 NOTE: - the procedure creates the files /tmp/tropicalcurveNUMBER.tex and 1319 /tmp/tropicalcurveNUMBER.ps, where NUMBER is a random four 1320 digit integer; 1318 NOTE: - the procedure creates the files /tmp/tropicalcurveNUMBER.tex and 1319 /tmp/tropicalcurveNUMBER.ps, where NUMBER is a random four 1320 digit integer; 1321 1321 moreover it displays the tropical curve via kghostview; 1322 if you wish to remove all these files from /tmp, 1322 if you wish to remove all these files from /tmp, 1323 1323 call the procedure cleanTmp 1324 1324 @* - edges with multiplicity greater than one carry this multiplicity 1325 1325 @* - if # is empty, then the tropical curve is computed w.r.t. minimum, 1326 if #[1] is the string 'max', then it is computed w.r.t. maximum 1327 @* - if the last optional argument is 'onlytexfile' then only the 1328 latex file is produced; this option should be used if kghostview 1326 if #[1] is the string 'max', then it is computed w.r.t. maximum 1327 @* - if the last optional argument is 'onlytexfile' then only the 1328 latex file is produced; this option should be used if kghostview 1329 1329 is not installed on your system 1330 @* - note that lattice points in the Newton subdivision which are 1331 black correspond to markings of the marked subdivision, 1330 @* - note that lattice points in the Newton subdivision which are 1331 black correspond to markings of the marked subdivision, 1332 1332 while lattice points in grey are not marked 1333 1333 EXAMPLE: example drawTropicalCurve shows an example" … … 1347 1347 if (typeof(f)=="poly") 1348 1348 { 1349 // exclude the case that the basering has not precisely 1349 // exclude the case that the basering has not precisely 1350 1350 // one parameter and two indeterminates 1351 1351 if ((npars(basering)!=1) or (nvars(basering)!=2)) 1352 1352 { 1353 ERROR("The basering should have precisely one parameter and two indeterminates!"); 1353 ERROR("The basering should have precisely one parameter and two indeterminates!"); 1354 1354 } 1355 1355 texf=texPolynomial(f); // write the polynomial over Q(t) … … 1362 1362 texf="\\mbox{\\tt The defining equation was not handed over!}"; 1363 1363 list graph=f; 1364 } 1364 } 1365 1365 else 1366 1366 { // write the tropical polynomial defined by f 1367 1367 if (size(#)==0) 1368 { 1368 { 1369 1369 texf="\\min\\{"; 1370 1370 } … … 1375 1375 for (j=1;j<=size(f);j++) 1376 1376 { 1377 texf=texf+texPolynomial(f[j]); 1377 texf=texf+texPolynomial(f[j]); 1378 1378 if (j<size(f)) 1379 1379 { … … 1384 1384 texf=texf+"\\}"; 1385 1385 } 1386 } 1386 } 1387 1387 list graph=tropicalCurve(f,#); // the graph of the tropical polynomial f 1388 1388 } … … 1402 1402 \\addtolength{\\topmargin}{-\\headheight} 1403 1403 \\addtolength{\\topmargin}{-\\topskip} 1404 \\setlength{\\textheight}{267mm} 1404 \\setlength{\\textheight}{267mm} 1405 1405 \\addtolength{\\textheight}{\\topskip} 1406 1406 \\addtolength{\\textheight}{-\\footskip} 1407 1407 \\addtolength{\\textheight}{-30pt} 1408 \\setlength{\\oddsidemargin}{-1in} 1408 \\setlength{\\oddsidemargin}{-1in} 1409 1409 \\addtolength{\\oddsidemargin}{20mm} 1410 1410 \\setlength{\\evensidemargin}{\\oddsidemargin} 1411 \\setlength{\\textwidth}{170mm} 1411 \\setlength{\\textwidth}{170mm} 1412 1412 1413 1413 \\begin{document} 1414 1414 \\parindent0cm 1415 1415 \\begin{center} 1416 \\large\\bf The Tropicalisation of 1416 \\large\\bf The Tropicalisation of 1417 1417 1418 1418 \\bigskip … … 1438 1438 1439 1439 \\begin{center} 1440 "+texDrawNewtonSubdivision(graph,#)+" 1440 "+texDrawNewtonSubdivision(graph,#)+" 1441 1441 \\end{center} 1442 1442 \\end{document}"; … … 1445 1445 int rdnum=random(1000,9999); 1446 1446 write(":w /tmp/tropicalcurve"+string(rdnum)+".tex",TEXBILD); 1447 system("sh","cd /tmp; latex /tmp/tropicalcurve"+string(rdnum)+".tex; dvips /tmp/tropicalcurve"+string(rdnum)+".dvi -o; /bin/rm tropicalcurve"+string(rdnum)+".log; /bin/rm tropicalcurve"+string(rdnum)+".aux; /bin/rm tropicalcurve"+string(rdnum)+".ps?; /bin/rm tropicalcurve"+string(rdnum)+".dvi; kghostview tropicalcurve"+string(rdnum)+".ps &"); 1447 system("sh","cd /tmp; latex /tmp/tropicalcurve"+string(rdnum)+".tex; dvips /tmp/tropicalcurve"+string(rdnum)+".dvi -o; /bin/rm tropicalcurve"+string(rdnum)+".log; /bin/rm tropicalcurve"+string(rdnum)+".aux; /bin/rm tropicalcurve"+string(rdnum)+".ps?; /bin/rm tropicalcurve"+string(rdnum)+".dvi; kghostview tropicalcurve"+string(rdnum)+".ps &"); 1448 1448 } 1449 1449 else … … 1472 1472 proc drawNewtonSubdivision (def f,list #) 1473 1473 "USAGE: drawTropicalCurve(f[,#]); f poly, # optional list 1474 ASSUME: f is list of linear polynomials of the form ax+by+c with integers 1475 a, b and a rational number c representing a tropical Laurent 1474 ASSUME: f is list of linear polynomials of the form ax+by+c with integers 1475 a, b and a rational number c representing a tropical Laurent 1476 1476 polynomial defining a tropical plane curve; 1477 alternatively f can be a polynomial in Q(t)[x,y] defining a tropical 1478 plane curve via the valuation map; 1479 the basering must have a global monomial ordering, two variables 1477 alternatively f can be a polynomial in Q(t)[x,y] defining a tropical 1478 plane curve via the valuation map; 1479 the basering must have a global monomial ordering, two variables 1480 1480 and up to one parameter! 1481 1481 RETURN: NONE 1482 NOTE: - the procedure creates the files /tmp/newtonsubdivisionNUMBER.tex, 1483 and /tmp/newtonsubdivisionNUMBER.ps, where NUMBER is a random 1484 four digit integer; 1482 NOTE: - the procedure creates the files /tmp/newtonsubdivisionNUMBER.tex, 1483 and /tmp/newtonsubdivisionNUMBER.ps, where NUMBER is a random 1484 four digit integer; 1485 1485 moreover it desplays the tropical curve defined by f via kghostview; 1486 if you wish to remove all these files from /tmp, call the procedure 1486 if you wish to remove all these files from /tmp, call the procedure 1487 1487 cleanTmp; 1488 @* if # is empty, then the tropical curve is computed w.r.t. minimum, 1489 if #[1] is the string 'max', then it is computed w.r.t. maximum 1490 @* - note that lattice points in the Newton subdivision which are black 1491 correspond to markings of the marked subdivision, while lattice 1488 @* if # is empty, then the tropical curve is computed w.r.t. minimum, 1489 if #[1] is the string 'max', then it is computed w.r.t. maximum 1490 @* - note that lattice points in the Newton subdivision which are black 1491 correspond to markings of the marked subdivision, while lattice 1492 1492 points in grey are not marked 1493 1493 EXAMPLE: example drawNewtonSubdivision; shows an example" … … 1503 1503 { // write the tropical polynomial defined by f 1504 1504 if (size(#)==0) 1505 { 1505 { 1506 1506 texf="\\min\\{"; 1507 1507 } … … 1512 1512 for (j=1;j<=size(f);j++) 1513 1513 { 1514 texf=texf+texPolynomial(f[j]); 1514 texf=texf+texPolynomial(f[j]); 1515 1515 if (j<size(f)) 1516 1516 { … … 1521 1521 texf=texf+"\\}"; 1522 1522 } 1523 } 1523 } 1524 1524 list graph=tropicalCurve(f,#); // the graph of the tropical polynomial f 1525 1525 } … … 1529 1529 \\parindent0cm 1530 1530 \\begin{center} 1531 \\large\\bf The Newtonsubdivison of 1531 \\large\\bf The Newtonsubdivison of 1532 1532 \\begin{displaymath} 1533 1533 f="+texf+" … … 1537 1537 1538 1538 \\begin{center} 1539 "+texDrawNewtonSubdivision(graph)+ 1539 "+texDrawNewtonSubdivision(graph)+ 1540 1540 " \\end{center} 1541 1541 … … 1543 1543 int rdnum=random(1000,9999); 1544 1544 write(":w /tmp/newtonsubdivision"+string(rdnum)+".tex",TEXBILD); 1545 system("sh","cd /tmp; latex /tmp/newtonsubdivision"+string(rdnum)+".tex; dvips /tmp/newtonsubdivision"+string(rdnum)+".dvi -o; /bin/rm newtonsubdivision"+string(rdnum)+".log; /bin/rm newtonsubdivision"+string(rdnum)+".aux; /bin/rm newtonsubdivision"+string(rdnum)+".ps?; /bin/rm newtonsubdivision"+string(rdnum)+".dvi; kghostview newtonsubdivision"+string(rdnum)+".ps &"); 1545 system("sh","cd /tmp; latex /tmp/newtonsubdivision"+string(rdnum)+".tex; dvips /tmp/newtonsubdivision"+string(rdnum)+".dvi -o; /bin/rm newtonsubdivision"+string(rdnum)+".log; /bin/rm newtonsubdivision"+string(rdnum)+".aux; /bin/rm newtonsubdivision"+string(rdnum)+".ps?; /bin/rm newtonsubdivision"+string(rdnum)+".dvi; kghostview newtonsubdivision"+string(rdnum)+".ps &"); 1546 1546 // return(TEXBILD); 1547 1547 } … … 1568 1568 proc tropicalJInvariant (def f,list #) 1569 1569 "USAGE: tropicalJInvariant(f[,#]); f poly or list, # optional list 1570 ASSUME: f is list of linear polynomials of the form ax+by+c with integers 1571 a, b and a rational number c representing a tropical Laurent 1570 ASSUME: f is list of linear polynomials of the form ax+by+c with integers 1571 a, b and a rational number c representing a tropical Laurent 1572 1572 polynomial defining a tropical plane curve; 1573 alternatively f can be a polynomial in Q(t)[x,y] defining a 1574 tropical plane curve via the valuation map; 1575 @* the basering must have a global monomial ordering, two variables 1573 alternatively f can be a polynomial in Q(t)[x,y] defining a 1574 tropical plane curve via the valuation map; 1575 @* the basering must have a global monomial ordering, two variables 1576 1576 and up to one parameter! 1577 RETURN: number, if the graph underlying the tropical curve has precisely 1578 one loop then its weighted lattice length is returned, 1577 RETURN: number, if the graph underlying the tropical curve has precisely 1578 one loop then its weighted lattice length is returned, 1579 1579 otherwise the result will be -1 1580 NOTE: - if the tropical curve is elliptic and its embedded graph has 1581 precisely one loop, then the weigthed lattice length of 1580 NOTE: - if the tropical curve is elliptic and its embedded graph has 1581 precisely one loop, then the weigthed lattice length of 1582 1582 the loop is its tropical j-invariant 1583 @* - the procedure checks if the embedded graph of the tropical 1584 curve has genus one, but it does NOT check if the loop can 1585 be resolved, so that the curve is not a proper tropical 1586 elliptic curve 1587 @* - if the embedded graph of a tropical elliptic curve has more 1588 than one loop, then all but one can be resolved, but this is 1589 not observed by this procedure, so it will not compute 1583 @* - the procedure checks if the embedded graph of the tropical 1584 curve has genus one, but it does NOT check if the loop can 1585 be resolved, so that the curve is not a proper tropical 1586 elliptic curve 1587 @* - if the embedded graph of a tropical elliptic curve has more 1588 than one loop, then all but one can be resolved, but this is 1589 not observed by this procedure, so it will not compute 1590 1590 the j-invariant 1591 1591 @* - if # is empty, then the tropical curve is computed w.r.t. minimum, 1592 if #[1] is the string 'max', then it is computed w.r.t. maximum 1593 @* - the tropicalJInvariant of a plane tropical cubic is the 1594 'cycle length' of the cubic as introduced in the paper: 1595 Eric Katz, Hannah Markwig, Thomas Markwig: The j-invariant 1592 if #[1] is the string 'max', then it is computed w.r.t. maximum 1593 @* - the tropicalJInvariant of a plane tropical cubic is the 1594 'cycle length' of the cubic as introduced in the paper: 1595 Eric Katz, Hannah Markwig, Thomas Markwig: The j-invariant 1596 1596 of a cubic tropical plane curve. 1597 1597 EXAMPLE: example tropicalJInvariant; shows an example" … … 1607 1607 { 1608 1608 if (typeof(f[1])=="list") 1609 { 1609 { 1610 1610 list graph=f; 1611 1611 } … … 1619 1619 { 1620 1620 ERROR("This is no valid input."); 1621 } 1621 } 1622 1622 } 1623 1623 } … … 1636 1636 genus=-genus/2; // we have counted each bounded edge twice 1637 1637 genus=genus+size(graph); // the genus is 1-#bounded_edges+#vertices 1638 // 3) if the embedded graph has not genus one, 1638 // 3) if the embedded graph has not genus one, 1639 1639 // we cannot compute the j-invariant 1640 1640 if(genus!=1) … … 1648 1648 else 1649 1649 { 1650 intmat nullmat[2][1]; // used to set 1651 // 4) find a vertex which has only one bounded edge, 1652 // if none exists zero is returned, 1650 intmat nullmat[2][1]; // used to set 1651 // 4) find a vertex which has only one bounded edge, 1652 // if none exists zero is returned, 1653 1653 // otherwise the number of the vertex in the list graph 1654 int nonloopvertex=findNonLoopVertex(graph); 1654 int nonloopvertex=findNonLoopVertex(graph); 1655 1655 int dv; //checks if vert. has been found to which nonloopvertex is connected 1656 intmat delvert; // takes for a moment graph[i][3] of the vertex 1656 intmat delvert; // takes for a moment graph[i][3] of the vertex 1657 1657 // to which nonloopvertex is connected 1658 // 5) delete successively vertices in the graph which 1658 // 5) delete successively vertices in the graph which 1659 1659 // have only one bounded edge 1660 1660 while (nonloopvertex>0) 1661 1661 { 1662 // find the only vertex to which the nonloopvertex 1662 // find the only vertex to which the nonloopvertex 1663 1663 // is connected, when it is found 1664 1664 // delete the connection in graph[i][3] and set dv=1 … … 1673 1673 { 1674 1674 delvert=graph[i][3]; 1675 delvert=intmatcoldelete(delvert,j); // delete the connection (note 1675 delvert=intmatcoldelete(delvert,j); // delete the connection (note 1676 1676 // there must have been two!) 1677 1677 dv=1; … … 1681 1681 } 1682 1682 } 1683 graph[nonloopvertex][3]=nullmat; // the only connection of nonloopvertex 1683 graph[nonloopvertex][3]=nullmat; // the only connection of nonloopvertex 1684 1684 // is killed 1685 nonloopvertex=findNonLoopVertex(graph); // find the next vertex 1685 nonloopvertex=findNonLoopVertex(graph); // find the next vertex 1686 1686 // which has only one edge 1687 1687 } … … 1689 1689 intvec loop,weights; // encodes the loop and the edges 1690 1690 i=1; 1691 // start by finding some vertex which belongs to the loop 1692 while (loop==0) 1691 // start by finding some vertex which belongs to the loop 1692 while (loop==0) 1693 1693 { 1694 1694 // if graph[i][3] of a vertex in the loop has 2 columns, all others have 1 1695 if (ncols(graph[i][3])==1) 1695 if (ncols(graph[i][3])==1) 1696 1696 { 1697 1697 i++; … … 1699 1699 else 1700 1700 { 1701 loop[1]=i; // a starting vertex is found 1702 loop[2]=graph[i][3][1,1]; // it is connected to vertex with this number 1701 loop[1]=i; // a starting vertex is found 1702 loop[2]=graph[i][3][1,1]; // it is connected to vertex with this number 1703 1703 weights[2]=graph[i][3][2,1]; // and the edge has this weight 1704 1704 } … … 1708 1708 while (j!=i) // the loop ends with the same vertex with which it starts 1709 1709 { 1710 // the first row of graph[j][3] has two entries 1710 // the first row of graph[j][3] has two entries 1711 1711 // corresponding to the two vertices 1712 // to which the active vertex j is connected; 1712 // to which the active vertex j is connected; 1713 1713 // one is loop[k-1], i.e. the one which 1714 1714 // precedes j in the loop; we have to choose the other one 1715 if (graph[j][3][1,1]==loop[k-1]) 1715 if (graph[j][3][1,1]==loop[k-1]) 1716 1716 { 1717 1717 loop[k+1]=graph[j][3][1,2]; … … 1724 1724 } 1725 1725 j=loop[k+1]; // set loop[k+1] the new active vertex 1726 k++; 1727 } 1726 k++; 1727 } 1728 1728 // 7) compute for each edge in the loop the lattice length 1729 poly xcomp,ycomp; // the x- and y-components of the vectors 1729 poly xcomp,ycomp; // the x- and y-components of the vectors 1730 1730 // connecting two vertices of the loop 1731 number nenner; // the product of the denominators of 1731 number nenner; // the product of the denominators of 1732 1732 // the x- and y-components 1733 1733 number jinvariant; // the j-invariant 1734 int eins,zwei,ggt; 1734 int eins,zwei,ggt; 1735 1735 for (i=1;i<=size(loop)-1;i++) // compute the lattice length for each edge 1736 1736 { 1737 xcomp=graph[loop[i]][1]-graph[loop[i+1]][1]; 1738 ycomp=graph[loop[i]][2]-graph[loop[i+1]][2]; 1737 xcomp=graph[loop[i]][1]-graph[loop[i+1]][1]; 1738 ycomp=graph[loop[i]][2]-graph[loop[i+1]][2]; 1739 1739 nenner=denominator(leadcoef(xcomp))*denominator(leadcoef(ycomp)); 1740 execute("eins="+string(numerator(leadcoef(nenner*xcomp)))+";"); 1741 execute("zwei="+string(numerator(leadcoef(nenner*ycomp)))+";"); 1740 execute("eins="+string(numerator(leadcoef(nenner*xcomp)))+";"); 1741 execute("zwei="+string(numerator(leadcoef(nenner*ycomp)))+";"); 1742 1742 ggt=gcd(eins,zwei); // the lattice length is the "gcd" 1743 1743 // of the x-component and the y-component 1744 jinvariant=jinvariant+ggt/(nenner*weights[i+1]); // divided by the 1744 jinvariant=jinvariant+ggt/(nenner*weights[i+1]); // divided by the 1745 1745 // weight of the edge 1746 1746 } 1747 return(jinvariant); 1747 return(jinvariant); 1748 1748 } 1749 1749 } … … 1759 1759 // the curve can have arbitrary degree 1760 1760 tropicalJInvariant(t*(x7+y7+1)+1/t*(x4+y4+x2+y2+x3y+xy3)+1/t7*x2y2); 1761 // the procedure does not realise, if the embedded graph of the tropical 1761 // the procedure does not realise, if the embedded graph of the tropical 1762 1762 // curve has a loop that can be resolved 1763 1763 tropicalJInvariant(1+x+y+xy+tx2y+txy2); 1764 1764 // but it does realise, if the curve has no loop at all ... 1765 1765 tropicalJInvariant(x+y+1); 1766 // or if the embedded graph has more than one loop - even if only one 1766 // or if the embedded graph has more than one loop - even if only one 1767 1767 // cannot be resolved 1768 1768 tropicalJInvariant(1+x+y+xy+tx2y+txy2+t3x5+t3y5+tx2y2+t2xy4+t2yx4); … … 1773 1773 proc weierstrassForm (poly f,list #) 1774 1774 "USAGE: weierstrassForm(wf[,#]); wf poly, # list 1775 ASSUME: wf is a a polynomial whose Newton polygon has precisely one 1776 interior lattice point, so that it defines an elliptic curve 1775 ASSUME: wf is a a polynomial whose Newton polygon has precisely one 1776 interior lattice point, so that it defines an elliptic curve 1777 1777 on the toric surface corresponding to the Newton polygon 1778 1778 RETURN: poly, the Weierstrass normal form of the polynomial … … 1780 1780 to Fernando Rodriguez Villegas, villegas@math.utexas.edu 1781 1781 @* - the characteristic of the base field should not be 2 or 3 1782 @* - if an additional argument # is given, a simplified Weierstrass 1782 @* - if an additional argument # is given, a simplified Weierstrass 1783 1783 form is computed 1784 1784 EXAMPLE: example weierstrassForm; shows an example" … … 1841 1841 1842 1842 proc jInvariant (poly f,list #) 1843 "USAGE: jInvariant(f[,#]); f poly, # list 1844 ASSUME: - f is a a polynomial whose Newton polygon has precisely one 1845 interior lattice point, so that it defines an elliptic curve 1843 "USAGE: jInvariant(f[,#]); f poly, # list 1844 ASSUME: - f is a a polynomial whose Newton polygon has precisely one 1845 interior lattice point, so that it defines an elliptic curve 1846 1846 on the toric surface corresponding to the Newton polygon 1847 @* - it the optional argument # is present the base field should be 1848 Q(t) and the optional argument should be one of the following 1847 @* - it the optional argument # is present the base field should be 1848 Q(t) and the optional argument should be one of the following 1849 1849 strings: 1850 @* 'ord' : then the return value is of type integer, 1850 @* 'ord' : then the return value is of type integer, 1851 1851 namely the order of the j-invariant 1852 @* 'split' : then the return value is a list of two polynomials, 1852 @* 'split' : then the return value is a list of two polynomials, 1853 1853 such that the quotient of these two is the j-invariant 1854 1854 RETURN: poly, the j-invariant of the elliptic curve defined by poly 1855 NOTE: the characteristic of the base field should not be 2 or 3, 1855 NOTE: the characteristic of the base field should not be 2 or 3, 1856 1856 unless the input is a plane cubic 1857 1857 EXAMPLE: example jInvariant; shows an example" … … 1879 1879 echo=2; 1880 1880 ring r=(0,t),(x,y),dp; 1881 // jInvariant computes the j-invariant of a cubic 1881 // jInvariant computes the j-invariant of a cubic 1882 1882 jInvariant(x+y+x2y+y3+1/t*xy); 1883 // if the ground field has one parameter t, then we can instead 1883 // if the ground field has one parameter t, then we can instead 1884 1884 // compute the order of the j-invariant 1885 1885 jInvariant(x+y+x2y+y3+1/t*xy,"ord"); … … 1889 1889 poly h=x22y11+x19y10+x17y9+x16y9+x12y7+x9y6+x7y5+x2y3+x14y8; 1890 1890 // its j-invariant is 1891 jInvariant(h); 1891 jInvariant(h); 1892 1892 } 1893 1893 … … 1908 1908 @* l[6] = a list containing the vertices of the tropical conic f 1909 1909 @* l[7] = a list containing lists with vertices of the tangents 1910 @* l[8] = a string which contains the latex-code to draw the 1910 @* l[8] = a string which contains the latex-code to draw the 1911 1911 tropical conic and its tropicalised tangents 1912 1912 @* l[9] = if # is non-empty, this is the same data for the dual … … 1932 1932 ring LINRING=(0,t),(x,y,a(1..6)),lp; 1933 1933 list points=imap(BASERING,points); 1934 ideal I; // the ideal will contain the linear equations given by the conic 1934 ideal I; // the ideal will contain the linear equations given by the conic 1935 1935 // and the points 1936 1936 for (i=1;i<=5;i++) … … 1953 1953 ring tRING=0,t,ls; 1954 1954 list pointdenom=imap(BASERING,pointdenom); 1955 list pointnum=imap(BASERING,pointnum); 1955 list pointnum=imap(BASERING,pointnum); 1956 1956 intvec pointcoordinates; 1957 1957 for (i=1;i<=size(pointdenom);i++) … … 2029 2029 We consider the concic through the following five points: 2030 2030 \\begin{displaymath} 2031 "; 2031 "; 2032 2032 string texf=texDrawTropical(graphf,list("",scalefactor)); 2033 2033 for (i=1;i<=size(points);i++) … … 2067 2067 \\end{document}"; 2068 2068 setring BASERING; 2069 // If # non-empty, compute the dual conic and the tangents 2070 // through the dual points 2069 // If # non-empty, compute the dual conic and the tangents 2070 // through the dual points 2071 2071 // corresponding to the tangents of the given conic. 2072 2072 if (size(#)>0) 2073 2073 { 2074 2074 list dualpoints; 2075 for (i=1;i<=size(points);i++) 2075 for (i=1;i<=size(points);i++) 2076 2076 { 2077 2077 dualpoints[i]=list(leadcoef(tangents[i])/substitute(tangents[i],x,0,y,0),leadcoef(tangents[i]-lead(tangents[i]))/substitute(tangents[i],x,0,y,0)); … … 2097 2097 // conic[2] is the equation of the conic f passing through the five points 2098 2098 conic[2]; 2099 // conic[3] is a list containing the equations of the tangents 2099 // conic[3] is a list containing the equations of the tangents 2100 2100 // through the five points 2101 2101 conic[3]; 2102 2102 // conic[4] is an ideal representing the tropicalisation of the conic f 2103 2103 conic[4]; 2104 // conic[5] is a list containing the tropicalisation 2104 // conic[5] is a list containing the tropicalisation 2105 2105 // of the five tangents in conic[3] 2106 2106 conic[5]; 2107 // conic[6] is a list containing the vertices of the tropical conic 2107 // conic[6] is a list containing the vertices of the tropical conic 2108 2108 conic[6]; 2109 2109 // conic[7] is a list containing the vertices of the five tangents 2110 2110 conic[7]; 2111 // conic[8] contains the latex code to draw the tropical conic and 2112 // its tropicalised tangents; it can written in a file, processed and 2113 // displayed via kghostview 2114 write(":w /tmp/conic.tex",conic[8]); 2115 system("sh","cd /tmp; latex /tmp/conic.tex; dvips /tmp/conic.dvi -o; 2111 // conic[8] contains the latex code to draw the tropical conic and 2112 // its tropicalised tangents; it can written in a file, processed and 2113 // displayed via kghostview 2114 write(":w /tmp/conic.tex",conic[8]); 2115 system("sh","cd /tmp; latex /tmp/conic.tex; dvips /tmp/conic.dvi -o; 2116 2116 kghostview conic.ps &"); 2117 // with an optional argument the same information for the dual conic is computed 2117 // with an optional argument the same information for the dual conic is computed 2118 2118 // and saved in conic[9] 2119 2119 conic=conicWithTangents(points,1); 2120 2120 conic[9][2]; // the equation of the dual conic 2121 2121 } 2122 2122 2123 2123 /////////////////////////////////////////////////////////////////////////////// 2124 2124 /// Procedures concerned with tropicalisation … … 2129 2129 ASSUME: f is a polynomial in Q(t)[x_1,...,x_n] 2130 2130 RETURN: list, the linear forms of the tropicalisation of f 2131 NOTE: if # is empty, then the valuation of t will be 1, 2132 @* if # is the string 'max' it will be -1; 2133 @* the latter supposes that we consider the maximum of the 2131 NOTE: if # is empty, then the valuation of t will be 1, 2132 @* if # is the string 'max' it will be -1; 2133 @* the latter supposes that we consider the maximum of the 2134 2134 computed linear forms, the former that we consider their minimum 2135 2135 EXAMPLE: example tropicalise; shows an example" … … 2154 2154 { 2155 2155 tropicalf[i]=tropicalf[i]+exp[j]*var(j); 2156 } 2156 } 2157 2157 f=f-lead(f); 2158 2158 } … … 2194 2194 ///////////////////////////////////////////////////////////////////////// 2195 2195 2196 proc tInitialForm (poly f, intvec w) 2196 proc tInitialForm (poly f, intvec w) 2197 2197 "USAGE: tInitialForm(f,w); f a polynomial, w an integer vector 2198 2198 ASSUME: f is a polynomial in Q[t,x_1,...,x_n] and w=(w_0,w_1,...,w_n) 2199 2199 RETURN: poly, the t-initialform of f(t,x) w.r.t. w evaluated at t=1 2200 NOTE: the t-initialform is the sum of the terms with MAXIMAL 2200 NOTE: the t-initialform is the sum of the terms with MAXIMAL 2201 2201 weighted order w.r.t. w 2202 2202 EXAMPLE: example tInitialForm; shows an example" … … 2208 2208 // do the same for the remaining part of f and compare the results 2209 2209 // keep only the smallest ones 2210 int vglgewicht; 2211 f=f-lead(f); 2210 int vglgewicht; 2211 f=f-lead(f); 2212 2212 while (f!=0) 2213 2213 { … … 2224 2224 initialf=initialf+lead(f); 2225 2225 } 2226 } 2226 } 2227 2227 f=f-lead(f); 2228 2228 } … … 2244 2244 proc tInitialIdeal (ideal i,intvec w,list #) 2245 2245 "USAGE: tInitialIdeal(i,w); i ideal, w intvec 2246 ASSUME: i is an ideal in Q[t,x_1,...,x_n] and w=(w_0,...,w_n) 2246 ASSUME: i is an ideal in Q[t,x_1,...,x_n] and w=(w_0,...,w_n) 2247 2247 RETURN: ideal ini, the t-initial ideal of i with respect to w" 2248 2248 { 2249 2249 // THE PROCEDURE WILL BE CALLED FROM OTHER PROCEDURES INSIDE THIS LIBRARY; 2250 // IN THIS CASE THE VARIABLE t WILL INDEED BE THE LAST VARIABLE INSTEAD OF 2250 // IN THIS CASE THE VARIABLE t WILL INDEED BE THE LAST VARIABLE INSTEAD OF 2251 2251 // THE FIRST, 2252 2252 // AND WE THEREFORE HAVE TO MOVE IT BACK TO THE FRONT! … … 2272 2272 // ... and compute a standard basis with 2273 2273 // respect to the homogenised ordering defined by w. Since the generators 2274 // of i will be homogeneous it we can instead take the ordering wp 2275 // with the weightvector (0,w) replaced by (M,...,M)+(0,w) for some 2276 // large M, so that all entries are positive 2277 int M=-minInIntvec(w)[1]+1; // find M such that w[j]+M is 2274 // of i will be homogeneous it we can instead take the ordering wp 2275 // with the weightvector (0,w) replaced by (M,...,M)+(0,w) for some 2276 // large M, so that all entries are positive 2277 int M=-minInIntvec(w)[1]+1; // find M such that w[j]+M is 2278 2278 // strictly positive for all j 2279 2279 intvec whomog=M; … … 2283 2283 } 2284 2284 execute("ring WEIGHTRING=("+charstr(basering)+"),("+varstr(basering)+"),(wp("+string(whomog)+"));"); 2285 // map i to the new ring and compute a GB of i, then dehomogenise i, 2286 // so that we can be sure, that the 2285 // map i to the new ring and compute a GB of i, then dehomogenise i, 2286 // so that we can be sure, that the 2287 2287 // initial forms of the generators generate the initial ideal 2288 2288 ideal i=subst(groebner(imap(HOMOGRING,i)),@s,1); … … 2538 2538 proc texDrawBasic (list texdraw) 2539 2539 "USAGE: texDrawBasic(texdraw); list texdraw 2540 ASSUME: texdraw is a list of strings representing texdraw commands 2541 (as produced by texDrawTropical) which should be embedded into 2540 ASSUME: texdraw is a list of strings representing texdraw commands 2541 (as produced by texDrawTropical) which should be embedded into 2542 2542 a texdraw environment 2543 2543 RETURN: string, a texdraw environment enclosing the input … … 2559 2559 \\end{texdraw}"; 2560 2560 return(texdrawtp); 2561 } 2561 } 2562 2562 example 2563 2563 { … … 2576 2576 ASSUME: graph is the output of tropicalCurve 2577 2577 RETURN: string, the texdraw code of the tropical plane curve encoded by graph 2578 NOTE: - if the list # is non-empty, the first entry should be a string; 2579 if this string is 'max', then the tropical curve is considered 2580 with respect to the maximum; otherwise the curve is considered 2581 with respect to the minimum and the string can be used to insert 2578 NOTE: - if the list # is non-empty, the first entry should be a string; 2579 if this string is 'max', then the tropical curve is considered 2580 with respect to the maximum; otherwise the curve is considered 2581 with respect to the minimum and the string can be used to insert 2582 2582 further texdraw commands (e.g. to have a lighter image as when called 2583 from inside conicWithTangents); 2584 @* - the procedure computes a scalefactor for the texdraw command which 2585 should help to display the curve in the right way; this may, 2586 however, be a bad idea if several texDrawTropical outputs are 2587 put together to form one image; the scalefactor can be prescribed 2583 from inside conicWithTangents); 2584 @* - the procedure computes a scalefactor for the texdraw command which 2585 should help to display the curve in the right way; this may, 2586 however, be a bad idea if several texDrawTropical outputs are 2587 put together to form one image; the scalefactor can be prescribed 2588 2588 by a second optional entry of type poly 2589 2589 @* - the list # is optional and may as well be empty … … 2591 2591 { 2592 2592 int i,j; 2593 // deal first with the pathological case that 2593 // deal first with the pathological case that 2594 2594 // the input polynomial was a monomial 2595 // and does therefore not define a tropical curve, 2596 // and check if the Newton polytope is 2595 // and does therefore not define a tropical curve, 2596 // and check if the Newton polytope is 2597 2597 // a line segment so that the curve defines a bunch of lines 2598 2598 int bunchoflines; 2599 2599 // if the boundary of the Newton polytope consists of a single point 2600 if (size(graph[size(graph)][1])==1) 2600 if (size(graph[size(graph)][1])==1) 2601 2601 { 2602 2602 return(string()); … … 2611 2611 } 2612 2612 // then the Newton polytope is a line segment 2613 if ((size(graph[size(graph)][1])-size(syz(M)))==1) 2613 if ((size(graph[size(graph)][1])-size(syz(M)))==1) 2614 2614 { 2615 2615 bunchoflines=1; … … 2618 2618 // go on with the case that a tropical curve is defined 2619 2619 if (size(#)==0) 2620 { 2620 { 2621 2621 string texdrawtp=" 2622 2622 … … 2626 2626 { 2627 2627 if ((#[1]!="max") and (#[1]!="")) 2628 { 2628 { 2629 2629 string texdrawtp=#[1]; 2630 2630 } … … 2674 2674 nachkomma++; 2675 2675 } 2676 } 2677 // if the scalefactor is < 1/100, then we should rather scale the 2676 } 2677 // if the scalefactor is < 1/100, then we should rather scale the 2678 2678 // coordinates directly, since otherwise texdraw gets into trouble 2679 2679 if (nachkomma > 2) … … 2684 2684 sf=sf*10; 2685 2685 } 2686 } 2686 } 2687 2687 texdrawtp=texdrawtp+" 2688 2688 \\relunitscale "+ decimal(scalefactor,nachkomma); … … 2697 2697 { 2698 2698 // if the curve is a bunch of lines no vertex has to be drawn 2699 if (bunchoflines==0) 2699 if (bunchoflines==0) 2700 2700 { 2701 2701 texdrawtp=texdrawtp+" … … 2703 2703 } 2704 2704 // draw the bounded edges emerging from the ith vertex 2705 for (j=1;j<=ncols(graph[i][3]);j++) 2706 { 2707 // don't draw it twice - and if there is only one vertex 2705 for (j=1;j<=ncols(graph[i][3]);j++) 2706 { 2707 // don't draw it twice - and if there is only one vertex 2708 2708 // and graph[i][3][1,1] is thus 0, nothing is done 2709 if (i<graph[i][3][1,j]) 2710 { 2709 if (i<graph[i][3][1,j]) 2710 { 2711 2711 texdrawtp=texdrawtp+" 2712 2712 \\move ("+decimal((graph[i][1]-centerx)/sf)+" "+decimal((graph[i][2]-centery)/sf)+") \\lvec ("+decimal((graph[graph[i][3][1,j]][1]-centerx)/sf)+" "+decimal((graph[graph[i][3][1,j]][2]-centery)/sf)+")"; 2713 2713 // if the multiplicity is more than one, denote it in the picture 2714 if (graph[i][3][2,j]>1) 2714 if (graph[i][3][2,j]>1) 2715 2715 { 2716 2716 texdrawtp=texdrawtp+" … … 2721 2721 // draw the unbounded edges emerging from the ith vertex 2722 2722 // they should not be too long 2723 for (j=1;j<=size(graph[i][4]);j++) 2724 { 2723 for (j=1;j<=size(graph[i][4]);j++) 2724 { 2725 2725 relxy=shorten(list(decimal((3*graph[i][4][j][1][1]/scalefactor)*sf),decimal((3*graph[i][4][j][1][2]/scalefactor)*sf),string(5*sf/2))); 2726 2726 texdrawtp=texdrawtp+" 2727 2727 \\move ("+decimal((graph[i][1]-centerx)/sf)+" "+decimal((graph[i][2]-centery)/sf)+") \\rlvec ("+relxy[1]+" "+relxy[2]+")"; 2728 2728 // if the multiplicity is more than one, denote it in the picture 2729 if (graph[i][4][j][2]>1) 2729 if (graph[i][4][j][2]>1) 2730 2730 { 2731 2731 texdrawtp=texdrawtp+" … … 2805 2805 poly scalefactor=minOfPolys(list(12/leadcoef(maxx),12/leadcoef(maxy))); 2806 2806 if (scalefactor<1) 2807 { 2807 { 2808 2808 subdivision=subdivision+" 2809 2809 \\relunitscale"+ decimal(scalefactor); … … 2813 2813 { 2814 2814 subdivision=subdivision+" 2815 \\move ("+string(boundary[i][1])+" "+string(boundary[i][2])+") 2815 \\move ("+string(boundary[i][1])+" "+string(boundary[i][2])+") 2816 2816 \\lvec ("+string(boundary[i+1][1])+" "+string(boundary[i+1][2])+")"; 2817 } 2817 } 2818 2818 subdivision=subdivision+" 2819 \\move ("+string(boundary[size(boundary)][1])+" "+string(boundary[size(boundary)][2])+") 2819 \\move ("+string(boundary[size(boundary)][1])+" "+string(boundary[size(boundary)][2])+") 2820 2820 \\lvec ("+string(boundary[1][1])+" "+string(boundary[1][2])+") 2821 2821 … … 2824 2824 { 2825 2825 subdivision=subdivision+" 2826 \\move ("+string(inneredges[i][1][1])+" "+string(inneredges[i][1][2])+") 2826 \\move ("+string(inneredges[i][1][1])+" "+string(inneredges[i][1][2])+") 2827 2827 \\lvec ("+string(inneredges[i][2][1])+" "+string(inneredges[i][2][2])+")"; 2828 2828 } … … 2844 2844 } 2845 2845 } 2846 // deal with the pathological cases 2846 // deal with the pathological cases 2847 2847 if (size(boundary)==1) // then the Newton polytope is a point 2848 2848 { … … 2899 2899 { 2900 2900 subdivision=subdivision+" 2901 \\move ("+string(markings[i][1])+" "+string(markings[i][2])+") 2901 \\move ("+string(markings[i][1])+" "+string(markings[i][2])+") 2902 2902 \\fcir f:0 r:"+decimal(2/(8*scalefactor),size(string(int(scalefactor)))+1); 2903 2903 } 2904 2904 // enclose subdivision in the texdraw environment 2905 string texsubdivision=" 2905 string texsubdivision=" 2906 2906 \\begin{texdraw} 2907 \\drawdim cm \\relunitscale 1 2907 \\drawdim cm \\relunitscale 1 2908 2908 \\linewd 0.05" 2909 2909 +subdivision+" … … 2919 2919 poly f=x+y+x2y+xy2+1/t*xy; 2920 2920 list graph=tropicalCurve(f); 2921 // compute the texdraw code of the Newton subdivision of the tropical curve 2921 // compute the texdraw code of the Newton subdivision of the tropical curve 2922 2922 texDrawNewtonSubdivision(graph); 2923 2923 } … … 2927 2927 proc texDrawTriangulation (list triang,list polygon) 2928 2928 "USAGE: texDrawTriangulation(triang,polygon); triang,polygon list 2929 ASSUME: polygon is a list of integer vectors describing the 2929 ASSUME: polygon is a list of integer vectors describing the 2930 2930 lattice points of a marked polygon; 2931 triang is a list of integer vectors describing a 2931 triang is a list of integer vectors describing a 2932 2932 triangulation of the marked polygon 2933 in the sense that an integer vector of the form (i,j,k) describes 2933 in the sense that an integer vector of the form (i,j,k) describes 2934 2934 the triangle formed by polygon[i], polygon[j] and polygon[k] 2935 RETURN: string, a texdraw code for the triangulation described 2935 RETURN: string, a texdraw code for the triangulation described 2936 2936 by triang without the texdraw environment 2937 2937 EXAMPLE: example texDrawTriangulation; shows an example" … … 2942 2942 "; 2943 2943 int i,j; // indices 2944 list pairs,markings; // stores edges of the triangulation, respecively 2945 // the marked points for each triangle store the edges and marked 2944 list pairs,markings; // stores edges of the triangulation, respecively 2945 // the marked points for each triangle store the edges and marked 2946 2946 // points of the triangle 2947 2947 for (i=1;i<=size(triang);i++) … … 2952 2952 markings[3*i-2]=triang[i][1]; 2953 2953 markings[3*i-1]=triang[i][2]; 2954 markings[3*i]=triang[i][3]; 2954 markings[3*i]=triang[i][3]; 2955 2955 } 2956 2956 // delete redundant pairs which occur more than once … … 2985 2985 { 2986 2986 latex=latex+" 2987 \\move ("+string(polygon[markings[i]][1])+" "+string(polygon[markings[i]][2])+") 2987 \\move ("+string(polygon[markings[i]][1])+" "+string(polygon[markings[i]][2])+") 2988 2988 \\fcir f:0 r:0.08"; 2989 2989 } … … 2992 2992 { 2993 2993 latex=latex+" 2994 \\move ("+string(polygon[pairs[i][1]][1])+" "+string(polygon[pairs[i][1]][2])+") 2994 \\move ("+string(polygon[pairs[i][1]][1])+" "+string(polygon[pairs[i][1]][2])+") 2995 2995 \\lvec ("+string(polygon[pairs[i][2]][1])+" "+string(polygon[pairs[i][2]][2])+")"; 2996 2996 } … … 2999 2999 { 3000 3000 latex=latex+" 3001 \\move ("+string(polygon[i][1])+" "+string(polygon[i][2])+") 3001 \\move ("+string(polygon[i][1])+" "+string(polygon[i][2])+") 3002 3002 \\fcir f:0.7 r:0.04"; 3003 3003 } … … 3008 3008 "EXAMPLE:"; 3009 3009 echo=2; 3010 // the lattice polygon spanned by the points (0,0), (3,0) and (0,3) 3010 // the lattice polygon spanned by the points (0,0), (3,0) and (0,3) 3011 3011 // with all integer points as markings 3012 3012 list polygon=intvec(1,1),intvec(3,0),intvec(2,0),intvec(1,0),intvec(0,0), 3013 3013 intvec(2,1),intvec(0,1),intvec(1,2),intvec(0,2),intvec(0,3); 3014 // define a triangulation by connecting the only interior point 3014 // define a triangulation by connecting the only interior point 3015 3015 // with the vertices 3016 3016 list triang=intvec(1,2,5),intvec(1,5,10),intvec(1,2,10); … … 3020 3020 3021 3021 /////////////////////////////////////////////////////////////////////////////// 3022 /// Auxilary Procedures 3022 /// Auxilary Procedures 3023 3023 /////////////////////////////////////////////////////////////////////////////// 3024 3024 … … 3026 3026 "USAGE: radicalMemberShip (f,i); f poly, i ideal 3027 3027 RETURN: int, 1 if f is in the radical of i, 0 else 3028 EXAMPLE: example radicalMemberShip; shows an example" 3028 EXAMPLE: example radicalMemberShip; shows an example" 3029 3029 { 3030 3030 def BASERING=basering; … … 3066 3066 { 3067 3067 // compute first the t-order of the leading coefficient of f (leitkoef[1]) and 3068 // the rational constant corresponding to this order in leadkoef(f) 3068 // the rational constant corresponding to this order in leadkoef(f) 3069 3069 // (leitkoef[2]) 3070 3070 list leitkoef=simplifyToOrder(f); … … 3076 3076 // do the same for the remaining part of f and compare the results 3077 3077 // keep only the smallest ones 3078 int vglgewicht; 3079 f=f-lead(f); 3078 int vglgewicht; 3079 f=f-lead(f); 3080 3080 while (f!=0) 3081 3081 { 3082 leitkoef=simplifyToOrder(f); 3082 leitkoef=simplifyToOrder(f); 3083 3083 vglgewicht=leitkoef[1]+scalarproduct(w,leadexp(f)); 3084 3084 if (vglgewicht<gewicht) … … 3095 3095 initialf=initialf+koef*leadmonom(f); 3096 3096 } 3097 } 3097 } 3098 3098 f=f-lead(f); 3099 3099 } … … 3120 3120 { 3121 3121 // compute first the t-order of the leading coefficient of f (leitkoef[1]) and 3122 // the rational constant corresponding to this order in leadkoef(f) 3122 // the rational constant corresponding to this order in leadkoef(f) 3123 3123 // (leitkoef[2]) 3124 list leitkoef=simplifyToOrder(f); 3124 list leitkoef=simplifyToOrder(f); 3125 3125 execute("poly koef="+leitkoef[2]+";"); 3126 3126 // take in lead(f) only the term of lowest t-order and set t=1 … … 3131 3131 // keep only the largest ones 3132 3132 int vglgewicht; 3133 f=f-lead(f); 3133 f=f-lead(f); 3134 3134 while (f!=0) 3135 3135 { … … 3149 3149 initialf=initialf+koef*leadmonom(f); 3150 3150 } 3151 } 3151 } 3152 3152 f=f-lead(f); 3153 3153 } … … 3168 3168 proc solveTInitialFormPar (ideal i) 3169 3169 "USAGE: solveTInitialFormPar(i); i ideal 3170 ASSUME: i is a zero-dimensional ideal in Q(t)[x_1,...,x_n] generated 3171 by the (1,w)-homogeneous elements for some integer vector w 3170 ASSUME: i is a zero-dimensional ideal in Q(t)[x_1,...,x_n] generated 3171 by the (1,w)-homogeneous elements for some integer vector w 3172 3172 - i.e. by the (1,w)-initialforms of polynomials 3173 3173 RETURN: none 3174 NOTE: the procedure just displays complex approximations 3174 NOTE: the procedure just displays complex approximations 3175 3175 of the solution set of i 3176 3176 EXAMPLE: example solveTInitialFormPar; shows an example" … … 3197 3197 ///////////////////////////////////////////////////////////////////////// 3198 3198 3199 proc detropicalise (poly p) 3199 proc detropicalise (poly p) 3200 3200 "USAGE: detropicalise(f); f poly 3201 3201 ASSUME: f is a linear polynomial with an arbitrary constant term and 3202 3202 positive integer coefficients as further coefficients; 3203 3203 RETURN: poly, the detropicalisation of (the non-constant part of) f 3204 NOTE: the output will be a monomial and the constant coefficient 3204 NOTE: the output will be a monomial and the constant coefficient 3205 3205 has been ignored 3206 3206 EXAMPLE: example detropicalise; shows an example" … … 3210 3210 { 3211 3211 if (leadmonom(p)!=1) 3212 { 3212 { 3213 3213 dtp=dtp*leadmonom(p)^int(leadcoef(p)); 3214 3214 } … … 3263 3263 proc parameterSubstitute (poly f,int N) 3264 3264 "USAGE: parameterSubstitute(f,N); f poly, N int 3265 ASSUME: f is a polynomial in Q(t)[x_1,...,x_n] describing 3265 ASSUME: f is a polynomial in Q(t)[x_1,...,x_n] describing 3266 3266 a plane curve over Q(t) 3267 3267 RETURN: poly f with t replaced by t^N … … 3317 3317 poly f=t2x+1/t*y-1; 3318 3318 tropicalSubst(f,2,x,x+t,y,tx+y+t2); 3319 // The procedure can be used to study the effect of a transformation of 3319 // The procedure can be used to study the effect of a transformation of 3320 3320 // the form x -> x+t^b, with b a rational number, on the tropicalisation and 3321 3321 // the j-invariant of a cubic over the Puiseux series. 3322 3322 f=t7*y3+t3*y2+t*(x3+xy2+y+1)+xy; 3323 // - the j-invariant, and hence its valuation, 3323 // - the j-invariant, and hence its valuation, 3324 3324 // does not change under the transformation 3325 3325 jInvariant(f,"ord"); 3326 // - b=3/2, then the cycle length of the tropical cubic equals -val(j-inv) 3327 list g32=tropicalSubst(f,2,x,x+t3,y,y); 3326 // - b=3/2, then the cycle length of the tropical cubic equals -val(j-inv) 3327 list g32=tropicalSubst(f,2,x,x+t3,y,y); 3328 3328 tropicalJInvariant(g32); 3329 3329 // - b=1, then it is still true, but only just ... … … 3338 3338 3339 3339 proc randomPoly (int d,int ug, int og, list #) 3340 "USAGE: randomPoly(d,ug,og[,#]); d, ug, og int, # list 3340 "USAGE: randomPoly(d,ug,og[,#]); d, ug, og int, # list 3341 3341 ASSUME: the basering has a parameter t 3342 RETURN: poly, a polynomial of degree d where the coefficients are 3342 RETURN: poly, a polynomial of degree d where the coefficients are 3343 3343 of the form t^j with j a random integer between ug and og 3344 NOTE: if an optional argument # is given, then the coefficients are 3345 instead either of the form t^j as above or they are zero, 3344 NOTE: if an optional argument # is given, then the coefficients are 3345 instead either of the form t^j as above or they are zero, 3346 3346 and this is chosen randomly 3347 3347 EXAMPLE: example randomPoly; shows an example" … … 3359 3359 { 3360 3360 if (size(#)!=0) 3361 { 3361 { 3362 3362 k=random(0,1); 3363 3363 } 3364 3364 if (k==0) 3365 { 3365 { 3366 3366 j=random(ug,og); 3367 3367 randomPolynomial=randomPolynomial+t^j*m[i]; … … 3393 3393 RETURN: none" 3394 3394 { 3395 system("sh","cd /tmp; /bin/rm -f tropicalcurve*; /bin/rm -f tropicalnewtonsubdivision*"); 3395 system("sh","cd /tmp; /bin/rm -f tropicalcurve*; /bin/rm -f tropicalnewtonsubdivision*"); 3396 3396 } 3397 3397 … … 3450 3450 static proc cutdown (ideal jideal,intvec wvec,int dimension,list #) 3451 3451 "USAGE: cutdown(i,w,d); i ideal, w intvec, d int, # list 3452 ASSUME: i an ideal in Q[t,x_1,...,x_n], (w_1,...,w_n) is in the tropical 3453 variety of jideal and d=dim(i)>0, in Q(t)[x]; the optional 3454 parameter # can contain the string 'isPrime' to indicate that 3455 the input ideal is prime and no minimal associated primes have 3452 ASSUME: i an ideal in Q[t,x_1,...,x_n], (w_1,...,w_n) is in the tropical 3453 variety of jideal and d=dim(i)>0, in Q(t)[x]; the optional 3454 parameter # can contain the string 'isPrime' to indicate that 3455 the input ideal is prime and no minimal associated primes have 3456 3456 to be computed 3457 RETURN: list, the first entry is a ring, namely the basering where some 3458 variables have been eliminated, and the ring contains 3457 RETURN: list, the first entry is a ring, namely the basering where some 3458 variables have been eliminated, and the ring contains 3459 3459 the ideal i (with the same variables eliminated), 3460 the t-initial ideal ini of i (w.r.t. the weight vector 3461 where the entries corresponding to the deleted variables 3462 have been eliminated) and a list repl where for each 3460 the t-initial ideal ini of i (w.r.t. the weight vector 3461 where the entries corresponding to the deleted variables 3462 have been eliminated) and a list repl where for each 3463 3463 eliminated variable there is one entry, namely a polynomial 3464 in the remaining variables and t that explains how 3465 resubstitution of a solution for the new i gives a solution 3464 in the remaining variables and t that explains how 3465 resubstitution of a solution for the new i gives a solution 3466 3466 for the old i; the second entry is the weight vector 3467 wvec with the components corresponding to the eliminated 3467 wvec with the components corresponding to the eliminated 3468 3468 variables removed 3469 NOTE: needs the libraries random.lib and primdec.lib; 3469 NOTE: needs the libraries random.lib and primdec.lib; 3470 3470 is called from tropicalLifting" 3471 { 3472 // IDEA: i is an ideal of dimension d; we want to cut it with d random linear 3471 { 3472 // IDEA: i is an ideal of dimension d; we want to cut it with d random linear 3473 3473 // forms in such a way that the resulting 3474 3474 // ideal is 0-dim and still contains w in the tropical variety 3475 // NOTE: t is the last variable in the basering 3475 // NOTE: t is the last variable in the basering 3476 3476 ideal pideal; //this is the ideal we want to return 3477 3477 ideal cutideal; … … 3491 3491 for (j1=1;j1<=nvars(basering)-1;j1++) 3492 3492 { 3493 variablen=variablen+var(j1); // read the set of variables 3493 variablen=variablen+var(j1); // read the set of variables 3494 3494 // (needed to make the quotring later) 3495 product=product*var(j1); // make product of all variables 3495 product=product*var(j1); // make product of all variables 3496 3496 // (needed for the initial-monomial-check later 3497 } 3497 } 3498 3498 execute("ring QUOTRING=("+charstr(basering)+",t),("+string(variablen)+"),dp;"); 3499 3499 setring BASERING; … … 3502 3502 { 3503 3503 setring QUOTRING; 3504 ideal jideal=imap(BASERING,jideal); 3505 list primp=minAssGTZ(jideal); //compute the primary decomposition 3504 ideal jideal=imap(BASERING,jideal); 3505 list primp=minAssGTZ(jideal); //compute the primary decomposition 3506 3506 for (j1=1;j1<=size(primp);j1++) 3507 { 3507 { 3508 3508 for(j2=1;j2<=size(primp[j1]);j2++) 3509 3509 { 3510 3510 // clear all denominators 3511 3511 primp[j1][j2]=primp[j1][j2]/content(primp[j1][j2]); 3512 } 3512 } 3513 3513 } 3514 3514 setring BASERING; 3515 3515 list primp=imap(QUOTRING,primp); 3516 3516 // if i is not primary itself 3517 // go through the list of min. ass. primes and find the first 3517 // go through the list of min. ass. primes and find the first 3518 3518 // one which has w in its tropical variety 3519 if (size(primp)>1) 3519 if (size(primp)>1) 3520 3520 { 3521 3521 j1=1; … … 3524 3524 //compute the t-initial of the associated prime 3525 3525 // - the last entry 1 only means that t is the last variable in the ring 3526 primini=tInitialIdeal(primp[j1],wvec,1); 3527 // check if it contains a monomial (resp if the product of var 3526 primini=tInitialIdeal(primp[j1],wvec,1); 3527 // check if it contains a monomial (resp if the product of var 3528 3528 // is in the radical) 3529 if (radicalMemberShip(product,primini)==0) 3530 { 3529 if (radicalMemberShip(product,primini)==0) 3530 { 3531 3531 // if w is in the tropical variety of the prime, we take that 3532 3532 jideal=primp[j1]; … … 3535 3535 setring BASERING; 3536 3536 winprim=1; // and stop the checking 3537 } 3537 } 3538 3538 j1=j1+1; //else we look at the next associated prime 3539 3539 } … … 3542 3542 { 3543 3543 jideal=primp[1]; //if i is primary itself we take its prime instead 3544 } 3544 } 3545 3545 } 3546 3546 // now we start as a first try to intersect with a hyperplane parallel to 3547 3547 // coordinate axes, because this would make our further computations 3548 // a lot easier. 3549 // We choose a subset of our n variables of size d=dim(ideal). 3548 // a lot easier. 3549 // We choose a subset of our n variables of size d=dim(ideal). 3550 3550 // For each of these 3551 // variables, we want to fix a value: x_i= a_i*t^-w_i. 3551 // variables, we want to fix a value: x_i= a_i*t^-w_i. 3552 3552 // This will only work if the 3553 // projection of the d-dim variety to the other n-d variables 3553 // projection of the d-dim variety to the other n-d variables 3554 3554 // is the whole n-d plane. 3555 // Then a general choice for a_i will intersect the variety 3555 // Then a general choice for a_i will intersect the variety 3556 3556 // in finitely many points. 3557 // If the projection is not the whole n-d plane, 3557 // If the projection is not the whole n-d plane, 3558 3558 // then a general choice will not work. 3559 // We could determine if we picked a good 3559 // We could determine if we picked a good 3560 3560 // d-subset of variables using elimination 3561 // (NOTE, there EXIST d variables such that 3561 // (NOTE, there EXIST d variables such that 3562 3562 // a random choice of a_i's would work!). 3563 // But since this involves many computations, 3563 // But since this involves many computations, 3564 3564 // we prefer to choose randomly and just 3565 // try in the end if our intersected ideal 3566 // satisfies our requirements. If this does not 3565 // try in the end if our intersected ideal 3566 // satisfies our requirements. If this does not 3567 3567 // work, we give up this try and use our second intersection idea, which 3568 3568 // will work for a Zariksi-open subset (i.e. almost always). 3569 3569 // 3570 // As random subset of d variables we choose 3570 // As random subset of d variables we choose 3571 3571 // those for which the absolute value of the 3572 // wvec-coordinate is smallest, because this will 3572 // wvec-coordinate is smallest, because this will 3573 3573 // give us the smallest powers of t and hence 3574 // less effort in following computations. 3574 // less effort in following computations. 3575 3575 // Note that the smallest absolute value have those 3576 // which are biggest, because wvec is negative. 3576 // which are biggest, because wvec is negative. 3577 3577 //print("first try"); 3578 3578 intvec wminust=intvecdelete(wvec,1); … … 3581 3581 A[1,1..size(wminust)]=-wminust; 3582 3582 A[2,1..size(wminust)]=1..size(wminust); 3583 // sort this matrix in order to get 3583 // sort this matrix in order to get 3584 3584 // the d biggest entries and their position in wvec 3585 A=sortintmat(A); 3586 // we construct a vector which has 1 at entry j if j belongs to the list 3585 A=sortintmat(A); 3586 // we construct a vector which has 1 at entry j if j belongs to the list 3587 3587 // of the d biggest entries of wvec and a 0 else 3588 3588 for (j1=1;j1<=nvars(basering)-1;j1++) //go through the variables … … 3593 3593 { 3594 3594 setvec[j1]=1;//put a 1 3595 } 3596 } 3597 } 3598 // using this 0/1-vector we produce 3599 // a random constant (i.e. coeff in Q times something in t) 3600 // for each of the biggest variables, 3595 } 3596 } 3597 } 3598 // using this 0/1-vector we produce 3599 // a random constant (i.e. coeff in Q times something in t) 3600 // for each of the biggest variables, 3601 3601 // we add the forms x_i-random constant to the ideal 3602 // and we save the constant at the i-th place of 3602 // and we save the constant at the i-th place of 3603 3603 // a list we want to return for later computations 3604 3604 j3=0; … … 3611 3611 { 3612 3612 if(setvec[j1]==1)//if x_i belongs to the biggest variables 3613 { 3613 { 3614 3614 if ((j3==1) and ((char(basering)==0) or (char(basering)>3))) 3615 { 3615 { 3616 3616 randomp1=random(1,3); 3617 randomp=t^(A[1,j2])*randomp1;// make a random constant 3617 randomp=t^(A[1,j2])*randomp1;// make a random constant 3618 3618 // --- first we try small numbers 3619 } 3619 } 3620 3620 if ((j3==2) and ((char(basering)==0) or (char(basering)>100))) 3621 3621 { 3622 3622 randomp1=random(1,100); 3623 randomp=t^(A[1,j2])*randomp1;// make a random constant 3623 randomp=t^(A[1,j2])*randomp1;// make a random constant 3624 3624 // --- next we try bigger numbers 3625 } 3625 } 3626 3626 else 3627 3627 { … … 3635 3635 else 3636 3636 { 3637 ergl[j1]=0; //if the variable is not among the d biggest ones, 3637 ergl[j1]=0; //if the variable is not among the d biggest ones, 3638 3638 //save 0 in the list 3639 3639 erglini[j1]=0; 3640 } 3640 } 3641 3641 } 3642 3642 // print(ergl);print(pideal); 3643 // now we check if we made a good choice of pideal, i.e. if dim=0 and 3643 // now we check if we made a good choice of pideal, i.e. if dim=0 and 3644 3644 // wvec is still in the tropical variety 3645 3645 // change to quotring where we compute dimension … … 3648 3648 { 3649 3649 if(setvec[j1]==1) 3650 { 3651 cutideal=cutideal,var(j1)-ergl[j1];//add all forms to the ideal 3652 } 3650 { 3651 cutideal=cutideal,var(j1)-ergl[j1];//add all forms to the ideal 3652 } 3653 3653 } 3654 3654 setring QUOTRING; … … 3662 3662 { 3663 3663 // compute the t-initial of the associated prime 3664 // - the last 1 just means that the variable t is 3664 // - the last 1 just means that the variable t is 3665 3665 // the last variable in the ring 3666 3666 pini=tInitialIdeal(cutideal,wvec ,1); 3667 3667 //print("initial"); 3668 3668 //print(pini); 3669 // and if the initial w.r.t. t contains no monomial 3669 // and if the initial w.r.t. t contains no monomial 3670 3670 // as we want (checked with 3671 3671 // radical-membership of the product of all variables) 3672 if (radicalMemberShip(product,pini)==0) 3673 { 3674 // we made the right choice and now 3675 // we substitute the variables in the ideal 3672 if (radicalMemberShip(product,pini)==0) 3673 { 3674 // we made the right choice and now 3675 // we substitute the variables in the ideal 3676 3676 // to get an ideal in less variables 3677 // also we make a projected vector 3677 // also we make a projected vector 3678 3678 // from wvec only the components of the remaining variables 3679 3679 wvecp=wvec; 3680 variablen=0; 3680 variablen=0; 3681 3681 j2=0; 3682 3682 for(j1=1;j1<=nvars(basering)-1;j1++) … … 3691 3691 else 3692 3692 { 3693 variablen=variablen+var(j1); // read the set of remaining variables 3693 variablen=variablen+var(j1); // read the set of remaining variables 3694 3694 // (needed to make quotring later) 3695 } 3696 } 3695 } 3696 } 3697 3697 // return pideal, the initial and the list ergl which tells us 3698 3698 // which variables we replaced by which form … … 3704 3704 export(ini); 3705 3705 export(repl); 3706 return(list(BASERINGLESS1,wvecp)); 3706 return(list(BASERINGLESS1,wvecp)); 3707 3707 } 3708 3708 } 3709 3709 } 3710 3710 // this is our second try to cut down, which we only use if the first try 3711 // didn't work out. We intersect with d general hyperplanes 3711 // didn't work out. We intersect with d general hyperplanes 3712 3712 // (i.e. we don't choose 3713 3713 // them to be parallel to coordinate hyperplanes anymore. This works out with 3714 3714 // probability 1. 3715 3715 // 3716 // We choose general hyperplanes, i.e. linear forms which involve all x_i. 3717 // Each x_i has to be multiplied bz t^(w_i) in order 3718 // to get the same weight (namely 0) 3716 // We choose general hyperplanes, i.e. linear forms which involve all x_i. 3717 // Each x_i has to be multiplied bz t^(w_i) in order 3718 // to get the same weight (namely 0) 3719 3719 // for each term. As we cannot have negative exponents, we multiply 3720 // the whole form by t^minimumw. Notice that then in the first form, 3720 // the whole form by t^minimumw. Notice that then in the first form, 3721 3721 // there is one term without t- the term of the variable 3722 3722 // x_i such that w_i is minimal. That is, we can solve for this variable. 3723 // In the second form, we can replace that variable, 3724 // and divide by t as much as possible. 3725 // Then there is again one term wihtout t - 3726 // the term of the variable with second least w. 3723 // In the second form, we can replace that variable, 3724 // and divide by t as much as possible. 3725 // Then there is again one term wihtout t - 3726 // the term of the variable with second least w. 3727 3727 // So we can solve for this one again and also replace it in the first form. 3728 // Since all our coefficients are chosen randomly, 3729 // we can also from the beginning on 3730 // choose the set of variables which belong to the d smallest entries of wvec 3731 // (t not counting) and pick random forms g_i(t,x') 3732 // (where x' is the set of remaining variables) 3733 // and set x_i=g_i(t,x'). 3728 // Since all our coefficients are chosen randomly, 3729 // we can also from the beginning on 3730 // choose the set of variables which belong to the d smallest entries of wvec 3731 // (t not counting) and pick random forms g_i(t,x') 3732 // (where x' is the set of remaining variables) 3733 // and set x_i=g_i(t,x'). 3734 3734 // 3735 3735 // make a matrix with first row wvec (without t) and second row 1..n 3736 3736 //print("second try"); 3737 3737 setring BASERING; 3738 A[1,1..size(wminust)]=wminust; 3738 A[1,1..size(wminust)]=wminust; 3739 3739 A[2,1..size(wminust)]=1..size(wminust); 3740 // sort this matrix in otder to get the d smallest entries 3740 // sort this matrix in otder to get the d smallest entries 3741 3741 // (without counting the t-entry) 3742 3742 A=sortintmat(A); … … 3744 3744 setvec=0; 3745 3745 setvec[nvars(basering)-1]=0; 3746 // we construct a vector which has 1 at entry j if j belongs to the list of 3746 // we construct a vector which has 1 at entry j if j belongs to the list of 3747 3747 // the d smallest entries of wvec and a 0 else 3748 3748 for (j1=1;j1<=nvars(basering)-1;j1++) //go through the variables … … 3764 3764 { 3765 3765 j2=j2+1; 3766 wvecp=intvecdelete(wvecp,j1+2-j2);// delete the components 3766 wvecp=intvecdelete(wvecp,j1+2-j2);// delete the components 3767 3767 // we substitute from wvec 3768 3768 } 3769 3769 else 3770 3770 { 3771 variablen=variablen+var(j1); // read the set of remaining variables 3771 variablen=variablen+var(j1); // read the set of remaining variables 3772 3772 // (needed to make the quotring later) 3773 3773 } 3774 } 3774 } 3775 3775 setring BASERING; 3776 3776 execute("ring BASERINGLESS2=("+charstr(BASERING)+"),("+string(variablen)+",t),(dp("+string(ncols(variablen))+"),lp(1));"); 3777 // using the 0/1-vector which tells us which variables belong 3777 // using the 0/1-vector which tells us which variables belong 3778 3778 // to the set of smallest entries of wvec 3779 // we construct a set of d random linear 3780 // polynomials of the form x_i=g_i(t,x'), 3779 // we construct a set of d random linear 3780 // polynomials of the form x_i=g_i(t,x'), 3781 3781 // where the set of all x_i is the set of 3782 // all variables which are in the list of smallest 3782 // all variables which are in the list of smallest 3783 3783 // entries in wvec, and x' are the other variables. 3784 // We add these d random linear polynomials to 3785 // the ideal pideal, i.e. we intersect 3784 // We add these d random linear polynomials to 3785 // the ideal pideal, i.e. we intersect 3786 3786 // with these and hope to get something 3787 // 0-dim which still contains wvec in its 3788 // tropical variety. Also, we produce a list ergl 3787 // 0-dim which still contains wvec in its 3788 // tropical variety. Also, we produce a list ergl 3789 3789 // with g_i at the i-th position. 3790 3790 // This is a list we want to return. … … 3792 3792 setring BASERING; 3793 3793 pideal=jideal; 3794 for(j1=1;j1<=dimension;j1++)//go through the list of variables 3794 for(j1=1;j1<=dimension;j1++)//go through the list of variables 3795 3795 { // corres to the d smallest in wvec 3796 3796 if ((char(basering)==0) or (char(basering)>3)) 3797 { 3797 { 3798 3798 randomp1=random(1,3); 3799 3799 randomp=randomp1*t^(-A[1,j1]); … … 3808 3808 if(setvec[j2]==0)//if x_j belongs to the set x' 3809 3809 { 3810 // add a random term with the suitable power 3810 // add a random term with the suitable power 3811 3811 // of t to the random linear form 3812 3812 if ((char(basering)==0) or (char(basering)>3)) … … 3833 3833 } 3834 3834 //print(ergl); 3835 // Again, we have to test if we made a good choice 3836 // to intersect,i.e. we have to check whether 3835 // Again, we have to test if we made a good choice 3836 // to intersect,i.e. we have to check whether 3837 3837 // pideal is 0-dim and contains wvec in the tropical variety. 3838 3838 cutideal=pideal; … … 3841 3841 if(setvec[j1]==1) 3842 3842 { 3843 cutideal=cutideal,var(j1)-ergl[j1];//add all forms to the ideal 3844 } 3843 cutideal=cutideal,var(j1)-ergl[j1];//add all forms to the ideal 3844 } 3845 3845 } 3846 3846 setring QUOTRING; … … 3854 3854 { 3855 3855 // compute the t-initial of the associated prime 3856 // - the last 1 just means that the variable t 3856 // - the last 1 just means that the variable t 3857 3857 // is the last variable in the ring 3858 3858 pini=tInitialIdeal(cutideal,wvec ,1); … … 3861 3861 // and if the initial w.r.t. t contains no monomial as we want (checked with 3862 3862 // radical-membership of the product of all variables) 3863 if (radicalMemberShip(product,pini)==0) 3863 if (radicalMemberShip(product,pini)==0) 3864 3864 { 3865 3865 // we want to replace the variables x_i by the forms -g_i in 3866 // our ideal in order to return an ideal with less variables 3866 // our ideal in order to return an ideal with less variables 3867 3867 // first we substitute the chosen variables 3868 3868 for(j1=1;j1<=nvars(basering)-1;j1++) … … 3881 3881 export(ini); 3882 3882 export(repl); 3883 return(list(BASERINGLESS2,wvecp)); 3883 return(list(BASERINGLESS2,wvecp)); 3884 3884 } 3885 3885 } 3886 3886 // now we try bigger numbers 3887 while (1) //a never-ending loop which will stop with prob. 1 3887 while (1) //a never-ending loop which will stop with prob. 1 3888 3888 { // as we find a suitable ideal with that prob 3889 3889 setring BASERING; 3890 3890 pideal=jideal; 3891 for(j1=1;j1<=dimension;j1++)//go through the list of variables 3891 for(j1=1;j1<=dimension;j1++)//go through the list of variables 3892 3892 { // corres to the d smallest in wvec 3893 3893 randomp1=random(1,100); 3894 3894 randomp=randomp1*t^(-A[1,j1]); 3895 3895 for(j2=1;j2<=nvars(basering)-1;j2++)//go through all variables 3896 { 3896 { 3897 3897 if(setvec[j2]==0)//if x_j belongs to the set x' 3898 3898 { 3899 // add a random term with the suitable power 3899 // add a random term with the suitable power 3900 3900 // of t to the random linear form 3901 3901 if ((char(basering)==0) or (char(basering)>100)) 3902 { 3902 { 3903 3903 randomp2=random(1,100); 3904 3904 randomp1=randomp1+randomp2*var(j2); … … 3921 3921 } 3922 3922 //print(ergl); 3923 // Again, we have to test if we made a good choice to 3924 // intersect,i.e. we have to check whether 3923 // Again, we have to test if we made a good choice to 3924 // intersect,i.e. we have to check whether 3925 3925 // pideal is 0-dim and contains wvec in the tropical variety. 3926 3926 cutideal=pideal; … … 3929 3929 if(setvec[j1]==1) 3930 3930 { 3931 cutideal=cutideal,var(j1)-ergl[j1];//add all forms to the ideal 3932 } 3931 cutideal=cutideal,var(j1)-ergl[j1];//add all forms to the ideal 3932 } 3933 3933 } 3934 3934 setring QUOTRING; … … 3938 3938 //print(dimp); 3939 3939 kill cutideal; 3940 setring BASERING; 3940 setring BASERING; 3941 3941 if (dimp==0) // if it is 0 as we want 3942 3942 { 3943 3943 // compute the t-initial of the associated prime 3944 // - the last 1 just means that the variable t 3944 // - the last 1 just means that the variable t 3945 3945 // is the last variable in the ring 3946 3946 pini=tInitialIdeal(cutideal,wvec ,1); 3947 3947 //print("initial"); 3948 3948 //print(pini); 3949 // and if the initial w.r.t. t contains no monomial 3949 // and if the initial w.r.t. t contains no monomial 3950 3950 // as we want (checked with 3951 3951 // radical-membership of the product of all variables) 3952 if (radicalMemberShip(product,pini)==0) 3952 if (radicalMemberShip(product,pini)==0) 3953 3953 { 3954 3954 // we want to replace the variables x_i by the forms -g_i in … … 3961 3961 pideal=subst(pideal,var(j1),ergl[j1]);//substitute it 3962 3962 pini=subst(pini,var(j1),erglini[j1]); 3963 } 3964 } 3963 } 3964 } 3965 3965 // return pideal and the list ergl which tells us 3966 3966 // which variables we replaced by which form … … 3972 3972 export(ini); 3973 3973 export(repl); 3974 return(list(BASERINGLESS2,wvecp)); 3974 return(list(BASERINGLESS2,wvecp)); 3975 3975 } 3976 3976 } … … 3983 3983 static proc tropicalparametriseNoabs (ideal i,intvec ww,int ordnung,int gfanold,int nogfan,list #) 3984 3984 "USAGE: tropicalparametriseNoabs(i,tw,ord,gf,ng[,#]); i ideal, tw intvec, ord int, gf,ng int, # opt. list 3985 ASSUME: - i is an ideal in Q[t,x_1,...,x_n,X_1,...,X_k], 3986 tw=(w_0,w_1,...,w_n,0,...,0) and (w_0,...,w_n,0,...,0) is in 3987 the tropical variety of i, and ord is the order up to which a point 3988 in V(i) over C((t)) lying over w shall be computed; 3985 ASSUME: - i is an ideal in Q[t,x_1,...,x_n,X_1,...,X_k], 3986 tw=(w_0,w_1,...,w_n,0,...,0) and (w_0,...,w_n,0,...,0) is in 3987 the tropical variety of i, and ord is the order up to which a point 3988 in V(i) over C((t)) lying over w shall be computed; 3989 3989 - moreover, k should be zero if the procedure is not called recursively; 3990 - the point in the tropical variety is supposed to lie in the NEGATIVE 3990 - the point in the tropical variety is supposed to lie in the NEGATIVE 3991 3991 orthant; 3992 - the ideal is zero-dimensional when considered 3992 - the ideal is zero-dimensional when considered 3993 3993 in (Q(t)[X_1,...,X_k]/m)[x_1,...,x_n], 3994 where m=#[2] is a maximal ideal in Q(t)[X_1,...,X_k]; 3994 where m=#[2] is a maximal ideal in Q(t)[X_1,...,X_k]; 3995 3995 - gf is 0 if version 2.2 or larger is used and it is 1 else 3996 - ng is 1 if gfan should not be executed 3996 - ng is 1 if gfan should not be executed 3997 3997 RETURN: list, l[1] = ring Q(0,X_1,...,X_r)[[t]] 3998 3998 l[2] = int 3999 3999 l[3] = string 4000 4000 NOTE: - the procedure is also called recursively by itself, and 4001 if it is called in the first recursion, the list # is empty, 4002 otherwise #[1] is an integer, one more than the number 4001 if it is called in the first recursion, the list # is empty, 4002 otherwise #[1] is an integer, one more than the number 4003 4003 of true variables x_1,...,x_n, 4004 4004 and #[2] will contain the maximal ideal m in the variables X_1,...X_k … … 4006 4006 work correctly in K[t,x_1,...,x_n] where K=Q[X_1,...,X_k]/m is a field 4007 4007 extension of Q; 4008 - the ring l[1] contains an ideal PARA, which contains the 4009 parametrisation of a point in V(i) lying over w up to the 4008 - the ring l[1] contains an ideal PARA, which contains the 4009 parametrisation of a point in V(i) lying over w up to the 4010 4010 first ord terms; 4011 - the string m=l[3] contains the code of the maximal ideal m, 4012 by which we have to divide Q[X_1,...,X_r] in order to have 4011 - the string m=l[3] contains the code of the maximal ideal m, 4012 by which we have to divide Q[X_1,...,X_r] in order to have 4013 4013 the appropriate field extension over which the parametrisation lives; 4014 - and if the integer l[2] is N then t has to be replaced by t^1/N in 4015 the parametrisation, or alternatively replace t by t^N in the 4014 - and if the integer l[2] is N then t has to be replaced by t^1/N in 4015 the parametrisation, or alternatively replace t by t^N in the 4016 4016 defining ideal 4017 - the procedure REQUIRES that the program GFAN is installed on 4017 - the procedure REQUIRES that the program GFAN is installed on 4018 4018 your computer" 4019 4019 { … … 4023 4023 if (size(#)==2) // this means the precedure has been called recursively 4024 4024 { 4025 // how many variables are true variables, and how many come 4025 // how many variables are true variables, and how many come 4026 4026 // from the field extension 4027 4027 // only true variables have to be transformed … … 4029 4029 ideal gesamt_m=std(#[2]); // stores all maxideals used for field extensions 4030 4030 // find the zeros of the w-initial ideal and transform the ideal i; 4031 // findzeros and basictransformideal need to know how 4031 // findzeros and basictransformideal need to know how 4032 4032 // many of the variables are true variables 4033 4033 list m_ring=findzeros(i,ww,anzahlvariablen); … … 4036 4036 else // the procedure has been called by tropicalLifting 4037 4037 { 4038 // how many variables are true variables, and how many come from 4038 // how many variables are true variables, and how many come from 4039 4039 // the field extension only true variables have to be transformed 4040 4040 int anzahlvariablen=nvars(basering); … … 4043 4043 ideal ini=#[1]; 4044 4044 // find the zeros of the w-initial ideal and transform the ideal i; 4045 // we should hand the t-initial ideal ine to findzeros, 4045 // we should hand the t-initial ideal ine to findzeros, 4046 4046 // since we know it already 4047 4047 list m_ring=findzeros(i,ww,ini); … … 4065 4065 list a=btr[2]; 4066 4066 ideal m=btr[3]; 4067 gesamt_m=gesamt_m+m; // add the newly found maximal 4067 gesamt_m=gesamt_m+m; // add the newly found maximal 4068 4068 // ideal to the previous ones 4069 4069 } 4070 4070 // check if there is a solution which has the n-th component zero, 4071 // if so, then eliminate the n-th variable from sat(i+x_n,t), 4071 // if so, then eliminate the n-th variable from sat(i+x_n,t), 4072 4072 // otherwise leave i as it is; 4073 // then check if the (remaining) ideal has as solution 4073 // then check if the (remaining) ideal has as solution 4074 4074 // where the n-1st component is zero, 4075 4075 // and procede as before; do the same for the remaining variables; 4076 // this way we make sure that the remaining ideal has 4076 // this way we make sure that the remaining ideal has 4077 4077 // a solution which has no component zero; 4078 4078 intvec deletedvariables; // the jth entry is set 1, if we eliminate x_j 4079 4079 int numberdeletedvariables; // the number of eliminated variables 4080 4080 ideal variablen; // will contain the variables which are not eliminated 4081 intvec tw=ww; // in case some variables are deleted, 4081 intvec tw=ww; // in case some variables are deleted, 4082 4082 // we have to store the old weight vector 4083 4083 deletedvariables[anzahlvariablen]=0; 4084 ideal I,LI; 4084 ideal I,LI; 4085 4085 i=i+m; // if a field extension was necessary, then i has to be extended by m 4086 4086 for (jj=anzahlvariablen-1;jj>=1;jj--) // the variable t is the last one !!! … … 4089 4089 LI=subst(I,var(nvars(basering)),0); 4090 4090 //size(deletedvariables)=anzahlvariablen(before elim.) 4091 for (kk=1;kk<=size(deletedvariables)-1;kk++) 4091 for (kk=1;kk<=size(deletedvariables)-1;kk++) 4092 4092 { 4093 4093 LI=subst(LI,var(kk),0); 4094 4094 } 4095 if (size(LI)==0) // if no power of t is in lead(I) 4095 if (size(LI)==0) // if no power of t is in lead(I) 4096 4096 { // (where the X(i) are considered as field elements) 4097 // get rid of var(jj) 4097 // get rid of var(jj) 4098 4098 i=eliminate(I,var(jj)); 4099 4099 deletedvariables[jj]=1; 4100 anzahlvariablen--; // if a variable is eliminated, 4100 anzahlvariablen--; // if a variable is eliminated, 4101 4101 // then the number of true variables drops 4102 4102 numberdeletedvariables++; … … 4108 4108 } 4109 4109 variablen=invertorder(variablen); 4110 // store also the additional variables and t, 4110 // store also the additional variables and t, 4111 4111 // since they for sure have not been eliminated 4112 4112 for (jj=anzahlvariablen+numberdeletedvariables-1;jj<=nvars(basering);jj++) … … 4114 4114 variablen=variablen+var(jj); 4115 4115 } 4116 // if some variables have been eliminated, 4116 // if some variables have been eliminated, 4117 4117 // then pass to a new ring which has less variables, 4118 4118 // but if no variables are left, then we are done 4119 4119 def BASERING=basering; 4120 if ((numberdeletedvariables>0) and (anzahlvariablen>1)) // if only t remains, 4120 if ((numberdeletedvariables>0) and (anzahlvariablen>1)) // if only t remains, 4121 4121 { // all true variables are gone 4122 4122 execute("ring NEURING=("+charstr(basering)+"),("+string(variablen)+"),(dp("+string(size(variablen)-1)+"),lp(1));"); 4123 4123 ideal i=imap(BASERING,i); 4124 ideal gesamt_m=imap(BASERING,gesamt_m); 4125 } 4126 // now we have to compute a point ww on the tropical variety 4124 ideal gesamt_m=imap(BASERING,gesamt_m); 4125 } 4126 // now we have to compute a point ww on the tropical variety 4127 4127 // of the transformed ideal i; 4128 // of course, we only have to do so, if we have not yet 4128 // of course, we only have to do so, if we have not yet 4129 4129 // reached the order up to which we 4130 4130 // were supposed to do our computations 4131 if ((ordnung>1) and (anzahlvariablen>1)) // if only t remains, 4131 if ((ordnung>1) and (anzahlvariablen>1)) // if only t remains, 4132 4132 { // all true variables are gone 4133 4133 def PREGFANRING=basering; 4134 4134 if (nogfan!=1) 4135 { 4135 { 4136 4136 // pass to a ring which has variables which are suitable for gfan 4137 4137 execute("ring GFANRING=("+charstr(basering)+"),(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z),dp;"); 4138 ideal phiideal=b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z; 4138 ideal phiideal=b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z; 4139 4139 phiideal[nvars(PREGFANRING)]=a; // map t to a 4140 map phi=PREGFANRING,phiideal; 4140 map phi=PREGFANRING,phiideal; 4141 4141 ideal i=phi(i); 4142 // homogenise the ideal i with the first not yet 4143 // used variable in our ring, since gfan 4144 // only handles homogenous ideals; in principle 4142 // homogenise the ideal i with the first not yet 4143 // used variable in our ring, since gfan 4144 // only handles homogenous ideals; in principle 4145 4145 // for this one has first to compute a 4146 // standard basis of i and homogenise that, 4147 // but for the tropical variety (says Anders) 4146 // standard basis of i and homogenise that, 4147 // but for the tropical variety (says Anders) 4148 4148 // it suffices to homogenise an arbitrary system of generators 4149 // i=groebner(i); 4149 // i=groebner(i); 4150 4150 i=homog(i,maxideal(1)[nvars(PREGFANRING)+1]); 4151 4151 // if gfan version >= 0.3.0 is used and the characteristic … … 4159 4159 write(":a /tmp/gfaninput","{"+string(i)+"}"); 4160 4160 } 4161 else 4161 else 4162 4162 { 4163 4163 // write the ideal to a file which gfan takes as input and call gfan … … 4180 4180 string trop=read("/tmp/gfanoutput"); 4181 4181 setring PREGFANRING; 4182 intvec wneu=-1; // this integer vector will store 4182 intvec wneu=-1; // this integer vector will store 4183 4183 // the point on the tropical variety 4184 4184 wneu[nvars(basering)]=0; … … 4193 4193 "IF YOU WANT wneu TO BE TESTED, THEN SET goon=0;"; 4194 4194 ~ 4195 // THIS IS NOT NECESSARY !!!! IF WE COMPUTE NOT ONLY THE 4195 // THIS IS NOT NECESSARY !!!! IF WE COMPUTE NOT ONLY THE 4196 4196 // TROPICAL PREVARIETY 4197 // test, if wneu really is in the tropical variety 4197 // test, if wneu really is in the tropical variety 4198 4198 while (goon==0) 4199 4199 { … … 4212 4212 { 4213 4213 system("sh","gfan_tropicallifting -n "+string(anzahlvariablen)+" --noMult -c < /tmp/gfaninput > /tmp/gfanoutput"); 4214 // read the result from gfan and store it to a string, 4214 // read the result from gfan and store it to a string, 4215 4215 // which in a later version 4216 4216 // should be interpreded by Singular … … 4225 4225 } 4226 4226 } 4227 // if we have not yet computed our parametrisation 4227 // if we have not yet computed our parametrisation 4228 4228 // up to the required order and 4229 // zero is not yet a solution, then we have 4229 // zero is not yet a solution, then we have 4230 4230 // to go on by calling the procedure recursively; 4231 4231 // if all variables were deleted, then i=0 and thus anzahlvariablen==0 4232 4232 if ((ordnung>1) and (anzahlvariablen>1)) 4233 { 4234 // we call the procedure with the transformed ideal i, 4233 { 4234 // we call the procedure with the transformed ideal i, 4235 4235 // the new weight vector, with the 4236 // required order lowered by one, and with 4236 // required order lowered by one, and with 4237 4237 // additional parameters, namely the number of 4238 // true variables and the maximal ideal that 4238 // true variables and the maximal ideal that 4239 4239 // was computed so far to describe the field extension 4240 4240 list PARALIST=tropicalparametriseNoabs(i,wneu,ordnung-1,gfanold,nogfan,anzahlvariablen,gesamt_m); 4241 // the output will be a ring, in which the 4241 // the output will be a ring, in which the 4242 4242 // parametrisation lives, and a string, which contains 4243 4243 // the maximal ideal that describes the necessary field extension … … 4246 4246 string PARAm=PARALIST[3]; 4247 4247 setring PARARing; 4248 // if some variables have been eliminated in before, 4249 // then we have to insert zeros 4248 // if some variables have been eliminated in before, 4249 // then we have to insert zeros 4250 4250 // into the parametrisation for those variables 4251 4251 if (numberdeletedvariables>0) … … 4253 4253 ideal PARAneu=PARA; 4254 4254 int k; 4255 for (jj=1;jj<=anzahlvariablen+numberdeletedvariables-1;jj++) // t admits 4255 for (jj=1;jj<=anzahlvariablen+numberdeletedvariables-1;jj++) // t admits 4256 4256 { // no parametrisation 4257 4257 if (deletedvariables[jj]!=1) … … 4267 4267 } 4268 4268 } 4269 // otherwise we are done and we can start to compute 4269 // otherwise we are done and we can start to compute 4270 4270 // the last step of the parametrisation 4271 4271 else … … 4273 4273 // we store the information on m in a string 4274 4274 string PARAm=string(gesamt_m); 4275 // we define the weight of t, i.e. in the parametrisation t 4275 // we define the weight of t, i.e. in the parametrisation t 4276 4276 // has to be replaced by t^1/tweight 4277 4277 int tweight=-tw[1]; 4278 // if additional variables were necessary, 4278 // if additional variables were necessary, 4279 4279 // we introduce them now as parameters; 4280 // in any case the parametrisation ring will 4281 // have only one variable, namely t, 4282 // and its order will be local, so that it 4280 // in any case the parametrisation ring will 4281 // have only one variable, namely t, 4282 // and its order will be local, so that it 4283 4283 // displays the lowest term in t first 4284 4284 if (anzahlvariablen+numberdeletedvariables<nvars(basering)) … … 4291 4291 } 4292 4292 ideal PARA; // will contain the parametrisation 4293 // we start by initialising the entries to be zero; 4293 // we start by initialising the entries to be zero; 4294 4294 // one entry for each true variable 4295 // here we also have to consider the variables 4295 // here we also have to consider the variables 4296 4296 // that we have eliminated in before 4297 4297 for (jj=1;jj<=anzahlvariablen+numberdeletedvariables-1;jj++) … … 4300 4300 } 4301 4301 } 4302 // we now have to change the parametrisation by 4302 // we now have to change the parametrisation by 4303 4303 // reverting the transformations that we have done 4304 4304 list a=imap(BASERING,a); 4305 if (defined(wneu)==0) // when tropicalparametriseNoabs is called for the 4306 { // last time, it does not enter the part, where wneu is defined and the 4305 if (defined(wneu)==0) // when tropicalparametriseNoabs is called for the 4306 { // last time, it does not enter the part, where wneu is defined and the 4307 4307 intvec wneu=-1; // variable t should have weight -1 4308 4308 } … … 4311 4311 PARA[jj]=(PARA[jj]+a[jj+1])*t^(tw[jj+1]*tweight/ww[1]); 4312 4312 } 4313 // if we have reached the stop-level, i.e. either 4313 // if we have reached the stop-level, i.e. either 4314 4314 // we had only to compute up to order 1 4315 // or zero was a solution of the ideal, then we have 4315 // or zero was a solution of the ideal, then we have 4316 4316 // to export the computed parametrisation 4317 4317 // otherwise it has already been exported before 4318 4318 // note, if all variables were deleted, then i==0 and thus testaufnull==0 4319 4319 if ((ordnung==1) or (anzahlvariablen==1)) 4320 { 4320 { 4321 4321 export(PARA); 4322 4322 } 4323 4323 // kill the gfan files in /tmp 4324 system("sh","cd /tmp; /usr/bin/touch gfaninput; /usr/bin/touch gfanoutput; /bin/rm gfaninput; /bin/rm gfanoutput"); 4325 // we return a list which contains the 4324 system("sh","cd /tmp; /usr/bin/touch gfaninput; /usr/bin/touch gfanoutput; /bin/rm gfaninput; /bin/rm gfanoutput"); 4325 // we return a list which contains the 4326 4326 // parametrisation ring (with the parametrisation ideal) 4327 // and the string representing the maximal ideal 4327 // and the string representing the maximal ideal 4328 4328 // describing the necessary field extension 4329 4329 return(list(PARARing,tweight,PARAm)); … … 4334 4334 static proc findzeros (ideal i,intvec w,list #) 4335 4335 "USAGE: findzeros(i,w[,#]); i ideal, w intvec, # an optional list 4336 ASSUME: i is an ideal in Q[t,x_1,...,x_n,X_n+1,...,X_m] and 4336 ASSUME: i is an ideal in Q[t,x_1,...,x_n,X_n+1,...,X_m] and 4337 4337 w=(w_0,...,w_n,0,...,0) is in the tropical variety of i 4338 RETURN: list, l[1] = is polynomial ring containing an associated maximal 4339 ideal m of the w-initial ideal of i which does not 4338 RETURN: list, l[1] = is polynomial ring containing an associated maximal 4339 ideal m of the w-initial ideal of i which does not 4340 4340 contain any monomial and where the variables 4341 which do not lead to a field extension have already 4342 been eliminated, and containing a list a such that 4343 the non-zero entries of a correspond to the values 4341 which do not lead to a field extension have already 4342 been eliminated, and containing a list a such that 4343 the non-zero entries of a correspond to the values 4344 4344 of the zero of the associated maximal ideal for the 4345 4345 eliminated variables 4346 4346 l[2] = number of variables which have not been eliminated 4347 l[3] = intvec, if the entry is one then the corresponding 4347 l[3] = intvec, if the entry is one then the corresponding 4348 4348 variable has not been eliminated 4349 NOTE: the procedure is called from inside the recursive procedure 4349 NOTE: the procedure is called from inside the recursive procedure 4350 4350 tropicalparametriseNoabs; 4351 if it is called in the first recursion, the list #[1] contains 4352 the t-initial ideal of i w.r.t. w, otherwise #[1] is an integer, 4351 if it is called in the first recursion, the list #[1] contains 4352 the t-initial ideal of i w.r.t. w, otherwise #[1] is an integer, 4353 4353 one more than the number of true variables x_1,...,x_n" 4354 4354 { 4355 def BASERING=basering; 4355 def BASERING=basering; 4356 4356 // set anzahlvariablen to the number of true variables 4357 4357 if (typeof(#[1])=="int") … … 4359 4359 int anzahlvariablen=#[1]; 4360 4360 // compute the initial ideal of i 4361 // - the last 1 just means that the variable t is the last 4361 // - the last 1 just means that the variable t is the last 4362 4362 // variable in the ring 4363 4363 ideal ini=tInitialIdeal(i,w,1); … … 4366 4366 { 4367 4367 int anzahlvariablen=nvars(basering); 4368 ideal ini=#[1]; // the t-initial ideal has been computed 4368 ideal ini=#[1]; // the t-initial ideal has been computed 4369 4369 // in before and was handed over 4370 4370 } 4371 // move to a polynomial ring with global monomial ordering 4371 // move to a polynomial ring with global monomial ordering 4372 4372 // - the variable t is superflous 4373 4373 ideal variablen; 4374 4374 for (int j=1;j<=nvars(basering)-1;j++) 4375 { 4375 { 4376 4376 variablen=variablen+var(j); 4377 4377 } … … 4379 4379 ideal ini=imap(BASERING,ini); 4380 4380 // compute the associated primes of the initialideal 4381 // ordering the maximal ideals shall help to avoid 4381 // ordering the maximal ideals shall help to avoid 4382 4382 // unneccessary field extensions 4383 4383 list maximalideals=ordermaximalidealsNoabs(minAssGTZ(std(ini)),anzahlvariablen); 4384 4384 ideal m=maximalideals[1][1]; // the first associated maximal ideal 4385 4385 int neuvar=maximalideals[1][2]; // the number of new variables needed 4386 intvec neuevariablen=maximalideals[1][3]; // the information which variable 4386 intvec neuevariablen=maximalideals[1][3]; // the information which variable 4387 4387 // leads to a new one 4388 list a=maximalideals[1][4]; // a_k is the kth component of a 4388 list a=maximalideals[1][4]; // a_k is the kth component of a 4389 4389 // zero of m, if it is not zero 4390 // eliminate from m the superflous variables, that is those ones, 4390 // eliminate from m the superflous variables, that is those ones, 4391 4391 // which do not lead to a new variable 4392 4392 poly elimvars=1; … … 4398 4398 } 4399 4399 } 4400 m=eliminate(m,elimvars); 4401 export(a); 4400 m=eliminate(m,elimvars); 4401 export(a); 4402 4402 export(m); 4403 4403 list m_ring=INITIALRING,neuvar,neuevariablen; … … 4411 4411 static proc basictransformideal (ideal i,intvec w,list m_ring,list #) 4412 4412 "USAGE: basictransformideal(i,w,m_ring[,#]); i ideal, w intvec, m_ring list, # an optional list 4413 ASSUME: i is an ideal in Q[t,x_1,...,x_n,X_1,...,X_k], 4414 w=(w_0,...,w_n,0,...,0) is in the tropical variety of i, and 4413 ASSUME: i is an ideal in Q[t,x_1,...,x_n,X_1,...,X_k], 4414 w=(w_0,...,w_n,0,...,0) is in the tropical variety of i, and 4415 4415 m_ring contains a ring containing a maximal ideal m needed 4416 to describe the field extension over which a corresponding 4417 associated maximal ideal of the initialideal of i, considered 4418 in (Q[X_1,...,X_k]/m_alt)(t)[x_1,...,x_n], has a zero, and 4416 to describe the field extension over which a corresponding 4417 associated maximal ideal of the initialideal of i, considered 4418 in (Q[X_1,...,X_k]/m_alt)(t)[x_1,...,x_n], has a zero, and 4419 4419 containing a list a describing the zero of m, and m_ring contains 4420 4420 the information how many new variables are needed for m … … 4423 4423 l[3] = ideal, the maximal ideal m 4424 4424 or l[1] = ring which contains the ideals i and m, and the list a 4425 NOTE: the procedure is called from inside the recursive procedure 4425 NOTE: the procedure is called from inside the recursive procedure 4426 4426 tropicalparametriseNoabs; 4427 if it is called in the first recursion, the list # is empty, 4427 if it is called in the first recursion, the list # is empty, 4428 4428 otherwise #[1] is an integer, the number of true variables x_1,...,x_n; 4429 during the procedure we check if a field extension is necessary 4430 to express a zero (a_1,...,a_n) of m; if so, we have to introduce 4431 new variables and a list containing a ring is returned, otherwise 4432 the list containing i, a and m is returned; 4433 the ideal m will be changed during the procedure since all variables 4429 during the procedure we check if a field extension is necessary 4430 to express a zero (a_1,...,a_n) of m; if so, we have to introduce 4431 new variables and a list containing a ring is returned, otherwise 4432 the list containing i, a and m is returned; 4433 the ideal m will be changed during the procedure since all variables 4434 4434 which reduce to a polynomial in X_1,...,X_k modulo m will be eliminated, 4435 4435 while the others are replaced by new variables X_k+1,...,X_k'" … … 4443 4443 wdegs[j]=deg(i[j],intvec(w[2..size(w)],w[1])); 4444 4444 } 4445 // how many variables are true variables, 4445 // how many variables are true variables, 4446 4446 // and how many come from the field extension 4447 4447 // only real variables have to be transformed … … 4458 4458 // get the information if any new variables are needed from m_ring 4459 4459 int neuvar=m_ring[2]; // number of variables which have to be added 4460 intvec neuevariablen=m_ring[3]; // [i]=1, if for the ith comp. 4460 intvec neuevariablen=m_ring[3]; // [i]=1, if for the ith comp. 4461 4461 // of a zero of m a new variable is needed 4462 4462 def MRING=m_ring[1]; // MRING contains a and m 4463 list a=imap(MRING,a); // (a_1,...,a_n)=(a[2],...,a[n+1]) will be 4463 list a=imap(MRING,a); // (a_1,...,a_n)=(a[2],...,a[n+1]) will be 4464 4464 // a common zero of the ideal m 4465 ideal m=std(imap(MRING,m)); // m is zero, if neuvar==0, 4465 ideal m=std(imap(MRING,m)); // m is zero, if neuvar==0, 4466 4466 // otherwise we change the ring anyway 4467 // if a field extension is needed, then extend the polynomial 4467 // if a field extension is needed, then extend the polynomial 4468 4468 // ring by new variables X_k+1,...,X_k'; 4469 4469 if (neuvar>0) 4470 4470 { 4471 // change to a ring where for each variable needed 4471 // change to a ring where for each variable needed 4472 4472 // in m a new variable has been introduced 4473 4473 ideal variablen; … … 4480 4480 // map i into the new ring 4481 4481 ideal i=imap(BASERING,i); 4482 // define a map phi which maps the true variables, which are not 4482 // define a map phi which maps the true variables, which are not 4483 4483 // reduced to polynomials in the additional variables modulo m, to 4484 // the corresponding newly introduced variables, and which maps 4484 // the corresponding newly introduced variables, and which maps 4485 4485 // the old additional variables to themselves 4486 4486 ideal phiideal; 4487 4487 k=1; 4488 for (j=2;j<=size(neuevariablen);j++) // starting with 2, since the 4488 for (j=2;j<=size(neuevariablen);j++) // starting with 2, since the 4489 4489 { // first entry corresponds to t 4490 4490 if(neuevariablen[j]==1) … … 4495 4495 else 4496 4496 { 4497 phiideal[j-1]=0; 4497 phiideal[j-1]=0; 4498 4498 } 4499 4499 } … … 4502 4502 phiideal=phiideal,X(1..nvars(BASERING)-anzahlvariablen); 4503 4503 } 4504 map phi=MRING,phiideal; 4505 // map m and a to the new ring via phi, so that the true variables 4504 map phi=MRING,phiideal; 4505 // map m and a to the new ring via phi, so that the true variables 4506 4506 // in m and a are replaced by 4507 4507 // the corresponding newly introduced variables … … 4509 4509 list a=phi(a); 4510 4510 } 4511 // replace now the zeros among the a_j by the corresponding 4511 // replace now the zeros among the a_j by the corresponding 4512 4512 // newly introduced variables; 4513 // note that no component of a can be zero 4513 // note that no component of a can be zero 4514 4514 // since the maximal ideal m contains no variable! 4515 // moreover, substitute right away in the ideal i 4515 // moreover, substitute right away in the ideal i 4516 4516 // the true variable x_j by (a_j+x_j)*t^w_j 4517 4517 zaehler=nvars(BASERING)-anzahlvariablen+1; 4518 for (j=1;j<=anzahlvariablen;j++) 4518 for (j=1;j<=anzahlvariablen;j++) 4519 4519 { 4520 4520 if ((a[j]==0) and (j!=1)) // a[1]=0, since t->t^w_0 4521 { 4521 { 4522 4522 a[j]=X(zaehler); 4523 4523 zaehler++; … … 4526 4526 { 4527 4527 if (j!=1) // corresponds to x_(j-1) -- note t is the last variable 4528 { 4528 { 4529 4529 i[k]=substitute(i[k],var(j-1),(a[j]+var(j-1))*t^(-w[j])); 4530 4530 } … … 4538 4538 for (j=1;j<=ncols(i);j++) 4539 4539 { 4540 if (wdegs[j]<0) // if wdegs[j]==0 there is no need to divide, and 4540 if (wdegs[j]<0) // if wdegs[j]==0 there is no need to divide, and 4541 4541 { // we made sure that it is no positive 4542 4542 i[j]=i[j]/t^(-wdegs[j]); 4543 4543 } 4544 4544 } 4545 // since we want to consider i now in the ring 4545 // since we want to consider i now in the ring 4546 4546 // (Q[X_1,...,X_k']/m)[t,x_1,...,x_n] 4547 // we can reduce i modulo m, so that "constant terms" 4547 // we can reduce i modulo m, so that "constant terms" 4548 4548 // which are "zero" since they 4549 4549 // are in m will disappear; simplify(...,2) then really removes them 4550 4550 i=simplify(reduce(i,m),2); 4551 // if new variables have been introduced, we have 4551 // if new variables have been introduced, we have 4552 4552 // to return the ring containing i, a and m 4553 4553 // otherwise we can simply return a list containing i, a and m … … 4570 4570 static proc testw (ideal i,intvec w,int anzahlvariablen,list #) 4571 4571 "USAGE: testw(i,w,n); i ideal, w intvec, n number 4572 ASSUME: i is an ideal in Q[t,x_1,...,x_n,X_1,...,X_k] and 4573 w=(w_0,...,w_n,0,...,0) 4574 RETURN: int b, 0 if the t-initial ideal of i considered in 4572 ASSUME: i is an ideal in Q[t,x_1,...,x_n,X_1,...,X_k] and 4573 w=(w_0,...,w_n,0,...,0) 4574 RETURN: int b, 0 if the t-initial ideal of i considered in 4575 4575 Q(X_1,...,X_k)[t,x_1,...,x_n] is monomial free, 1 else 4576 4576 NOTE: the procedure is called by tinitialform" … … 4586 4586 ideal tin=tInitialIdeal(i,w,1); 4587 4587 } 4588 4588 4589 4589 int j; 4590 4590 ideal variablen; … … 4618 4618 def BASERING=basering; 4619 4619 if (anzahlvariablen<nvars(basering)) 4620 { 4620 { 4621 4621 execute("ring TINRING=("+charstr(basering)+","+string(Parameter)+"),("+string(variablen)+"),dp;"); 4622 4622 } … … 4628 4628 poly monom=imap(BASERING,monom); 4629 4629 return(radicalMemberShip(monom,tin)); 4630 } 4630 } 4631 4631 4632 4632 ///////////////////////////////////////////////////////////////////////// … … 4634 4634 static proc simplifyToOrder (poly f) 4635 4635 "USAGE: simplifyToOrder(f); f a polynomial 4636 ASSUME: f is a polynomial in Q(t)[x_1,...,x_n] 4636 ASSUME: f is a polynomial in Q(t)[x_1,...,x_n] 4637 4637 RETURN: list, l[1] = t-order of leading term of f 4638 4638 l[2] = the rational coefficient of the term of lowest t-order … … 4657 4657 static proc scalarproduct (intvec w,intvec v) 4658 4658 "USAGE: scalarproduct(w,v); w,v intvec 4659 ASSUME: w and v are integer vectors of the same length 4659 ASSUME: w and v are integer vectors of the same length 4660 4660 RETURN: int, the scalarproduct of v and w 4661 4661 NOTE: the procedure is called by tropicalparametriseNoabs" … … 4715 4715 "USAGE: ordermaximalidealsNoabs(minassi); minassi list 4716 4716 ASSUME: minassi is a list of maximal ideals 4717 RETURN: list, the procedure orders the maximal ideals in minassi according 4718 to how many new variables are needed to describe the zeros 4717 RETURN: list, the procedure orders the maximal ideals in minassi according 4718 to how many new variables are needed to describe the zeros 4719 4719 of the ideal 4720 4720 l[j][1] = jth maximal ideal 4721 4721 l[j][2] = the number of variables needed 4722 l[j][3] = intvec, if for the kth variable a new variable is 4723 needed to define the corresponding zero of 4722 l[j][3] = intvec, if for the kth variable a new variable is 4723 needed to define the corresponding zero of 4724 4724 l[j][1], then the k+1st entry is one 4725 l[j][4] = list, if for the kth variable no new variable is 4726 needed to define the corresponding zero of 4725 l[j][4] = list, if for the kth variable no new variable is 4726 needed to define the corresponding zero of 4727 4727 l[j][1], then its value is the k+1st entry 4728 4728 NOTE: if a maximal ideal contains a variable, it is removed from the list; … … 4733 4733 int pruefer; // is set one if a maximal ideal contains a variable 4734 4734 list minassisort; // will contain the output 4735 for (j=1;j<=size(minassi);j++){minassisort[j]=0;} // initialise minassisort 4735 for (j=1;j<=size(minassi);j++){minassisort[j]=0;} // initialise minassisort 4736 4736 // to fix its initial length 4737 4737 list zwischen; // needed for reordering 4738 4738 list a;// (a_1,...,a_n)=(a[2],...,a[n+1]) will be a common zero of the ideal m 4739 4739 poly nf; // normalform of a variable w.r.t. m 4740 intvec neuevariablen; // ith entry is 1, if for the ith component of a zero 4740 intvec neuevariablen; // ith entry is 1, if for the ith component of a zero 4741 4741 // of m a new variable is needed 4742 4742 intvec testvariablen; // integer vector of length n=number of variables 4743 // compute for each maximal ideal the number of new variables, 4743 // compute for each maximal ideal the number of new variables, 4744 4744 // which are needed to describe 4745 // its zeros -- note, a new variable is needed if modulo 4746 // the maximal ideal it does not reduce 4745 // its zeros -- note, a new variable is needed if modulo 4746 // the maximal ideal it does not reduce 4747 4747 // to something which only depends on the following variables; 4748 // if no new variable is needed, then store the value 4749 // a variable reduces to in the list a; 4748 // if no new variable is needed, then store the value 4749 // a variable reduces to in the list a; 4750 4750 for (j=size(minassi);j>=1;j--) 4751 4751 { 4752 a[1]=poly(0); // the first entry in a and in neuevariablen 4752 a[1]=poly(0); // the first entry in a and in neuevariablen 4753 4753 // corresponds to the variable t, 4754 4754 neuevariablen[1]=0; // which is not present in the INITIALRING … … 4758 4758 { 4759 4759 nf=reduce(var(k),minassi[j]); 4760 // if a variable reduces to zero, then the maximal ideal 4760 // if a variable reduces to zero, then the maximal ideal 4761 4761 // contains a variable and we can delete it 4762 4762 if (nf==0) … … 4764 4764 pruefer=1; 4765 4765 } 4766 // set the entries of testvariablen corresponding to the first 4766 // set the entries of testvariablen corresponding to the first 4767 4767 // k variables to 1, and the others to 0 4768 4768 for (l=1;l<=nvars(basering);l++) 4769 4769 { 4770 4770 if (l<=k) 4771 { 4771 { 4772 4772 testvariablen[l]=1; 4773 4773 } … … 4777 4777 } 4778 4778 } 4779 // if the variable x_j reduces to a polynomial 4779 // if the variable x_j reduces to a polynomial 4780 4780 // in x_j+1,...,x_n,X_1,...,X_k modulo m 4781 // then we can eliminate x_j from the maximal ideal 4781 // then we can eliminate x_j from the maximal ideal 4782 4782 // (since we do not need any 4783 // further field extension to express a_j) and a_j 4783 // further field extension to express a_j) and a_j 4784 4784 // will just be this normalform, 4785 4785 // otherwise we have to introduce a new variable in order to express a_j; … … 4788 4788 a[k+1]=nf; // a_k is the normal form of the kth variable modulo m 4789 4789 neuevariablen[k+1]=0; // no new variable is needed 4790 } 4790 } 4791 4791 else 4792 4792 { 4793 a[k+1]=poly(0); // a_k is set to zero until we have 4793 a[k+1]=poly(0); // a_k is set to zero until we have 4794 4794 // introduced the new variable 4795 4795 neuevariablen[k+1]=1; … … 4799 4799 // if the maximal ideal contains a variable, we simply delete it 4800 4800 if (pruefer==0) 4801 { 4801 { 4802 4802 minassisort[j]=list(minassi[j],neuvar,neuevariablen,a); 4803 4803 } 4804 // otherwise we store the information on a, 4804 // otherwise we store the information on a, 4805 4805 // neuevariablen and neuvar together with the ideal 4806 4806 else … … 4811 4811 } 4812 4812 } 4813 // sort the maximal ideals ascendingly according to 4813 // sort the maximal ideals ascendingly according to 4814 4814 // the number of new variables needed to 4815 4815 // express the zero of the maximal ideal … … 4818 4818 l=j; 4819 4819 for (k=j-1;k>=1;k--) 4820 { 4820 { 4821 4821 if (minassisort[l][2]<minassisort[k][2]) 4822 4822 { … … 4836 4836 "USAGE: displaypoly(p,N,wj,w1); p poly, N, wj, w1 int 4837 4837 ASSUME: p is a polynomial in r=(0,X(1..k)),t,ls 4838 RETURN: string, the string of t^-wj/w1*p(t^1/N) 4838 RETURN: string, the string of t^-wj/w1*p(t^1/N) 4839 4839 NOTE: the procedure is called from displayTropicalLifting" 4840 4840 { … … 4854 4854 { 4855 4855 if (koeffizienten[j-ord(p)+1]!=0) 4856 { 4856 { 4857 4857 if ((j-(N*wj)/w1)==0) 4858 4858 { … … 4904 4904 static proc displaycoef (poly p) 4905 4905 "USAGE: displaycoef(p); p poly 4906 RETURN: string, the string of p where brackets around 4906 RETURN: string, the string of p where brackets around 4907 4907 have been added if they were missing 4908 4908 NOTE: the procedure is called from displaypoly" … … 4976 4976 static proc tropicalliftingresubstitute (ideal i,list liftring,int N,list #) 4977 4977 "USAGE: tropicalliftingresubstitute(i,L,N[,#]); i ideal, L list, N int, # string 4978 ASSUME: i is an ideal and L[1] is a ring which contains the lifting of a 4979 point in the tropical variety of i computed with tropicalLifting; 4980 t has to be replaced by t^1/N in the lifting; #[1]=m is the string 4981 of the maximal ideal defining the necessary field extension as 4978 ASSUME: i is an ideal and L[1] is a ring which contains the lifting of a 4979 point in the tropical variety of i computed with tropicalLifting; 4980 t has to be replaced by t^1/N in the lifting; #[1]=m is the string 4981 of the maximal ideal defining the necessary field extension as 4982 4982 computed by tropicalLifting, if #[1] is present 4983 4983 RETURN: string, the lifting has been substituted into i … … 5002 5002 ideal i=imap(BASERING,i); 5003 5003 } 5004 } 5004 } 5005 5005 else 5006 5006 { … … 5015 5015 } 5016 5016 // map the resulting i back to LIFTRing; 5017 // if noAbs, then reduce i modulo the maximal ideal 5017 // if noAbs, then reduce i modulo the maximal ideal 5018 5018 // before going back to LIFTRing 5019 5019 if ((size(parstr(LIFTRing))!=0) and size(#)>0) … … 5032 5032 for (j=1;j<=ncols(i);j++) 5033 5033 { 5034 SUBSTTEST[j]=displaypoly(i[j],N,0,1); 5034 SUBSTTEST[j]=displaypoly(i[j],N,0,1); 5035 5035 } 5036 5036 return(SUBSTTEST); … … 5042 5042 /// - eliminatecomponents 5043 5043 /// - findzerosAndBasictransform 5044 /// - ordermaximalideals 5044 /// - ordermaximalideals 5045 5045 /////////////////////////////////////////////////////////////////////////////// 5046 5046 5047 5047 static proc tropicalparametrise (ideal i,intvec ww,int ordnung,int gfanold,int findall,int nogfan,list #) 5048 5048 "USAGE: tropicalparametrise(i,tw,ord,gf,fa,ng[,#]); i ideal, tw intvec, ord int, gf,fa,ng int, # opt. list 5049 ASSUME: - i is an ideal in Q[t,x_1,...,x_n,@a], tw=(w_0,w_1,...,w_n,0) 5050 and (w_0,...,w_n,0) is in the tropical variety of i, 5051 and ord is the order up to which a point in V(i) 5052 over K{{t}} lying over w shall be computed; 5053 - moreover, @a should be not be there if the procedure is not 5049 ASSUME: - i is an ideal in Q[t,x_1,...,x_n,@a], tw=(w_0,w_1,...,w_n,0) 5050 and (w_0,...,w_n,0) is in the tropical variety of i, 5051 and ord is the order up to which a point in V(i) 5052 over K{{t}} lying over w shall be computed; 5053 - moreover, @a should be not be there if the procedure is not 5054 5054 called recursively; 5055 5055 - the point in the tropical variety is supposed to lie in the 5056 5056 NEGATIVE orthant; 5057 - the ideal is zero-dimensional when considered in 5058 (K(t)[@a]/m)[x_1,...,x_n], where m=#[2] is a maximal ideal in K[@a]; 5057 - the ideal is zero-dimensional when considered in 5058 (K(t)[@a]/m)[x_1,...,x_n], where m=#[2] is a maximal ideal in K[@a]; 5059 5059 - gf is 0 if version 2.2 or larger is used and it is 1 else 5060 5060 - fa is 1 if all solutions should be found … … 5063 5063 l[2] = int 5064 5064 NOTE: - the procedure is also called recursively by itself, and 5065 if it is called in the first recursion, the list # is empty, 5066 otherwise #[1] is an integer, one more than the number of 5067 true variables x_1,...,x_n, and #[2] will contain the maximal 5068 ideal m in the variable @a by which the ring K[t,x_1,...,x_n,@a] 5069 should be divided to work correctly in L[t,x_1,...,x_n] where 5065 if it is called in the first recursion, the list # is empty, 5066 otherwise #[1] is an integer, one more than the number of 5067 true variables x_1,...,x_n, and #[2] will contain the maximal 5068 ideal m in the variable @a by which the ring K[t,x_1,...,x_n,@a] 5069 should be divided to work correctly in L[t,x_1,...,x_n] where 5070 5070 L=Q[@a]/m is a field extension of K 5071 - the ring l[1] contains an ideal PARA, which contains the 5072 parametrisation of a point in V(i) lying over w up to the first 5071 - the ring l[1] contains an ideal PARA, which contains the 5072 parametrisation of a point in V(i) lying over w up to the first 5073 5073 ord terms; 5074 - the string m contains the code of the maximal ideal m, by which we 5074 - the string m contains the code of the maximal ideal m, by which we 5075 5075 have to divide K[@a] in order to have the appropriate field extension 5076 5076 over which the parametrisation lives; 5077 5077 - and if the integer l[3] is N then t has to be replaced by t^1/N in the 5078 parametrisation, or alternatively replace t by t^N in the defining 5078 parametrisation, or alternatively replace t by t^N in the defining 5079 5079 ideal 5080 - the procedure REQUIRES that the program GFAN is installed 5080 - the procedure REQUIRES that the program GFAN is installed 5081 5081 on your computer" 5082 5082 { … … 5084 5084 int recursively; // is set 1 if the procedure is called recursively by itself 5085 5085 int ii,jj,kk,ll,jjj,kkk,lll; 5086 if (typeof(#[1])=="int") // this means the precedure has been 5086 if (typeof(#[1])=="int") // this means the precedure has been 5087 5087 { // called recursively 5088 // how many variables are true variables, and how many come 5088 // how many variables are true variables, and how many come 5089 5089 // from the field extension 5090 5090 // only true variables have to be transformed 5091 5091 int anzahlvariablen=#[1]; 5092 5092 // find the zeros of the w-initial ideal and transform the ideal i; 5093 // findzeros and basictransformideal need to know 5093 // findzeros and basictransformideal need to know 5094 5094 // how many of the variables are true variables 5095 5095 // and do the basic transformation as well … … 5099 5099 else // the procedure has been called by tropicalLifting 5100 5100 { 5101 // how many variables are true variables, and 5101 // how many variables are true variables, and 5102 5102 // how many come from the field extension 5103 5103 // only true variables have to be transformed 5104 5104 int anzahlvariablen=nvars(basering); 5105 list zerolist; // will carry the zeros which are 5106 //computed in the recursion steps 5105 list zerolist; // will carry the zeros which are 5106 //computed in the recursion steps 5107 5107 // the initial ideal of i has been handed over as #[1] 5108 5108 ideal ini=#[1]; 5109 5109 // find the zeros of the w-initial ideal and transform the ideal i; 5110 // we should hand the t-initial ideal ine to findzeros, 5110 // we should hand the t-initial ideal ine to findzeros, 5111 5111 // since we know it already; 5112 5112 // and do the basic transformation as well … … 5114 5114 } 5115 5115 list wneulist; // carries all newly computed weight vector 5116 intvec wneu; // carries the newly computed weight vector 5116 intvec wneu; // carries the newly computed weight vector 5117 5117 int tweight; // carries the weight of t 5118 list PARALIST; // carries the result when tropicalparametrise 5118 list PARALIST; // carries the result when tropicalparametrise 5119 5119 // is recursively called 5120 5120 list eliminaterings; // carries the result of eliminatecomponents … … 5125 5125 list liftings,partliftings; // the computed liftings (all resp. partly) 5126 5126 // consider each ring which has been returned when computing the zeros of the 5127 // the t-initial ideal, equivalently, consider 5127 // the t-initial ideal, equivalently, consider 5128 5128 // each zero which has been returned 5129 5129 for (jj=1;jj<=size(trring);jj++) … … 5131 5131 def TRRING=trring[jj]; 5132 5132 setring TRRING; 5133 // check if a certain number of components lead to suitable 5133 // check if a certain number of components lead to suitable 5134 5134 // solutions with zero components; 5135 5135 // compute them all if findall==1 5136 5136 eliminaterings=eliminatecomponents(i,m,oldanzahlvariablen,findall,oldanzahlvariablen-1,deletedvariables); 5137 // consider each of the rings returned by eliminaterings ... 5137 // consider each of the rings returned by eliminaterings ... 5138 5138 // there is at least one !!! 5139 5139 for (ii=1;ii<=size(eliminaterings);ii++) 5140 5140 { 5141 5141 // #variables which have been eliminated 5142 numberdeletedvariables=oldanzahlvariablen-eliminaterings[ii][2]; 5142 numberdeletedvariables=oldanzahlvariablen-eliminaterings[ii][2]; 5143 5143 // #true variables which remain (including t) 5144 anzahlvariablen=eliminaterings[ii][2]; 5144 anzahlvariablen=eliminaterings[ii][2]; 5145 5145 // a 1 in this vector says that variable was eliminated 5146 deletedvariables=eliminaterings[ii][3]; 5146 deletedvariables=eliminaterings[ii][3]; 5147 5147 setring TRRING; // set TRRING - this is important for the loop 5148 5148 // pass the ring computed by eliminatecomponents 5149 def PREGFANRING=eliminaterings[ii][1]; 5149 def PREGFANRING=eliminaterings[ii][1]; 5150 5150 setring PREGFANRING; 5151 5151 poly m=imap(TRRING,m); // map the maximal ideal to this ring 5152 5152 list zero=imap(TRRING,zero); // map the vector of zeros to this ring 5153 // now we have to compute a point ww on the tropical 5153 // now we have to compute a point ww on the tropical 5154 5154 // variety of the transformed ideal i; 5155 // of course, we only have to do so, if we have 5155 // of course, we only have to do so, if we have 5156 5156 // not yet reached the order up to which we 5157 5157 // were supposed to do our computations 5158 if ((ordnung>1) and (anzahlvariablen>1)) // if only t remains, 5158 if ((ordnung>1) and (anzahlvariablen>1)) // if only t remains, 5159 5159 { // all true variables are gone 5160 5160 if (nogfan!=1) 5161 { 5161 { 5162 5162 // pass to a ring which has variables which are suitable for gfan 5163 5163 execute("ring GFANRING=("+string(char(basering))+"),(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z),dp;"); 5164 ideal phiideal=b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z; 5164 ideal phiideal=b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z; 5165 5165 phiideal[nvars(PREGFANRING)]=a; // map t to a 5166 map phi=PREGFANRING,phiideal; 5166 map phi=PREGFANRING,phiideal; 5167 5167 ideal II=phi(i); 5168 // homogenise the ideal II with the first not yet 5169 // used variable in our ring, since gfan 5170 // only handles homogenous ideals; in principle for this 5168 // homogenise the ideal II with the first not yet 5169 // used variable in our ring, since gfan 5170 // only handles homogenous ideals; in principle for this 5171 5171 // one has first to compute a 5172 // standard basis of II and homogenise that, 5173 // but for the tropical variety (says Anders) 5172 // standard basis of II and homogenise that, 5173 // but for the tropical variety (says Anders) 5174 5174 // it suffices to homogenise an arbitrary system of generators 5175 // II=groebner(II); 5175 // II=groebner(II); 5176 5176 II=homog(II,maxideal(1)[nvars(PREGFANRING)+1]); 5177 5177 // if gfan version >= 0.3.0 is used and the characteristic … … 5211 5211 int goon=1; 5212 5212 trop; 5213 "CHOOSE A RAY IN THE OUTPUT OF GFAN WHICH HAS ONLY"; 5213 "CHOOSE A RAY IN THE OUTPUT OF GFAN WHICH HAS ONLY"; 5214 5214 "NON-POSITIVE ENTRIES AND STARTS WITH A NEGATIVE ONE,"; 5215 5215 "E.G. (-3,-4,-1,-5,0,0,0) - the last entry will always be 0 -"; … … 5218 5218 "IF YOU WANT wneu TO BE TESTED, THEN SET goon=0;"; 5219 5219 ~ 5220 // THIS IS NOT NECESSARY !!!! IF WE COMPUTE NOT ONLY 5220 // THIS IS NOT NECESSARY !!!! IF WE COMPUTE NOT ONLY 5221 5221 // THE TROPICAL PREVARIETY 5222 // test, if wneu really is in the tropical variety 5222 // test, if wneu really is in the tropical variety 5223 5223 while (goon==0) 5224 5224 { … … 5238 5238 { 5239 5239 system("sh","gfan_tropicallifting -n "+string(anzahlvariablen)+" --noMult -c < /tmp/gfaninput > /tmp/gfanoutput"); 5240 // read the result from gfan and store it to a string, 5240 // read the result from gfan and store it to a string, 5241 5241 // which in a later version 5242 5242 // should be interpreded by Singular … … 5261 5261 } 5262 5262 } 5263 // if we have not yet computed our parametrisation up to 5263 // if we have not yet computed our parametrisation up to 5264 5264 // the required order and 5265 // zero is not yet a solution, then we have to go on 5265 // zero is not yet a solution, then we have to go on 5266 5266 // by calling the procedure recursively; 5267 5267 // if all variables were deleted, then i=0 and thus anzahlvariablen==0 5268 5268 lll=0; 5269 5269 if ((ordnung>1) and (anzahlvariablen>1)) 5270 { 5270 { 5271 5271 partliftings=list(); // initialise partliftings 5272 // we call the procedure with the transformed 5272 // we call the procedure with the transformed 5273 5273 // ideal i, the new weight vector, with the 5274 // required order lowered by one, and with 5274 // required order lowered by one, and with 5275 5275 // additional parameters, namely the number of 5276 // true variables and the maximal ideal that 5276 // true variables and the maximal ideal that 5277 5277 // was computed so far to describe the field extension 5278 5278 for (kk=1;kk<=size(wneulist);kk++) … … 5280 5280 wneu=wneulist[kk]; 5281 5281 PARALIST=tropicalparametrise(i,wneu,ordnung-1,gfanold,findall,nogfan,anzahlvariablen,zero); 5282 // the output will be a ring, in which the 5282 // the output will be a ring, in which the 5283 5283 // parametrisation lives, and a string, which contains 5284 5284 // the maximal ideal that describes the necessary field extension 5285 5285 for (ll=1;ll<=size(PARALIST);ll++) 5286 { 5286 { 5287 5287 def PARARing=PARALIST[ll][1]; 5288 5288 tweight=-ww[1]*PARALIST[ll][2]; 5289 5289 setring PARARing; 5290 // if some variables have been eliminated 5291 // in before, then we have to insert zeros 5290 // if some variables have been eliminated 5291 // in before, then we have to insert zeros 5292 5292 // into the parametrisation for those variables 5293 5293 if (numberdeletedvariables>0) … … 5295 5295 ideal PARAneu=PARA; 5296 5296 kkk=0; 5297 for (jjj=1;jjj<=anzahlvariablen+numberdeletedvariables-1;jjj++) 5297 for (jjj=1;jjj<=anzahlvariablen+numberdeletedvariables-1;jjj++) 5298 5298 { // t admits no parametrisation 5299 5299 if (deletedvariables[jjj]!=1) … … 5315 5315 } 5316 5316 } 5317 // otherwise we are done and we can start 5317 // otherwise we are done and we can start 5318 5318 // to compute the last step of the parametrisation 5319 5319 else 5320 5320 { 5321 // we define the weight of t, i.e. in the 5321 // we define the weight of t, i.e. in the 5322 5322 // parametrisation t has to be replaced by t^1/tweight 5323 5323 tweight=-ww[1]; 5324 // if additional variables were necessary, 5324 // if additional variables were necessary, 5325 5325 // we introduce them now as parameters; 5326 // in any case the parametrisation ring will 5327 // have only one variable, namely t, 5328 // and its order will be local, so that it 5326 // in any case the parametrisation ring will 5327 // have only one variable, namely t, 5328 // and its order will be local, so that it 5329 5329 // displays the lowest term in t first 5330 5330 if (anzahlvariablen<nvars(basering)) … … 5338 5338 } 5339 5339 ideal PARA; // will contain the parametrisation 5340 // we start by initialising the entries to be zero; 5340 // we start by initialising the entries to be zero; 5341 5341 // one entry for each true variable 5342 // here we also have to consider the variables 5342 // here we also have to consider the variables 5343 5343 // that we have eliminated in before 5344 5344 for (jjj=1;jjj<=anzahlvariablen+numberdeletedvariables-1;jjj++) … … 5352 5352 kill PARARing; 5353 5353 } 5354 // we now have to change the parametrisation by 5354 // we now have to change the parametrisation by 5355 5355 // reverting the transformations that we have done 5356 5356 for (lll=1;lll<=size(partliftings);lll++) 5357 5357 { 5358 if (size(partliftings[lll])==2) // when tropicalparametrise is called 5359 { // for the last time, it does not enter the part, where wneu is 5358 if (size(partliftings[lll])==2) // when tropicalparametrise is called 5359 { // for the last time, it does not enter the part, where wneu is 5360 5360 wneu=-1; // defined and the variable t should have weight -1 5361 5361 } … … 5372 5372 PARA[jjj]=(PARA[jjj]+zeros[size(zeros)][jjj+1])*t^(ww[jjj+1]*tweight/ww[1]); 5373 5373 } 5374 // delete the last entry in zero, since that one has 5374 // delete the last entry in zero, since that one has 5375 5375 // been used for the transformation 5376 5376 zeros=delete(zeros,size(zeros)); 5377 // in order to avoid redefining commands an empty 5377 // in order to avoid redefining commands an empty 5378 5378 // zeros list should be removed 5379 5379 if (size(zeros)==0) … … 5391 5391 } 5392 5392 // kill the gfan files in /tmp 5393 system("sh","cd /tmp; /usr/bin/touch gfaninput; /usr/bin/touch gfanoutput; /bin/rm gfaninput; /bin/rm gfanoutput"); 5394 // we return a list which contains lists of the parametrisation 5393 system("sh","cd /tmp; /usr/bin/touch gfaninput; /usr/bin/touch gfanoutput; /bin/rm gfaninput; /bin/rm gfanoutput"); 5394 // we return a list which contains lists of the parametrisation 5395 5395 // rings (with the parametrisation ideal) 5396 5396 // and an integer N such that t should be replaced by t^1/N … … 5402 5402 static proc eliminatecomponents (ideal i,ideal m,int anzahlvariablen,int findall,int lastvar,intvec deletedvariables) 5403 5403 "USAGE: eliminatecomponents(i,m,n,a,v,d); i,m ideal, n,a,v int, d intvec 5404 ASSUME: i is an ideal in Q[x_1,...,x_n,@a,t] and w=(-w_1/w_0,...,-w_n/w_0) 5405 is in the tropical variety of i considered in 5406 Q[@a]/m{{t}}[x_1,...,x_n]; 5407 considered in this ring i is zero-dimensional; @a need not be present 5404 ASSUME: i is an ideal in Q[x_1,...,x_n,@a,t] and w=(-w_1/w_0,...,-w_n/w_0) 5405 is in the tropical variety of i considered in 5406 Q[@a]/m{{t}}[x_1,...,x_n]; 5407 considered in this ring i is zero-dimensional; @a need not be present 5408 5408 in which case m is zero; 1<=v<=n 5409 5409 RETURN: list, L of lists … … 5411 5411 L[j][2] = an integer anzahlvariablen 5412 5412 L[j][3] = an intvec deletedvariables 5413 NOTE: - the procedure is called from inside the recursive 5413 NOTE: - the procedure is called from inside the recursive 5414 5414 procedure tropicalparametrise 5415 - the procedure checks for solutions which have certain 5416 components zero; these are separated from the rest by 5417 elimination and saturation; the integer deletedvariables 5418 records which variables have been eliminated; 5419 the integer anzahlvariablen records how many true variables remain 5415 - the procedure checks for solutions which have certain 5416 components zero; these are separated from the rest by 5417 elimination and saturation; the integer deletedvariables 5418 records which variables have been eliminated; 5419 the integer anzahlvariablen records how many true variables remain 5420 5420 after the elimination 5421 - if the integer a is one then all zeros of the ideal i are 5422 considered and found, otherwise only one is considered, so that L 5421 - if the integer a is one then all zeros of the ideal i are 5422 considered and found, otherwise only one is considered, so that L 5423 5423 has length one" 5424 5424 { … … 5428 5428 // if all solutions have to be found 5429 5429 if (findall==1) 5430 { 5430 { 5431 5431 list saturatelist,eliminatelist; // carry the solution of the two tests 5432 // we test first if there is a solution which has the component 5433 // lastvar zero and 5432 // we test first if there is a solution which has the component 5433 // lastvar zero and 5434 5434 // where the order of each component is strictly positive; 5435 // if so, we add this variable to the ideal and 5435 // if so, we add this variable to the ideal and 5436 5436 // eliminate it - which amounts to 5437 // to projecting the solutions with this component 5437 // to projecting the solutions with this component 5438 5438 // zero to the hyperplane without this component; 5439 // for the test we compute the saturation with 5439 // for the test we compute the saturation with 5440 5440 // respect to t and replace each variable 5441 // x_i and also t by zero -- if the result is zero, 5442 // then 1 is not in I:t^infty 5441 // x_i and also t by zero -- if the result is zero, 5442 // then 1 is not in I:t^infty 5443 5443 // (i.e. there is a solution which has the component lastvar zero) and 5444 // the result lives in the maximal 5445 // ideal <t,x_1,...,[no x_lastvar],...,x_n> so that 5444 // the result lives in the maximal 5445 // ideal <t,x_1,...,[no x_lastvar],...,x_n> so that 5446 5446 // there is a solution which has strictly positive valuation 5447 5447 /* 5448 5448 // DER NACHFOLGENDE TEIL IST MUELL UND WIRD NICHT MEHR GAMACHT 5449 // for the test we simply compute the leading ideal 5449 // for the test we simply compute the leading ideal 5450 5450 // and set all true variables zero; 5451 // since the ordering was an elimination ordering 5451 // since the ordering was an elimination ordering 5452 5452 // with respect to (@a if present and) t 5453 // there remains something not equal to zero 5453 // there remains something not equal to zero 5454 5454 // if and only if there is polynomial which only 5455 // depends on t (and @a if present), but that is 5455 // depends on t (and @a if present), but that is 5456 5456 // a unit in K{{t}}, which would show that there 5457 5457 // is no solution with the component lastvar zero; 5458 // however, we also have to ensure that if there 5458 // however, we also have to ensure that if there 5459 5459 // exists a solution with the component lastvar 5460 // equal to zero then this component has a 5460 // equal to zero then this component has a 5461 5461 // valuation with all strictly positive values!!!!; 5462 // for this we can either saturate the ideal 5462 // for this we can either saturate the ideal 5463 5463 // after elimination with respect to <t,x_1,...,x_n> 5464 // and see if the saturated ideal is contained in <t,x_1,...x_n>+m, 5465 // or ALTERNATIVELY we can pass to the 5464 // and see if the saturated ideal is contained in <t,x_1,...x_n>+m, 5465 // or ALTERNATIVELY we can pass to the 5466 5466 // ring 0,(t,x_1,...,x_n,@a),(ds(n+1),dp(1)), 5467 // compute a standard basis of the elimination 5467 // compute a standard basis of the elimination 5468 5468 // ideal (plus m) there and check if the dimension 1 5469 // (since we have not omitted the variable lastvar, 5469 // (since we have not omitted the variable lastvar, 5470 5470 // this means that we have the ideal 5471 // generated by t,x_1,...,[no x_lastvar],...,x_n 5471 // generated by t,x_1,...,[no x_lastvar],...,x_n 5472 5472 // and this defines NO curve after omitting x_lastvar) 5473 5473 I=std(ideal(var(lastvar)+i)); … … 5475 5475 LI=lead(reduce(I,std(m))); 5476 5476 //size(deletedvariables)=anzahlvariablen(before elimination) 5477 for (j=1;j<=anzahlvariablen-1;j++) 5477 for (j=1;j<=anzahlvariablen-1;j++) 5478 5478 { 5479 5479 LI=subst(LI,var(j),0); … … 5481 5481 if (size(LI)==0) // if no power of t is in lead(I) (where @a is considered as a field element) 5482 5482 */ 5483 I=reduce(sat(ideal(var(lastvar)+i),t)[1],std(m)); // get rid of the minimal 5483 I=reduce(sat(ideal(var(lastvar)+i),t)[1],std(m)); // get rid of the minimal 5484 5484 // polynomial for the test 5485 5485 LI=subst(I,var(nvars(basering)),0); 5486 5486 //size(deletedvariables)=anzahlvariablen(before elimination) 5487 for (j=1;j<=anzahlvariablen-1;j++) 5487 for (j=1;j<=anzahlvariablen-1;j++) 5488 5488 { 5489 5489 LI=subst(LI,var(j),0); 5490 5490 } 5491 if (size(LI)==0) // the saturation lives in the maximal 5491 if (size(LI)==0) // the saturation lives in the maximal 5492 5492 { // ideal generated by t and the x_i 5493 5493 // get rid of var(lastvar) … … 5504 5504 { 5505 5505 string elring="ring ELIMINATERING=("+charstr(basering)+"),("+string(simplify(reduce(maxideal(1),std(var(lastvar))),2))+"),("; 5506 } 5507 if (anzahlvariablen<nvars(basering)) // if @a was present, the 5506 } 5507 if (anzahlvariablen<nvars(basering)) // if @a was present, the 5508 5508 { // ordersting needs an additional entry 5509 5509 elring=elring+"dp(1),"; 5510 5510 } 5511 5511 elring=elring+"lp(1));"; 5512 execute(elring); 5512 execute(elring); 5513 5513 ideal i=imap(BASERING,I); // move the ideal I to the new ring 5514 // if not yet all variables have been checked, 5514 // if not yet all variables have been checked, 5515 5515 // then go on with the next smaller variable, 5516 // else prepare the elimination ring and the neccessary 5516 // else prepare the elimination ring and the neccessary 5517 5517 // information for return 5518 5518 if (lastvar>1) … … 5527 5527 setring BASERING; 5528 5528 } 5529 // next we have to test if there is also a solution 5529 // next we have to test if there is also a solution 5530 5530 // which has the variable lastvar non-zero; 5531 // to do so, we saturate with respect to this variable; 5532 // since when considered over K{{t}} 5533 // the ideal is zero dimensional, this really removes 5531 // to do so, we saturate with respect to this variable; 5532 // since when considered over K{{t}} 5533 // the ideal is zero dimensional, this really removes 5534 5534 // all solutions with that component zero; 5535 5535 // the checking is then done as above 5536 5536 i=std(sat(i,var(lastvar))[1]); 5537 5537 I=reduce(i,std(m)); // "remove" m from i 5538 // test first, if i still is in the ideal <t,x_1,...,x_n> -- if not, then 5539 // we know that i has no longer a point in the tropical 5538 // test first, if i still is in the ideal <t,x_1,...,x_n> -- if not, then 5539 // we know that i has no longer a point in the tropical 5540 5540 // variety with all components negative 5541 5541 LI=subst(I,var(nvars(basering)),0); 5542 for (j=1;j<=anzahlvariablen-1;j++) // set all variables 5542 for (j=1;j<=anzahlvariablen-1;j++) // set all variables 5543 5543 { // t,x_1,...,x_n equal to zero 5544 5544 LI=subst(LI,var(j),0); 5545 5545 } 5546 5546 if (size(LI)==0) // the entries of i have not constant part 5547 { 5548 // check now, if the leading ideal of i contains an element 5547 { 5548 // check now, if the leading ideal of i contains an element 5549 5549 // which only depends on t 5550 5550 LI=lead(I); 5551 5551 //size(deletedvariables)=anzahlvariablen(before elimination) 5552 for (j=1;j<=anzahlvariablen-1;j++) 5552 for (j=1;j<=anzahlvariablen-1;j++) 5553 5553 { 5554 5554 LI=subst(LI,var(j),0); 5555 5555 } 5556 if (size(LI)==0) // if no power of t is in lead(i) 5556 if (size(LI)==0) // if no power of t is in lead(i) 5557 5557 { // (where @a is considered as a field element) 5558 // if not yet all variables have been tested, go on with the 5558 // if not yet all variables have been tested, go on with the 5559 5559 // next smaller variable 5560 5560 // else prepare the neccessary information for return … … 5564 5564 } 5565 5565 else 5566 { 5566 { 5567 5567 execute("ring SATURATERING=("+charstr(basering)+"),("+varstr(basering)+"),("+ordstr(basering)+");"); 5568 5568 ideal i=imap(BASERING,i); … … 5575 5575 return(eliminatelist+saturatelist); 5576 5576 } 5577 else // only one solution is searched for, we can do a simplified 5577 else // only one solution is searched for, we can do a simplified 5578 5578 { // version of the above 5579 // check if there is a solution which has the n-th component 5579 // check if there is a solution which has the n-th component 5580 5580 // zero and with positive valuation, 5581 // if so, then eliminate the n-th variable from 5581 // if so, then eliminate the n-th variable from 5582 5582 // sat(i+x_n,t), otherwise leave i as it is; 5583 // then check if the (remaining) ideal has as 5583 // then check if the (remaining) ideal has as 5584 5584 // solution where the n-1st component is zero ..., 5585 5585 // and procede as before; do the same for the remaining variables; 5586 // this way we make sure that the remaining ideal has 5586 // this way we make sure that the remaining ideal has 5587 5587 // a solution which has no component zero; 5588 5588 ideal variablen; // will contain the variables which are not eliminated … … 5592 5592 LI=subst(I,var(nvars(basering)),0); 5593 5593 //size(deletedvariables)=anzahlvariablen-1(before elimination) 5594 for (k=1;k<=size(deletedvariables);k++) 5594 for (k=1;k<=size(deletedvariables);k++) 5595 5595 { 5596 5596 LI=subst(LI,var(k),0); 5597 5597 } 5598 if (size(LI)==0) // if no power of t is in lead(I) 5598 if (size(LI)==0) // if no power of t is in lead(I) 5599 5599 { // (where the X(i) are considered as field elements) 5600 // get rid of var(j) 5600 // get rid of var(j) 5601 5601 i=eliminate(I,var(j)); 5602 5602 deletedvariables[j]=1; 5603 anzahlvariablen--; // if a variable is eliminated, 5603 anzahlvariablen--; // if a variable is eliminated, 5604 5604 // then the number of true variables drops 5605 5605 } … … 5610 5610 } 5611 5611 variablen=invertorder(variablen); 5612 // store also the additional variable and t, 5612 // store also the additional variable and t, 5613 5613 // since they for sure have not been eliminated 5614 5614 for (j=size(deletedvariables)+1;j<=nvars(basering);j++) … … 5616 5616 variablen=variablen+var(j); 5617 5617 } 5618 // if there are variables left, then pass to a ring which 5619 // only realises these variables else we are done 5618 // if there are variables left, then pass to a ring which 5619 // only realises these variables else we are done 5620 5620 if (anzahlvariablen>1) 5621 5621 { … … 5625 5625 { 5626 5626 string elring="ring ELIMINATERING=("+charstr(basering)+"),("+string(variablen)+"),("; 5627 } 5628 if (size(deletedvariables)+1<nvars(basering)) // if @a was present, 5627 } 5628 if (size(deletedvariables)+1<nvars(basering)) // if @a was present, 5629 5629 { // the ordersting needs an additional entry 5630 5630 elring=elring+"dp(1),"; 5631 5631 } 5632 5632 elring=elring+"lp(1));"; 5633 execute(elring); 5633 execute(elring); 5634 5634 ideal i=imap(BASERING,i); 5635 5635 ideal m=imap(BASERING,m); … … 5644 5644 static proc findzerosAndBasictransform (ideal i,intvec w,list zerolist,int findall,list #) 5645 5645 "USAGE: findzerosAndBasictransform(i,w,z,f[,#]); i ideal, w intvec, z list, f int,# an optional list 5646 ASSUME: i is an ideal in Q[t,x_1,...,x_n,@a] and w=(w_0,...,w_n,0) 5646 ASSUME: i is an ideal in Q[t,x_1,...,x_n,@a] and w=(w_0,...,w_n,0) 5647 5647 is in the tropical variety of i; @a need not be present; 5648 5648 the list 'zero' contains the zeros computed in previous recursion steps; 5649 if 'f' is one then all zeros should be found and returned, 5649 if 'f' is one then all zeros should be found and returned, 5650 5650 otherwise only one 5651 RETURN: list, each entry is a ring corresponding to one conjugacy class of 5652 zeros of the t-initial ideal inside the torus; each of the rings 5651 RETURN: list, each entry is a ring corresponding to one conjugacy class of 5652 zeros of the t-initial ideal inside the torus; each of the rings 5653 5653 contains the following objects 5654 5654 ideal i = the ideal i, where the variable @a (if present) has 5655 possibly been transformed according to the new 5656 minimal polynomial, and where itself has been 5657 submitted to the basic transform of the algorithm 5655 possibly been transformed according to the new 5656 minimal polynomial, and where itself has been 5657 submitted to the basic transform of the algorithm 5658 5658 given by the jth zero found for the t-initial ideal; 5659 note that the new minimal polynomial has already 5659 note that the new minimal polynomial has already 5660 5660 been added 5661 poly m = the new minimal polynomial for @a 5661 poly m = the new minimal polynomial for @a 5662 5662 (it is zero if no @a is present) 5663 list zero = zero[k+1] is the kth component of a zero 5663 list zero = zero[k+1] is the kth component of a zero 5664 5664 the t-initial ideal of i 5665 NOTE: - the procedure is called from inside the recursive procedure 5665 NOTE: - the procedure is called from inside the recursive procedure 5666 5666 tropicalparametrise; 5667 if it is called in the first recursion, the list #[1] contains 5668 the t-initial ideal of i w.r.t. w, otherwise #[1] is an integer, 5667 if it is called in the first recursion, the list #[1] contains 5668 the t-initial ideal of i w.r.t. w, otherwise #[1] is an integer, 5669 5669 one more than the number of true variables x_1,...,x_n 5670 - if #[2] is present, then it is an integer which tells whether 5670 - if #[2] is present, then it is an integer which tells whether 5671 5671 ALL zeros should be found or not" 5672 5672 { … … 5686 5686 int anzahlvariablen=#[1]; 5687 5687 // compute the initial ideal of i 5688 // - the last 1 just means that the variable t is the last 5688 // - the last 1 just means that the variable t is the last 5689 5689 // variable in the ring 5690 5690 ideal ini=tInitialIdeal(i,w,1); … … 5694 5694 int recursive=0; 5695 5695 int anzahlvariablen=nvars(basering); 5696 ideal ini=#[1]; // the t-initial ideal has been computed 5696 ideal ini=#[1]; // the t-initial ideal has been computed 5697 5697 // in before and was handed over 5698 } 5698 } 5699 5699 // collect the true variables x_1,...,x_n plus @a, if it is defined in BASERING 5700 5700 ideal variablen; 5701 5701 for (j=1;j<=nvars(basering)-1;j++) 5702 { 5702 { 5703 5703 variablen=variablen+var(j); 5704 5704 } 5705 // move to a polynomial ring with global monomial ordering 5705 // move to a polynomial ring with global monomial ordering 5706 5706 // - the variable t is superflous, 5707 5707 // the variable @a is not if it was already present 5708 5708 execute("ring INITIALRING=("+charstr(basering)+"),("+string(variablen)+"),dp;"); 5709 5709 ideal ini=imap(BASERING,ini); 5710 // compute the minimal associated primes of the 5710 // compute the minimal associated primes of the 5711 5711 // initialideal over the algebraic closure; 5712 // ordering the maximal ideals shall help to 5712 // ordering the maximal ideals shall help to 5713 5713 // avoid unneccessary field extensions 5714 5714 list absminass=absPrimdecGTZ(ini); 5715 def ABSRING=absminass[1]; // the ring in which the minimal 5715 def ABSRING=absminass[1]; // the ring in which the minimal 5716 5716 // associated primes live 5717 5717 setring ABSRING; … … 5726 5726 // check fort the jth maximal ideal a field extension is necessary; 5727 5727 // the latter condition says that @a is not in BASERING; 5728 // if some of the maximal ideals needs a field extension, 5728 // if some of the maximal ideals needs a field extension, 5729 5729 // then everything will live in this ring 5730 5730 if ((maximalideals[j][1]!=0) and (nvars(BASERING)==anzahlvariablen)) 5731 5731 { 5732 // define the extension ring which contains 5732 // define the extension ring which contains 5733 5733 // the new variable @a, if it is not yet present 5734 5734 execute("ring EXTENSIONRING=("+charstr(BASERING)+"),("+string(imap(BASERING,variablen))+",@a,"+tvar+"),(dp("+string(anzahlvariablen-1)+"),dp(1),lp(1));"); 5735 // phi maps x_i to x_i, @a to @a (if present in the ring), 5735 // phi maps x_i to x_i, @a to @a (if present in the ring), 5736 5736 // and the additional variable 5737 // for the field extension is mapped to @a as well 5737 // for the field extension is mapped to @a as well 5738 5738 // -- note that we only apply phi 5739 // to the list a, and in this list no @a is present; 5739 // to the list a, and in this list no @a is present; 5740 5740 // therefore, it does not matter where this is mapped to 5741 5741 map phi=ABSRING,imap(BASERING,variablen),@a; 5742 5742 } 5743 else // @a was already present in the BASERING or no 5743 else // @a was already present in the BASERING or no 5744 5744 { // field extension is necessary 5745 5745 execute("ring EXTENSIONRING=("+charstr(BASERING)+"),("+varstr(BASERING)+"),("+ordstr(BASERING)+");"); 5746 // phi maps x_i to x_i, @a to @a (if present in the ring), 5746 // phi maps x_i to x_i, @a to @a (if present in the ring), 5747 5747 // and the additional variable 5748 // for the field extension is mapped to @a as well respectively to 0, 5748 // for the field extension is mapped to @a as well respectively to 0, 5749 5749 // if no @a is present; 5750 // note that we only apply phi to the list a and to 5750 // note that we only apply phi to the list a and to 5751 5751 // the replacement rule for 5752 // the old variable @a, and in this list resp. 5753 // replacement rule no @a is present; 5752 // the old variable @a, and in this list resp. 5753 // replacement rule no @a is present; 5754 5754 // therefore, it does not matter where this is mapped to; 5755 5755 if (anzahlvariablen<nvars(EXTENSIONRING)) // @a is in EXTENSIONRING 5756 { 5756 { 5757 5757 // additional variable is mapped to @a 5758 map phi=ABSRING,imap(BASERING,variablen),@a; 5758 map phi=ABSRING,imap(BASERING,variablen),@a; 5759 5759 } 5760 5760 else 5761 5761 { 5762 5762 // additional variable is mapped to 0 5763 map phi=ABSRING,imap(BASERING,variablen),0; 5763 map phi=ABSRING,imap(BASERING,variablen),0; 5764 5764 } 5765 5765 } … … 5768 5768 poly m=maximalideals[j][1]; // extract m 5769 5769 list zeroneu=maximalideals[j][2]; // extract the new zero 5770 poly repl=maximalideals[j][3]; // extract the replacement rule 5771 // the list zero may very well exist as an EMPTY global list 5770 poly repl=maximalideals[j][3]; // extract the replacement rule 5771 // the list zero may very well exist as an EMPTY global list 5772 5772 // - in this case we have to remove it 5773 5773 // in order to avoid a redefining warning 5774 if (defined(zero)!=0) 5774 if (defined(zero)!=0) 5775 5775 { 5776 5776 if (size(zero)==0) … … 5783 5783 { 5784 5784 ideal i=imap(BASERING,i); 5785 if (defined(zerolist)==0) // if zerolist is empty, it does not 5785 if (defined(zerolist)==0) // if zerolist is empty, it does not 5786 5786 { // depend on BASERING ! 5787 5787 list zero=imap(BASERING,zerolist); 5788 5788 } 5789 else 5789 else 5790 5790 { 5791 5791 list zero=zerolist; 5792 5792 } 5793 5793 } 5794 else // in BASERING was @a present 5794 else // in BASERING was @a present 5795 5795 { 5796 5796 ideal variablen=imap(BASERING,variablen); 5797 // map i and zerolist to EXTENSIONRING replacing @a 5797 // map i and zerolist to EXTENSIONRING replacing @a 5798 5798 // by the replacement rule repl 5799 5799 map psi=BASERING,variablen[1..size(variablen)-1],repl,var(nvars(basering)); … … 5805 5805 zero[size(zero)+1]=zeroneu; 5806 5806 // do now the basic transformation sending x_l -> t^-w_l*(zero_l+x_l) 5807 for (l=1;l<=anzahlvariablen;l++) 5807 for (l=1;l<=anzahlvariablen;l++) 5808 5808 { 5809 5809 for (k=1;k<=size(i);k++) 5810 5810 { 5811 5811 if (l!=1) // corresponds to x_(l-1) -- note t is the last variable 5812 { 5812 { 5813 5813 i[k]=substitute(i[k],var(l-1),(zeroneu[l]+var(l-1))*t^(-w[l])); 5814 5814 } … … 5822 5822 for (l=1;l<=ncols(i);l++) 5823 5823 { 5824 if (wdegs[l]<0) // if wdegs[l]==0 there is no need to divide, 5824 if (wdegs[l]<0) // if wdegs[l]==0 there is no need to divide, 5825 5825 { // and we made sure that it is no positive 5826 5826 i[l]=i[l]/t^(-wdegs[l]); … … 5828 5828 } 5829 5829 // since we want to consider i now in the ring (Q[@a]/m)[t,x_1,...,x_n] 5830 // we can reduce i modulo m, so that "constant terms" 5830 // we can reduce i modulo m, so that "constant terms" 5831 5831 // which are "zero" since they 5832 5832 // are in m will disappear; simplify(...,2) then really removes them; … … 5835 5835 export(i); 5836 5836 export(m); 5837 export(zero); 5837 export(zero); 5838 5838 extensionringlist[j]=EXTENSIONRING; 5839 5839 kill EXTENSIONRING; … … 5847 5847 static proc ordermaximalideals (list minassi,int anzahlvariablen) 5848 5848 "USAGE: ordermaximalideals(minassi); minassi list 5849 ASSUME: minassi is a list of maximal ideals (together with the information 5850 how many conjugates it has), where the first polynomial is the 5851 minimal polynomial of the last variable in the ring which is 5849 ASSUME: minassi is a list of maximal ideals (together with the information 5850 how many conjugates it has), where the first polynomial is the 5851 minimal polynomial of the last variable in the ring which is 5852 5852 considered as a parameter 5853 RETURN: list, the procedure orders the maximal ideals in minassi according 5854 to how many new variables are needed (namely none or one) to 5855 describe the zeros of the ideal, and accordingly to the 5853 RETURN: list, the procedure orders the maximal ideals in minassi according 5854 to how many new variables are needed (namely none or one) to 5855 describe the zeros of the ideal, and accordingly to the 5856 5856 degree of the corresponding minimal polynomial 5857 5857 l[j][1] = the minimal polynomial for the jth maximal ideal 5858 l[j][2] = list, the k+1st entry is the kth coordinate of the 5859 zero described by the maximal ideal in terms 5858 l[j][2] = list, the k+1st entry is the kth coordinate of the 5859 zero described by the maximal ideal in terms 5860 5860 of the last variable 5861 l[j][3] = poly, the replacement for the old variable @a 5861 l[j][3] = poly, the replacement for the old variable @a 5862 5862 NOTE: if a maximal ideal contains a variable, it is removed from the list; 5863 5863 the procedure is called by findzerosAndBasictransform" … … 5866 5866 int pruefer; // is set one if a maximal ideal contains a variable 5867 5867 list minassisort; // will contain the output 5868 for (j=1;j<=size(minassi);j++){minassisort[j]=0;} // initialise minassisort 5868 for (j=1;j<=size(minassi);j++){minassisort[j]=0;} // initialise minassisort 5869 5869 // to fix its initial length 5870 5870 list zwischen; // needed for reordering 5871 list zero; // (a_1,...,a_n)=(zero[2],...,zero[n+1]) will be 5871 list zero; // (a_1,...,a_n)=(zero[2],...,zero[n+1]) will be 5872 5872 // a common zero of the ideal m 5873 5873 poly nf; // normalform of a variable w.r.t. m 5874 poly minimalpolynomial; // minimal polynomial for the field extension 5874 poly minimalpolynomial; // minimal polynomial for the field extension 5875 5875 poly parrep; // the old variable @a possibly has to be replaced by a new one 5876 // compute for each maximal ideal the number of new variables, which are 5877 // needed to describe its zeros -- note, a new variable is needed 5876 // compute for each maximal ideal the number of new variables, which are 5877 // needed to describe its zeros -- note, a new variable is needed 5878 5878 // if the first entry of minassi[j][1] is not the last variable 5879 // store the value a variable reduces to in the list a; 5879 // store the value a variable reduces to in the list a; 5880 5880 for (j=size(minassi);j>=1;j--) 5881 5881 { … … 5885 5885 minimalpolynomial=0; 5886 5886 } 5887 zero[1]=poly(0); // the first entry in zero and in 5887 zero[1]=poly(0); // the first entry in zero and in 5888 5888 // neuevariablen corresponds to the variable t, 5889 5889 minassi[j][1]=std(minassi[j][1]); … … 5891 5891 { 5892 5892 // zero_k+1 is the normal form of the kth variable modulo m 5893 zero[k+1]=reduce(var(k),minassi[j][1]); 5894 // if a variable reduces to zero, then the maximal 5893 zero[k+1]=reduce(var(k),minassi[j][1]); 5894 // if a variable reduces to zero, then the maximal 5895 5895 // ideal contains a variable and we can delete it 5896 5896 if (zero[k+1]==0) … … 5899 5899 } 5900 5900 } 5901 // if anzahlvariablen<nvars(basering), then the old ring 5901 // if anzahlvariablen<nvars(basering), then the old ring 5902 5902 // had already an additional variable; 5903 5903 // the old parameter @a then has to be replaced by parrep … … 5908 5908 // if the maximal ideal contains a variable, we simply delete it 5909 5909 if (pruefer==0) 5910 { 5910 { 5911 5911 minassisort[j]=list(minimalpolynomial,zero,parrep); 5912 5912 } 5913 // otherwise we store the information on a, neuevariablen 5913 // otherwise we store the information on a, neuevariablen 5914 5914 // and neuvar together with the ideal 5915 5915 else … … 5920 5920 } 5921 5921 } 5922 // sort the maximal ideals ascendingly according to the 5922 // sort the maximal ideals ascendingly according to the 5923 5923 // number of new variables needed to 5924 5924 // express the zero of the maximal ideal … … 5927 5927 l=j; 5928 5928 for (k=j-1;k>=1;k--) 5929 { 5929 { 5930 5930 if (deg(minassisort[l][1])<deg(minassisort[k][1])) 5931 5931 { … … 5962 5962 static proc verticesTropicalCurve (def tp,list #) 5963 5963 "USAGE: verticesTropicalCurve(tp[,#]); tp list, # optional list 5964 ASSUME: tp is represents an ideal in Z[x,y] representing a tropical 5964 ASSUME: tp is represents an ideal in Z[x,y] representing a tropical 5965 5965 polynomial (in the form of the output of the procedure tropicalise) 5966 5966 defining a tropical plane curve 5967 RETURN: list, each entry corresponds to a vertex in the tropical plane 5967 RETURN: list, each entry corresponds to a vertex in the tropical plane 5968 5968 curve defined by tp 5969 5969 l[i][1] = x-coordinate of the ith vertex 5970 5970 l[i][2] = y-coordinate of the ith vertex 5971 l[i][3] = a polynomial whose monimials mark the vertices in 5972 the Newton polygon corresponding to the entries in 5971 l[i][3] = a polynomial whose monimials mark the vertices in 5972 the Newton polygon corresponding to the entries in 5973 5973 tp which take the common minimum at the ith vertex 5974 5974 NOTE: - the information in l[i][3] represents the subdivision of the Newton 5975 polygon of tp (respectively a polynomial which defines tp); 5976 - if # is non-empty and #[1] is the string 'max', then in the 5977 computations minimum and maximum are exchanged; 5978 - if # is non-empty and the #[1] is not a string, only the vertices 5975 polygon of tp (respectively a polynomial which defines tp); 5976 - if # is non-empty and #[1] is the string 'max', then in the 5977 computations minimum and maximum are exchanged; 5978 - if # is non-empty and the #[1] is not a string, only the vertices 5979 5979 will be computed and the information on the Newton subdivision will 5980 5980 be omitted; 5981 - here the tropical polynomial is supposed to be the MINIMUM of the 5982 linear forms in tp, unless the optional input #[1] is the 5981 - here the tropical polynomial is supposed to be the MINIMUM of the 5982 linear forms in tp, unless the optional input #[1] is the 5983 5983 string 'max' 5984 - the procedure is called from tropicalCurve and from 5984 - the procedure is called from tropicalCurve and from 5985 5985 conicWithTangents" 5986 5986 { 5987 // if you insert a single polynomial instead of an ideal representing 5987 // if you insert a single polynomial instead of an ideal representing 5988 5988 // a tropicalised polynomial, 5989 // then we compute first the tropicalisation of this polynomial 5989 // then we compute first the tropicalisation of this polynomial 5990 5990 // -- this feature is not documented in the above help string 5991 5991 if (typeof(tp)=="poly") … … 5996 5996 } 5997 5997 int i,j,k,l,z; // indices 5998 // make sure that no constant entry of tp has type int since that 5998 // make sure that no constant entry of tp has type int since that 5999 5999 // would lead to trouble 6000 6000 // when using the procedure substitute … … 6014 6014 int e=1; 6015 6015 option(redSB); 6016 // for each triple (i,j,k) of entries in tp check if they have a 6017 // point in common and if they attain at this point the minimal 6016 // for each triple (i,j,k) of entries in tp check if they have a 6017 // point in common and if they attain at this point the minimal 6018 6018 // possible value for all linear forms in tp 6019 6019 for (i=1;i<=size(tp)-2;i++) … … 6068 6068 e++; 6069 6069 } 6070 } 6070 } 6071 6071 } 6072 6072 } … … 6091 6091 static proc bunchOfLines (def tp,list #) 6092 6092 "USAGE: bunchOfLines(tp[,#]); tp list, # optional list 6093 ASSUME: tp is represents an ideal in Q[x,y] representing a tropical 6093 ASSUME: tp is represents an ideal in Q[x,y] representing a tropical 6094 6094 polynomial (in the form of the output of the procedure tropicalise) 6095 6095 defining a bunch of ordinary lines in the plane, 6096 6096 i.e. the Newton polygone is a line segment 6097 RETURN: list, see the procedure tropicalCurve for an explanation of 6097 RETURN: list, see the procedure tropicalCurve for an explanation of 6098 6098 the syntax of this list 6099 NOTE: - the tropical curve defined by tp will consist of a bunch of 6100 parallel lines and throughout the procedure a list with the 6101 name bunchoflines is computed, which represents these lines and 6099 NOTE: - the tropical curve defined by tp will consist of a bunch of 6100 parallel lines and throughout the procedure a list with the 6101 name bunchoflines is computed, which represents these lines and 6102 6102 has the following interpretation: 6103 list, each entry corresponds to a vertex in the tropical plane 6103 list, each entry corresponds to a vertex in the tropical plane 6104 6104 curve defined by tp 6105 6105 l[i][1] = the equation of the ith line in the tropical curve 6106 l[i][2] = a polynomial whose monimials mark the vertices in 6107 the Newton polygon corresponding to the entries in 6106 l[i][2] = a polynomial whose monimials mark the vertices in 6107 the Newton polygon corresponding to the entries in 6108 6108 tp which take the common minimum at the ith vertex 6109 6109 - the information in l[i][2] represents the subdivision of the Newton 6110 polygon of tp (respectively a polynomial which defines tp); 6111 - if # is non-empty and #[1] is the string 'max', then in the 6112 computations minimum and maximum are exchanged; 6113 - if # is non-empty and the #[1] is not a string, only the vertices 6114 will be computed and the information on the Newton subdivision 6110 polygon of tp (respectively a polynomial which defines tp); 6111 - if # is non-empty and #[1] is the string 'max', then in the 6112 computations minimum and maximum are exchanged; 6113 - if # is non-empty and the #[1] is not a string, only the vertices 6114 will be computed and the information on the Newton subdivision 6115 6115 will be omitted; 6116 - here the tropical polynomial is supposed to be the MINIMUM of the 6117 linear forms in tp, unless the optional input #[1] is the 6116 - here the tropical polynomial is supposed to be the MINIMUM of the 6117 linear forms in tp, unless the optional input #[1] is the 6118 6118 string 'max' 6119 6119 - the procedure is called from tropicalCurve" … … 6132 6132 intvec direction=leadexp(detropicalise(tp[1]))-leadexp(detropicalise(tp[2])); 6133 6133 direction=direction/gcd(direction[1],direction[2]); 6134 // change the coordinates in such a way, that the Newton polygon 6134 // change the coordinates in such a way, that the Newton polygon 6135 6135 // lies on the x-axis 6136 if (direction[1]==0) // there is no x-term - exchange x and y 6136 if (direction[1]==0) // there is no x-term - exchange x and y 6137 6137 { // and get rid of the new y part 6138 6138 for (i=1;i<=size(tp);i++) … … 6148 6148 } 6149 6149 } 6150 // For all tuples (i,j) of entries in tp check if they attain 6150 // For all tuples (i,j) of entries in tp check if they attain 6151 6151 // at their point of intersection 6152 6152 // the minimal possible value for all linear forms in tp … … 6164 6164 { 6165 6165 vergleich=substitute(tp[l],var(1),px); 6166 if (vergleich==wert) 6166 if (vergleich==wert) 6167 6167 { 6168 6168 newton=newton+detropicalise(oldtp[l]); … … 6175 6175 e++; 6176 6176 } 6177 } 6177 } 6178 6178 } 6179 6179 // if a vertex appears several times, only its first occurence will be kept … …