# Author: Antonio Laface # Date: Dec 2004 # E-mail: alaface@udec.cl #----------- with(plots): algtotrop := proc() local tropical_monomial,coeff,term,vars,num_vars,len,monomial,i,j,k,tropical_poly; if ( nargs = 0 or nargs > 2 ) then printf("#########################################################################\n"); printf("\n"); printf("Usage:\n"); printf("\n"); printf("-- algtotrop(pol1,pol2) convert pol1 into a tropical polynomial \n"); printf(" pol2 is used for the 0-terms\n"); printf("\n"); printf(" Example: for converting 0*x^2+y^2+2*x*y+2*x+0*y+2\n"); printf(" use algtotrop(y^2+2*x*y+2*x+2,x^2+y)\n"); printf("\n"); printf("-- draw(pol1,pol2) draw the corresponding tropical curve\n"); printf("\n"); printf("#########################################################################\n"); RETURN(0): fi; tropical_poly := {}; for k from 1 to nargs do vars := indets(args[k]): num_vars := nops(vars): len := nops(args[k]): for i from 1 to len do monomial := op(i,args[k]); coeff := coeffs(monomial); term := monomial/coeff; tropical_monomial := coeff - (k-1)*coeff; for j from 1 to num_vars do tropical_monomial := tropical_monomial + degree(term,vars[j])*vars[j]; od: tropical_poly := tropical_poly union {tropical_monomial}; od: od: RETURN(tropical_poly); end: draw := proc() local p,rg,xx,yy,rx1,rx2,ry1,ry2,eq,ine,r,n,i,j,k,equ,seg,lista,ll; lista := algtotrop(args[1..nargs]): if ( lista = 0 ) then RETURN(NULL): fi: n := nops(lista); ll := {}; p := {}; for i from 1 to n-1 do for j from i+1 to n do equ := { lista[i] = lista[j] }; for k from 1 to n do equ := equ union { lista[i] >= lista[k] }: od: seg := solve(equ); ll := ll union {seg}; od: od: for i from 1 to nops(ll) do eq := {}; ine := ll[i]; for r from 1 to nops(ll[i]) do if type(ll[i][r],equation) then eq := eq union {ll[i][r]}; ine := ine minus {ll[i][r]}; fi: od: if ( nops(eq) = 1 ) then xx := solve(eq,x): yy := solve(eq,y): ry1 := -20: ry2 := 20: if ( xx <> NULL ) then rg := solve(subs(xx,ine)); if ( nops(rg) = 2 ) then if ( type(op(1,op(1,rg)),realcons) ) then ry1 := op(1,op(1,rg)): ry2 := op(2,op(2,rg)): else ry1 := op(1,op(2,rg)): ry2 := op(2,op(1,rg)): fi: fi: if ( nops(rg) = 1 ) then if ( type(op(1,op(1,rg)),realcons) ) then ry1 := op(1,op(1,rg)): ry2 := ry1 + 1: else ry2 := op(2,op(1,rg)): ry1 := ry2 - 1: fi: fi: fi: rx1 := -20: rx2 := 20: if ( yy <> NULL ) then rg := solve(subs(yy,ine)); if ( nops(rg) = 2 ) then if ( type(op(1,op(1,rg)),realcons) ) then rx1 := op(1,op(1,rg)): rx2 := op(2,op(2,rg)): else rx1 := op(1,op(2,rg)): rx2 := op(2,op(1,rg)): fi: fi: if ( nops(rg) = 1 ) then if ( type(op(1,op(1,rg)),realcons) ) then rx1 := op(1,op(1,rg)): rx2 := rx1 + 1: else rx2 := op(2,op(1,rg)): rx1 := rx2 - 1: fi: fi: fi: p := p union {implicitplot(eq,x=rx1..rx2,y=ry1..ry2)}: fi: od: display(p,axes=frame,scaling=constrained): end: algtotrop();