//This is the ideal Fourier invariants. ring rQ = 0,(q1,q2,q3,q4,q5,q6,q7),dp; ideal Invariants = q6^2-q5*q7, q3*q6-q2*q7, q4^2-q3*q5, q4^2-q2*q6, q3^2-q1*q7, q2*q3-q1*q6, q2^2-q1*q5; // This is the inverse of the Fourier transform. matrix ptoq[8][7] = 1/64,3/16,3/32,3/8,1/8,3/16,1/64, 1/8,3/4,0,0,0,-3/4,-1/8, 1/16,0,3/8,0,-1/2,0,1/16, 3/32,3/8,-3/16,-3/4,0,3/8,3/32, 3/8,-3/4,0,0,0,3/4,-3/8, 3/16,0,-3/8,0,0,0,3/16, 3/64,-3/16,9/32,-3/8,3/8,-3/16,3/64, 3/32,-3/8,-3/16,3/4,0,-3/8,3/32; // This is the ring of probability distributions. ring rP = 0,(p1,p2,p3,p4,p5,p6,p7,p8),dp; //This is the Fourier transform. matrix qtop[7][8] = 1,1,1,1,1,1,1,1, 1,1/2,0,1/3,-1/6,0,-1/3,-1/3, 1,0,1,-1/3,0,-1/3,1,-1/3, 1,0,0,-1/3,0,0,-1/3,1/3, 1,0,-1,0,0,0,1,0, 1,-1/2,0,1/3,1/6,0,-1/3,-1/3, 1,-1,1,1,-1,1,1,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,(d0,d1,d2),dp; ideal P = d0^4+2*d1^4+d2^4, 8*d0^3*d1+8*d0*d1^3+8*d1^3*d2+8*d1*d2^3, 4*d0^3*d2+4*d0*d2^3+8*d1^4, 12*d0^2*d1^2+12*d1^2*d2^2, 24*d0^2*d1*d2+24*d0*d1^3+24*d0*d1*d2^2+24*d1^3*d2, 12*d0^2*d1^2+24*d0*d1^2*d2+12*d1^2*d2^2, 6*d0^2*d2^2+6*d1^4, 24*d0*d1^2*d2; // 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(2,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; }