//This is the ideal Fourier invariants. ring rQ = 0,(q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,q12),dp; ideal Invariants = q8*q11-q7*q12, q3*q11-q2*q12, q8*q10-q6*q11, q4*q10-q2*q11, q8*q9-q5*q12, q7*q9-q6*q10, q7*q9-q5*q11, q4*q9-q3*q10, q3*q9-q1*q12, q2*q9-q1*q11, q6^2-q5*q8, q4*q6-q2*q8, q4*q6-q3*q7, q4*q5-q2*q6, q3*q5-q1*q8, q2*q5-q1*q7, q9*q11^2-q10^2*q12, q2^2*q3-q1*q4^2; // This is the inverse of the Fourier transform. matrix ptoq[13][12] = 1/64,3/32,3/64,3/32,3/32,3/16,1/8,3/32,3/64,3/32,3/32,1/64, 3/32,3/16,-3/32,-3/16,3/8,0,0,-3/8,3/32,3/16,-3/16,-3/32, 3/64,-3/32,9/64,-3/32,3/32,3/16,-3/8,3/32,9/64,-3/32,-3/32,3/64, 3/32,3/16,-3/32,-3/16,3/16,-3/8,0,3/16,-3/32,-3/16,3/16,3/32, 3/16,-3/8,-3/16,3/8,0,0,0,0,3/16,-3/8,3/8,-3/16, 3/32,-3/16,-3/32,3/16,3/16,-3/8,0,3/16,-3/32,3/16,-3/16,3/32, 3/64,-3/32,9/64,-3/32,-3/32,-3/16,3/8,-3/32,9/64,-3/32,-3/32,3/64, 1/32,3/16,3/32,3/16,0,0,0,0,-3/32,-3/16,-3/16,-1/32, 3/32,3/16,-3/32,-3/16,-3/16,3/8,0,-3/16,-3/32,-3/16,3/16,3/32, 3/32,-3/16,9/32,-3/16,0,0,0,0,-9/32,3/16,3/16,-3/32, 3/32,3/16,-3/32,-3/16,-3/8,0,0,3/8,3/32,3/16,-3/16,-3/32, 3/32,-3/16,-3/32,3/16,-3/16,3/8,0,-3/16,-3/32,3/16,-3/16,3/32, 1/64,3/32,3/64,3/32,-3/32,-3/16,-1/8,-3/32,3/64,3/32,3/32,1/64; // This is the ring of probability distributions. ring rP = 0,(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13),dp; //This is the Fourier transform. matrix qtop[12][13] = 1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1/3,-1/3,1/3,-1/3,-1/3,-1/3,1,1/3,-1/3,1/3,-1/3,1, 1,-1/3,1,-1/3,-1/3,-1/3,1,1,-1/3,1,-1/3,-1/3,1, 1,-1/3,-1/3,-1/3,1/3,1/3,-1/3,1,-1/3,-1/3,-1/3,1/3,1, 1,2/3,1/3,1/3,0,1/3,-1/3,0,-1/3,0,-2/3,-1/3,-1, 1,0,1/3,-1/3,0,-1/3,-1/3,0,1/3,0,0,1/3,-1, 1,0,-1,0,0,0,1,0,0,0,0,0,-1, 1,-2/3,1/3,1/3,0,1/3,-1/3,0,-1/3,0,2/3,-1/3,-1, 1,1/3,1,-1/3,1/3,-1/3,1,-1,-1/3,-1,1/3,-1/3,1, 1,1/3,-1/3,-1/3,-1/3,1/3,-1/3,-1,-1/3,1/3,1/3,1/3,1, 1,-1/3,-1/3,1/3,1/3,-1/3,-1/3,-1,1/3,1/3,-1/3,-1/3,1, 1,-1,1,1,-1,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,(b0,b1,b2,e0,e1,e2),dp; ideal P = b0^2*e0^4+2*b0^2*e1^4+b0^2*e2^4+4*b0*b1*e0^3*e1+4*b0*b1*e0*e1^3+4*b0*b1*e1^3*e2+4*b0*b1*e1*e2^3+2*b0*b2*e0^3*e2+2*b0*b2*e0*e2^3+4*b0*b2*e1^4+2*b1^2*e0^4+2*b1^2*e0^3*e2+2*b1^2*e0*e2^3+8*b1^2*e1^4+2*b1^2*e2^4+4*b1*b2*e0^3*e1+4*b1*b2*e0*e1^3+4*b1*b2*e1^3*e2+4*b1*b2*e1*e2^3+b2^2*e0^4+2*b2^2*e1^4+b2^2*e2^4, 6*b0^2*e0^3*e1+6*b0^2*e0*e1^3+6*b0^2*e1^3*e2+6*b0^2*e1*e2^3+36*b0*b1*e0^2*e1^2+24*b0*b1*e0*e1^2*e2+36*b0*b1*e1^2*e2^2+12*b0*b2*e0^2*e1*e2+12*b0*b2*e0*e1^3+12*b0*b2*e0*e1*e2^2+12*b0*b2*e1^3*e2+12*b1^2*e0^3*e1+12*b1^2*e0^2*e1*e2+24*b1^2*e0*e1^3+12*b1^2*e0*e1*e2^2+24*b1^2*e1^3*e2+12*b1^2*e1*e2^3+36*b1*b2*e0^2*e1^2+24*b1*b2*e0*e1^2*e2+36*b1*b2*e1^2*e2^2+6*b2^2*e0^3*e1+6*b2^2*e0*e1^3+6*b2^2*e1^3*e2+6*b2^2*e1*e2^3, 3*b0^2*e0^3*e2+3*b0^2*e0*e2^3+6*b0^2*e1^4+12*b0*b1*e0^2*e1*e2+12*b0*b1*e0*e1^3+12*b0*b1*e0*e1*e2^2+12*b0*b1*e1^3*e2+12*b0*b2*e0^2*e2^2+12*b0*b2*e1^4+6*b1^2*e0^3*e2+12*b1^2*e0^2*e2^2+6*b1^2*e0*e2^3+24*b1^2*e1^4+12*b1*b2*e0^2*e1*e2+12*b1*b2*e0*e1^3+12*b1*b2*e0*e1*e2^2+12*b1*b2*e1^3*e2+3*b2^2*e0^3*e2+3*b2^2*e0*e2^3+6*b2^2*e1^4, 12*b0^2*e0^2*e1^2+12*b0^2*e1^2*e2^2+12*b0*b1*e0^3*e1+12*b0*b1*e0^2*e1*e2+24*b0*b1*e0*e1^3+12*b0*b1*e0*e1*e2^2+24*b0*b1*e1^3*e2+12*b0*b1*e1*e2^3+12*b0*b2*e0^2*e1^2+24*b0*b2*e0*e1^2*e2+12*b0*b2*e1^2*e2^2+36*b1^2*e0^2*e1^2+24*b1^2*e0*e1^2*e2+36*b1^2*e1^2*e2^2+12*b1*b2*e0^3*e1+12*b1*b2*e0^2*e1*e2+24*b1*b2*e0*e1^3+12*b1*b2*e0*e1*e2^2+24*b1*b2*e1^3*e2+12*b1*b2*e1*e2^3+12*b2^2*e0^2*e1^2+12*b2^2*e1^2*e2^2, 12*b0^2*e0^2*e1*e2+12*b0^2*e0*e1^3+12*b0^2*e0*e1*e2^2+12*b0^2*e1^3*e2+24*b0*b1*e0^2*e1^2+144*b0*b1*e0*e1^2*e2+24*b0*b1*e1^2*e2^2+24*b0*b2*e0^2*e1*e2+24*b0*b2*e0*e1^3+24*b0*b2*e0*e1*e2^2+24*b0*b2*e1^3*e2+48*b1^2*e0^2*e1*e2+48*b1^2*e0*e1^3+48*b1^2*e0*e1*e2^2+48*b1^2*e1^3*e2+24*b1*b2*e0^2*e1^2+144*b1*b2*e0*e1^2*e2+24*b1*b2*e1^2*e2^2+12*b2^2*e0^2*e1*e2+12*b2^2*e0*e1^3+12*b2^2*e0*e1*e2^2+12*b2^2*e1^3*e2, 6*b0^2*e0^2*e1^2+12*b0^2*e0*e1^2*e2+6*b0^2*e1^2*e2^2+24*b0*b1*e0^2*e1*e2+24*b0*b1*e0*e1^3+24*b0*b1*e0*e1*e2^2+24*b0*b1*e1^3*e2+48*b0*b2*e0*e1^2*e2+12*b1^2*e0^2*e1^2+72*b1^2*e0*e1^2*e2+12*b1^2*e1^2*e2^2+24*b1*b2*e0^2*e1*e2+24*b1*b2*e0*e1^3+24*b1*b2*e0*e1*e2^2+24*b1*b2*e1^3*e2+6*b2^2*e0^2*e1^2+12*b2^2*e0*e1^2*e2+6*b2^2*e1^2*e2^2, 6*b0^2*e0^2*e2^2+6*b0^2*e1^4+12*b0*b1*e0^2*e1*e2+12*b0*b1*e0*e1^3+12*b0*b1*e0*e1*e2^2+12*b0*b1*e1^3*e2+6*b0*b2*e0^3*e2+6*b0*b2*e0*e2^3+12*b0*b2*e1^4+6*b1^2*e0^3*e2+12*b1^2*e0^2*e2^2+6*b1^2*e0*e2^3+24*b1^2*e1^4+12*b1*b2*e0^2*e1*e2+12*b1*b2*e0*e1^3+12*b1*b2*e0*e1*e2^2+12*b1*b2*e1^3*e2+6*b2^2*e0^2*e2^2+6*b2^2*e1^4, 2*b0^2*e0^3*e1+2*b0^2*e0*e1^3+2*b0^2*e1^3*e2+2*b0^2*e1*e2^3+4*b0*b1*e0^4+4*b0*b1*e0^3*e2+4*b0*b1*e0*e2^3+16*b0*b1*e1^4+4*b0*b1*e2^4+4*b0*b2*e0^3*e1+4*b0*b2*e0*e1^3+4*b0*b2*e1^3*e2+4*b0*b2*e1*e2^3+8*b1^2*e0^3*e1+8*b1^2*e0*e1^3+8*b1^2*e1^3*e2+8*b1^2*e1*e2^3+4*b1*b2*e0^4+4*b1*b2*e0^3*e2+4*b1*b2*e0*e2^3+16*b1*b2*e1^4+4*b1*b2*e2^4+2*b2^2*e0^3*e1+2*b2^2*e0*e1^3+2*b2^2*e1^3*e2+2*b2^2*e1*e2^3, 6*b0^2*e0^2*e1^2+12*b0^2*e0*e1^2*e2+6*b0^2*e1^2*e2^2+12*b0*b1*e0^3*e1+12*b0*b1*e0^2*e1*e2+24*b0*b1*e0*e1^3+12*b0*b1*e0*e1*e2^2+24*b0*b1*e1^3*e2+12*b0*b1*e1*e2^3+24*b0*b2*e0^2*e1^2+24*b0*b2*e1^2*e2^2+36*b1^2*e0^2*e1^2+24*b1^2*e0*e1^2*e2+36*b1^2*e1^2*e2^2+12*b1*b2*e0^3*e1+12*b1*b2*e0^2*e1*e2+24*b1*b2*e0*e1^3+12*b1*b2*e0*e1*e2^2+24*b1*b2*e1^3*e2+12*b1*b2*e1*e2^3+6*b2^2*e0^2*e1^2+12*b2^2*e0*e1^2*e2+6*b2^2*e1^2*e2^2, 6*b0^2*e0^2*e1*e2+6*b0^2*e0*e1^3+6*b0^2*e0*e1*e2^2+6*b0^2*e1^3*e2+12*b0*b1*e0^3*e2+24*b0*b1*e0^2*e2^2+12*b0*b1*e0*e2^3+48*b0*b1*e1^4+12*b0*b2*e0^2*e1*e2+12*b0*b2*e0*e1^3+12*b0*b2*e0*e1*e2^2+12*b0*b2*e1^3*e2+24*b1^2*e0^2*e1*e2+24*b1^2*e0*e1^3+24*b1^2*e0*e1*e2^2+24*b1^2*e1^3*e2+12*b1*b2*e0^3*e2+24*b1*b2*e0^2*e2^2+12*b1*b2*e0*e2^3+48*b1*b2*e1^4+6*b2^2*e0^2*e1*e2+6*b2^2*e0*e1^3+6*b2^2*e0*e1*e2^2+6*b2^2*e1^3*e2, 6*b0^2*e0^2*e1*e2+6*b0^2*e0*e1^3+6*b0^2*e0*e1*e2^2+6*b0^2*e1^3*e2+36*b0*b1*e0^2*e1^2+24*b0*b1*e0*e1^2*e2+36*b0*b1*e1^2*e2^2+12*b0*b2*e0^3*e1+12*b0*b2*e0*e1^3+12*b0*b2*e1^3*e2+12*b0*b2*e1*e2^3+12*b1^2*e0^3*e1+12*b1^2*e0^2*e1*e2+24*b1^2*e0*e1^3+12*b1^2*e0*e1*e2^2+24*b1^2*e1^3*e2+12*b1^2*e1*e2^3+36*b1*b2*e0^2*e1^2+24*b1*b2*e0*e1^2*e2+36*b1*b2*e1^2*e2^2+6*b2^2*e0^2*e1*e2+6*b2^2*e0*e1^3+6*b2^2*e0*e1*e2^2+6*b2^2*e1^3*e2, 24*b0^2*e0*e1^2*e2+24*b0*b1*e0^2*e1*e2+24*b0*b1*e0*e1^3+24*b0*b1*e0*e1*e2^2+24*b0*b1*e1^3*e2+12*b0*b2*e0^2*e1^2+24*b0*b2*e0*e1^2*e2+12*b0*b2*e1^2*e2^2+12*b1^2*e0^2*e1^2+72*b1^2*e0*e1^2*e2+12*b1^2*e1^2*e2^2+24*b1*b2*e0^2*e1*e2+24*b1*b2*e0*e1^3+24*b1*b2*e0*e1*e2^2+24*b1*b2*e1^3*e2+24*b2^2*e0*e1^2*e2, b0^2*e0^3*e2+b0^2*e0*e2^3+2*b0^2*e1^4+4*b0*b1*e0^3*e1+4*b0*b1*e0*e1^3+4*b0*b1*e1^3*e2+4*b0*b1*e1*e2^3+2*b0*b2*e0^4+4*b0*b2*e1^4+2*b0*b2*e2^4+2*b1^2*e0^4+2*b1^2*e0^3*e2+2*b1^2*e0*e2^3+8*b1^2*e1^4+2*b1^2*e2^4+4*b1*b2*e0^3*e1+4*b1*b2*e0*e1^3+4*b1*b2*e1^3*e2+4*b1*b2*e1*e2^3+b2^2*e0^3*e2+b2^2*e0*e2^3+2*b2^2*e1^4; // 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; }