Sampling from Tropical Generic Measure

This page contains the code for the experiments in Table 3 for the Tropical generic measure:

TropicalGenericMeasure.m

// we define a list called powers which gives the monomials of degree 3 in 4 variables.

        powers := [[0, 0, 0, 3],
                           [0, 0, 1, 2],
                           [0, 0, 2, 1],
                           [0, 0, 3, 0],
                       [0, 1, 0, 2],
                       [0, 1, 1, 1],
                           [0, 1, 2, 0],
                       [0, 2, 0, 1],
                       [0, 2, 1, 0],
                       [0, 3, 0, 0],
                       [1, 0, 0, 2],
                           [1, 0, 1, 1],
                           [1, 0, 2, 0],
                           [1, 1, 0, 1],
                           [1, 1, 1, 0],
                           [1, 2, 0, 0],
                           [2, 0, 0, 1],
                           [2, 0, 1, 0],
                           [2, 1, 0, 0],
                           [3, 0, 0, 0]];


// We use truncated_units(N,p) to define random unit number in the interval `[1..p^N-1]`.

        function truncated_units(N,p)

                result  := [];
                p_res := 0;

                for number in [1..p^N-1] do
                        p_res := p_res + 1;

                        if p_res eq p then
                                p_res := 0;
                        end if;

                        if p_res ne 0 then
                                Append(~result,number);
                        end if;
                end for;

                return result;

        end function;


// We define the function randomSmoothCubicSurface(N,p,possiblePart,units) where p is a prime number and N is an integer such that we sample the coefficients as multiplication of an element from `{1, p, ... ,  p^N}` and a unit number.

        function randomSmoothCubicSurface(N,p,units)

                _<x,y,z,w> := PolynomialRing(Rationals(),4);
                P3<x,y,z,w> := ProjectiveSpace(Rationals(),3);

                listCoef := [];
                for i in [0..N] do
                        Append(~listCoef,p^i);
                end for;

                bool := true;
                while bool do

                        randSurface := 0*x;
                        for part in powers do
                                coef :=  Random(units) * Random(listCoef);
                                monomial := x^part[1] * y^part[2] * z^part[3] * w^part[4];
                                randSurface := randSurface + coef * monomial;
                        end for;

                        S := Surface(P3,randSurface);
                        bool := IsSingular(S);

                end while;

                return randSurface;

        end function;

// We use the function howManyLines(surface,p) to compute the number of lines on a fixed cubic surface using Groebner basis techniques.

        function howManyLines(surface,p)

                f := surface;

                QQabcd<a,b,c,d> := PolynomialRing(Rationals(),4);
                _<s,t> := PolynomialRing(QQabcd,2);

                params := [[a*s+b*t,c*s+d*t,s,t],
                           [a*s+b*t,s,c*t,t],
                           [a*s+b*t,s,t,0],
                           [s,a*t,b*t,t],
                           [s,a*t,t,0],
                           [s,t,0,0]];

                pt0 := [1,0];
                pt1 := [1,1];
                ptmin1 := [1,-1];
                ptinf := [0,1];

                polys := [];

                for par in params do

                        g0 := Evaluate(f,[Evaluate(par[i],pt0) : i in [1..4]]);
                        g1 := Evaluate(f,[Evaluate(par[i],pt1) : i in [1..4]]);
                        gmin1 := Evaluate(f,[Evaluate(par[i],ptmin1) : i in [1..4]]);
                        ginf := Evaluate(f,[Evaluate(par[i],ptinf) : i in [1..4]]);

                        I := Ideal([g0,g1,gmin1,ginf]);
                        GB := GroebnerBasis(I);
                        g := GB[#GB];
                        Append(~polys,g);

                end for;

                K := pAdicField(p,750);

                nsol := 0;

                for g in polys do

                        newcoeff := [];
                        for i in [0..27] do
                                Append(~newcoeff,K!Rationals()!Coefficient(g,4,i));
                        end for;

                        _<x> := PolynomialRing(K);
                        gK := 0*x;
                        for i in [1..28] do
                                gK := gK + newcoeff[i]*x^(i-1);
                        end for;

                        try nsol := nsol + #Roots(gK);
                        catch e return -1;
                        end try;

                end for;

                return nsol;

        end function;



// We use lineCounts(N,p,M) to determine the distribution of the line-counts for M cubic surfaces.

        function lineCounts(N,p,M)

                units := truncated_units(N,p);
                counts := [0 : j in [-1..27]];


                for i in [1..M] do
                        print i;

                        f := randomSmoothCubicSurface(N,p,units);
                        count := howManyLines(f,p);
                        counts[count+2] := counts[count+2] + 1;
                end for;

                return counts;

        end function;