//This is the ideal Fourier invariants. ring rQ = 0,(q1,q2,q3,q4,q5,q6,q7,q8,q9,q10),dp; ideal Invariants = q3*q8*q9-q4*q7*q10, q2*q7*q9-q1*q8*q10, q2*q6*q9-q4*q5*q10, q3*q5*q9-q1*q6*q10, q2*q6*q7-q3*q5*q8, q4*q5*q7-q1*q6*q8, q2*q3*q9^2-q1*q4*q10^2, q2*q4*q7^2-q1*q3*q8^2, q3*q4*q5^2-q1*q2*q6^2; // This is the inverse of the Fourier transform. matrix ptoq[10][10] = 1/16,1/16,1/16,1/16,1/8,1/8,1/8,1/8,1/8,1/8, 1/8,1/8,-1/8,-1/8,1/4,-1/4,0,0,0,0, 1/8,-1/8,1/8,-1/8,0,0,1/4,-1/4,0,0, 1/8,-1/8,-1/8,1/8,0,0,0,0,1/4,-1/4, 1/16,1/16,1/16,1/16,1/8,1/8,-1/8,-1/8,-1/8,-1/8, 1/8,-1/8,-1/8,1/8,0,0,0,0,-1/4,1/4, 1/8,-1/8,1/8,-1/8,0,0,-1/4,1/4,0,0, 1/16,1/16,1/16,1/16,-1/8,-1/8,1/8,1/8,-1/8,-1/8, 1/8,1/8,-1/8,-1/8,-1/4,1/4,0,0,0,0, 1/16,1/16,1/16,1/16,-1/8,-1/8,-1/8,-1/8,1/8,1/8; // This is the ring of probability distributions. ring rP = 0,(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10),dp; //This is the Fourier transform. matrix qtop[10][10] = 1,1,1,1,1,1,1,1,1,1, 1,1,-1,-1,1,-1,-1,1,1,1, 1,-1,1,-1,1,-1,1,1,-1,1, 1,-1,-1,1,1,1,-1,1,-1,1, 1,1,0,0,1,0,0,-1,-1,-1, 1,-1,0,0,1,0,0,-1,1,-1, 1,0,1,0,-1,0,-1,1,0,-1, 1,0,-1,0,-1,0,1,1,0,-1, 1,0,0,1,-1,-1,0,-1,0,1, 1,0,0,-1,-1,1,0,-1,0,1; ideal Fourier = qtop*transpose(maxideal(1)); // This is the list of polynomial invariants. map F = rQ, Fourier; ideal PInvariants = F(Invariants); // This is the polynomial parametrization. ring r = 0,(b0,b1,b2,b3,d0,d1,d2,d3),dp; ideal P = b0^2*d0^3+b0^2*d1^3+b0^2*d2^3+b0^2*d3^3+2*b0*b1*d0^2*d1+2*b0*b1*d0*d1^2+2*b0*b1*d2^2*d3+2*b0*b1*d2*d3^2+2*b0*b2*d0^2*d2+2*b0*b2*d0*d2^2+2*b0*b2*d1^2*d3+2*b0*b2*d1*d3^2+2*b0*b3*d0^2*d3+2*b0*b3*d0*d3^2+2*b0*b3*d1^2*d2+2*b0*b3*d1*d2^2+b1^2*d0^3+b1^2*d1^3+b1^2*d2^3+b1^2*d3^3+2*b1*b2*d0^2*d3+2*b1*b2*d0*d3^2+2*b1*b2*d1^2*d2+2*b1*b2*d1*d2^2+2*b1*b3*d0^2*d2+2*b1*b3*d0*d2^2+2*b1*b3*d1^2*d3+2*b1*b3*d1*d3^2+b2^2*d0^3+b2^2*d1^3+b2^2*d2^3+b2^2*d3^3+2*b2*b3*d0^2*d1+2*b2*b3*d0*d1^2+2*b2*b3*d2^2*d3+2*b2*b3*d2*d3^2+b3^2*d0^3+b3^2*d1^3+b3^2*d2^3+b3^2*d3^3, 2*b0^2*d0^2*d1+2*b0^2*d0*d1^2+2*b0^2*d2^2*d3+2*b0^2*d2*d3^2+4*b0*b1*d0^2*d1+4*b0*b1*d0*d1^2+4*b0*b1*d2^2*d3+4*b0*b1*d2*d3^2+4*b0*b2*d0*d1*d2+4*b0*b2*d0*d1*d3+4*b0*b2*d0*d2*d3+4*b0*b2*d1*d2*d3+4*b0*b3*d0*d1*d2+4*b0*b3*d0*d1*d3+4*b0*b3*d0*d2*d3+4*b0*b3*d1*d2*d3+2*b1^2*d0^2*d1+2*b1^2*d0*d1^2+2*b1^2*d2^2*d3+2*b1^2*d2*d3^2+4*b1*b2*d0*d1*d2+4*b1*b2*d0*d1*d3+4*b1*b2*d0*d2*d3+4*b1*b2*d1*d2*d3+4*b1*b3*d0*d1*d2+4*b1*b3*d0*d1*d3+4*b1*b3*d0*d2*d3+4*b1*b3*d1*d2*d3+2*b2^2*d0^2*d1+2*b2^2*d0*d1^2+2*b2^2*d2^2*d3+2*b2^2*d2*d3^2+4*b2*b3*d0^2*d1+4*b2*b3*d0*d1^2+4*b2*b3*d2^2*d3+4*b2*b3*d2*d3^2+2*b3^2*d0^2*d1+2*b3^2*d0*d1^2+2*b3^2*d2^2*d3+2*b3^2*d2*d3^2, 2*b0^2*d0^2*d2+2*b0^2*d0*d2^2+2*b0^2*d1^2*d3+2*b0^2*d1*d3^2+4*b0*b1*d0*d1*d2+4*b0*b1*d0*d1*d3+4*b0*b1*d0*d2*d3+4*b0*b1*d1*d2*d3+4*b0*b2*d0^2*d2+4*b0*b2*d0*d2^2+4*b0*b2*d1^2*d3+4*b0*b2*d1*d3^2+4*b0*b3*d0*d1*d2+4*b0*b3*d0*d1*d3+4*b0*b3*d0*d2*d3+4*b0*b3*d1*d2*d3+2*b1^2*d0^2*d2+2*b1^2*d0*d2^2+2*b1^2*d1^2*d3+2*b1^2*d1*d3^2+4*b1*b2*d0*d1*d2+4*b1*b2*d0*d1*d3+4*b1*b2*d0*d2*d3+4*b1*b2*d1*d2*d3+4*b1*b3*d0^2*d2+4*b1*b3*d0*d2^2+4*b1*b3*d1^2*d3+4*b1*b3*d1*d3^2+2*b2^2*d0^2*d2+2*b2^2*d0*d2^2+2*b2^2*d1^2*d3+2*b2^2*d1*d3^2+4*b2*b3*d0*d1*d2+4*b2*b3*d0*d1*d3+4*b2*b3*d0*d2*d3+4*b2*b3*d1*d2*d3+2*b3^2*d0^2*d2+2*b3^2*d0*d2^2+2*b3^2*d1^2*d3+2*b3^2*d1*d3^2, 2*b0^2*d0^2*d3+2*b0^2*d0*d3^2+2*b0^2*d1^2*d2+2*b0^2*d1*d2^2+4*b0*b1*d0*d1*d2+4*b0*b1*d0*d1*d3+4*b0*b1*d0*d2*d3+4*b0*b1*d1*d2*d3+4*b0*b2*d0*d1*d2+4*b0*b2*d0*d1*d3+4*b0*b2*d0*d2*d3+4*b0*b2*d1*d2*d3+4*b0*b3*d0^2*d3+4*b0*b3*d0*d3^2+4*b0*b3*d1^2*d2+4*b0*b3*d1*d2^2+2*b1^2*d0^2*d3+2*b1^2*d0*d3^2+2*b1^2*d1^2*d2+2*b1^2*d1*d2^2+4*b1*b2*d0^2*d3+4*b1*b2*d0*d3^2+4*b1*b2*d1^2*d2+4*b1*b2*d1*d2^2+4*b1*b3*d0*d1*d2+4*b1*b3*d0*d1*d3+4*b1*b3*d0*d2*d3+4*b1*b3*d1*d2*d3+2*b2^2*d0^2*d3+2*b2^2*d0*d3^2+2*b2^2*d1^2*d2+2*b2^2*d1*d2^2+4*b2*b3*d0*d1*d2+4*b2*b3*d0*d1*d3+4*b2*b3*d0*d2*d3+4*b2*b3*d1*d2*d3+2*b3^2*d0^2*d3+2*b3^2*d0*d3^2+2*b3^2*d1^2*d2+2*b3^2*d1*d2^2, b0^2*d0^2*d1+b0^2*d0*d1^2+b0^2*d2^2*d3+b0^2*d2*d3^2+2*b0*b1*d0^3+2*b0*b1*d1^3+2*b0*b1*d2^3+2*b0*b1*d3^3+2*b0*b2*d0^2*d3+2*b0*b2*d0*d3^2+2*b0*b2*d1^2*d2+2*b0*b2*d1*d2^2+2*b0*b3*d0^2*d2+2*b0*b3*d0*d2^2+2*b0*b3*d1^2*d3+2*b0*b3*d1*d3^2+b1^2*d0^2*d1+b1^2*d0*d1^2+b1^2*d2^2*d3+b1^2*d2*d3^2+2*b1*b2*d0^2*d2+2*b1*b2*d0*d2^2+2*b1*b2*d1^2*d3+2*b1*b2*d1*d3^2+2*b1*b3*d0^2*d3+2*b1*b3*d0*d3^2+2*b1*b3*d1^2*d2+2*b1*b3*d1*d2^2+b2^2*d0^2*d1+b2^2*d0*d1^2+b2^2*d2^2*d3+b2^2*d2*d3^2+2*b2*b3*d0^3+2*b2*b3*d1^3+2*b2*b3*d2^3+2*b2*b3*d3^3+b3^2*d0^2*d1+b3^2*d0*d1^2+b3^2*d2^2*d3+b3^2*d2*d3^2, 2*b0^2*d0*d1*d2+2*b0^2*d0*d1*d3+2*b0^2*d0*d2*d3+2*b0^2*d1*d2*d3+4*b0*b1*d0^2*d3+4*b0*b1*d0*d3^2+4*b0*b1*d1^2*d2+4*b0*b1*d1*d2^2+4*b0*b2*d0^2*d3+4*b0*b2*d0*d3^2+4*b0*b2*d1^2*d2+4*b0*b2*d1*d2^2+4*b0*b3*d0*d1*d2+4*b0*b3*d0*d1*d3+4*b0*b3*d0*d2*d3+4*b0*b3*d1*d2*d3+2*b1^2*d0*d1*d2+2*b1^2*d0*d1*d3+2*b1^2*d0*d2*d3+2*b1^2*d1*d2*d3+4*b1*b2*d0*d1*d2+4*b1*b2*d0*d1*d3+4*b1*b2*d0*d2*d3+4*b1*b2*d1*d2*d3+4*b1*b3*d0^2*d3+4*b1*b3*d0*d3^2+4*b1*b3*d1^2*d2+4*b1*b3*d1*d2^2+2*b2^2*d0*d1*d2+2*b2^2*d0*d1*d3+2*b2^2*d0*d2*d3+2*b2^2*d1*d2*d3+4*b2*b3*d0^2*d3+4*b2*b3*d0*d3^2+4*b2*b3*d1^2*d2+4*b2*b3*d1*d2^2+2*b3^2*d0*d1*d2+2*b3^2*d0*d1*d3+2*b3^2*d0*d2*d3+2*b3^2*d1*d2*d3, 2*b0^2*d0*d1*d2+2*b0^2*d0*d1*d3+2*b0^2*d0*d2*d3+2*b0^2*d1*d2*d3+4*b0*b1*d0^2*d2+4*b0*b1*d0*d2^2+4*b0*b1*d1^2*d3+4*b0*b1*d1*d3^2+4*b0*b2*d0*d1*d2+4*b0*b2*d0*d1*d3+4*b0*b2*d0*d2*d3+4*b0*b2*d1*d2*d3+4*b0*b3*d0^2*d2+4*b0*b3*d0*d2^2+4*b0*b3*d1^2*d3+4*b0*b3*d1*d3^2+2*b1^2*d0*d1*d2+2*b1^2*d0*d1*d3+2*b1^2*d0*d2*d3+2*b1^2*d1*d2*d3+4*b1*b2*d0^2*d2+4*b1*b2*d0*d2^2+4*b1*b2*d1^2*d3+4*b1*b2*d1*d3^2+4*b1*b3*d0*d1*d2+4*b1*b3*d0*d1*d3+4*b1*b3*d0*d2*d3+4*b1*b3*d1*d2*d3+2*b2^2*d0*d1*d2+2*b2^2*d0*d1*d3+2*b2^2*d0*d2*d3+2*b2^2*d1*d2*d3+4*b2*b3*d0^2*d2+4*b2*b3*d0*d2^2+4*b2*b3*d1^2*d3+4*b2*b3*d1*d3^2+2*b3^2*d0*d1*d2+2*b3^2*d0*d1*d3+2*b3^2*d0*d2*d3+2*b3^2*d1*d2*d3, b0^2*d0^2*d2+b0^2*d0*d2^2+b0^2*d1^2*d3+b0^2*d1*d3^2+2*b0*b1*d0^2*d3+2*b0*b1*d0*d3^2+2*b0*b1*d1^2*d2+2*b0*b1*d1*d2^2+2*b0*b2*d0^3+2*b0*b2*d1^3+2*b0*b2*d2^3+2*b0*b2*d3^3+2*b0*b3*d0^2*d1+2*b0*b3*d0*d1^2+2*b0*b3*d2^2*d3+2*b0*b3*d2*d3^2+b1^2*d0^2*d2+b1^2*d0*d2^2+b1^2*d1^2*d3+b1^2*d1*d3^2+2*b1*b2*d0^2*d1+2*b1*b2*d0*d1^2+2*b1*b2*d2^2*d3+2*b1*b2*d2*d3^2+2*b1*b3*d0^3+2*b1*b3*d1^3+2*b1*b3*d2^3+2*b1*b3*d3^3+b2^2*d0^2*d2+b2^2*d0*d2^2+b2^2*d1^2*d3+b2^2*d1*d3^2+2*b2*b3*d0^2*d3+2*b2*b3*d0*d3^2+2*b2*b3*d1^2*d2+2*b2*b3*d1*d2^2+b3^2*d0^2*d2+b3^2*d0*d2^2+b3^2*d1^2*d3+b3^2*d1*d3^2, 2*b0^2*d0*d1*d2+2*b0^2*d0*d1*d3+2*b0^2*d0*d2*d3+2*b0^2*d1*d2*d3+4*b0*b1*d0*d1*d2+4*b0*b1*d0*d1*d3+4*b0*b1*d0*d2*d3+4*b0*b1*d1*d2*d3+4*b0*b2*d0^2*d1+4*b0*b2*d0*d1^2+4*b0*b2*d2^2*d3+4*b0*b2*d2*d3^2+4*b0*b3*d0^2*d1+4*b0*b3*d0*d1^2+4*b0*b3*d2^2*d3+4*b0*b3*d2*d3^2+2*b1^2*d0*d1*d2+2*b1^2*d0*d1*d3+2*b1^2*d0*d2*d3+2*b1^2*d1*d2*d3+4*b1*b2*d0^2*d1+4*b1*b2*d0*d1^2+4*b1*b2*d2^2*d3+4*b1*b2*d2*d3^2+4*b1*b3*d0^2*d1+4*b1*b3*d0*d1^2+4*b1*b3*d2^2*d3+4*b1*b3*d2*d3^2+2*b2^2*d0*d1*d2+2*b2^2*d0*d1*d3+2*b2^2*d0*d2*d3+2*b2^2*d1*d2*d3+4*b2*b3*d0*d1*d2+4*b2*b3*d0*d1*d3+4*b2*b3*d0*d2*d3+4*b2*b3*d1*d2*d3+2*b3^2*d0*d1*d2+2*b3^2*d0*d1*d3+2*b3^2*d0*d2*d3+2*b3^2*d1*d2*d3, b0^2*d0^2*d3+b0^2*d0*d3^2+b0^2*d1^2*d2+b0^2*d1*d2^2+2*b0*b1*d0^2*d2+2*b0*b1*d0*d2^2+2*b0*b1*d1^2*d3+2*b0*b1*d1*d3^2+2*b0*b2*d0^2*d1+2*b0*b2*d0*d1^2+2*b0*b2*d2^2*d3+2*b0*b2*d2*d3^2+2*b0*b3*d0^3+2*b0*b3*d1^3+2*b0*b3*d2^3+2*b0*b3*d3^3+b1^2*d0^2*d3+b1^2*d0*d3^2+b1^2*d1^2*d2+b1^2*d1*d2^2+2*b1*b2*d0^3+2*b1*b2*d1^3+2*b1*b2*d2^3+2*b1*b2*d3^3+2*b1*b3*d0^2*d1+2*b1*b3*d0*d1^2+2*b1*b3*d2^2*d3+2*b1*b3*d2*d3^2+b2^2*d0^2*d3+b2^2*d0*d3^2+b2^2*d1^2*d2+b2^2*d1*d2^2+2*b2*b3*d0^2*d2+2*b2*b3*d0*d2^2+2*b2*b3*d1^2*d3+2*b2*b3*d1*d3^2+b3^2*d0^2*d3+b3^2*d0*d3^2+b3^2*d1^2*d2+b3^2*d1*d2^2; // This checks that the polynomial parametrization // lies on the probability simplex. // It requires suma.sing. Most likely, you should // change the directory where you saved this file. // If you do have this file, you should uncomment // the following two lines. // < "/home/lgp/singular/suma.sing"; // Suma(Substitute(3,P)); // This checks that the PInvariants vanish at // the polynomial parametrization. map Evaluate = rP, P; // The following command takes a lot of space and time to // finish for larger models. // ideal Z = Evaluate(PInvariants); setring rP; ideal Z; int i; for (i=1; i<= size(PInvariants); i++) { i; Z = PInvariants[i]; setring r; Evaluate(Z); setring rP; }