//This is the ideal Fourier invariants. ring rQ = 0,(q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,q12,q13,q14,q15,q16),dp; ideal Invariants = q4*q15-q3*q16, q11*q14-q10*q15, q7*q14-q6*q15, q4*q14-q2*q16, q3*q14-q2*q15, q12*q13-q9*q16, q8*q13-q5*q16, q4*q13-q1*q16, q3*q13-q1*q15, q2*q13-q1*q14, q8*q11-q7*q12, q8*q10-q6*q12, q7*q10-q6*q11, q3*q10-q2*q11, q8*q9-q5*q12, q7*q9-q5*q11, q6*q9-q5*q10, q4*q9-q1*q12, q3*q6-q2*q7, q4*q5-q1*q8; // This is the inverse of the Fourier transform. matrix ptoq[16][16] = 1/16,1/16,1/16,1/16,1/16,1/16,1/16,1/16,1/16,1/16,1/16,1/16,1/16,1/16,1/16,1/16, 1/16,-1/16,-1/16,1/16,-1/16,1/16,1/16,-1/16,-1/16,1/16,1/16,-1/16,1/16,-1/16,-1/16,1/16, 1/16,-1/16,1/16,-1/16,1/16,-1/16,1/16,-1/16,1/16,-1/16,1/16,-1/16,1/16,-1/16,1/16,-1/16, 1/16,1/16,-1/16,-1/16,-1/16,-1/16,1/16,1/16,-1/16,-1/16,1/16,1/16,1/16,1/16,-1/16,-1/16, 1/16,1/16,-1/16,-1/16,1/16,1/16,-1/16,-1/16,1/16,1/16,-1/16,-1/16,1/16,1/16,-1/16,-1/16, 1/16,-1/16,1/16,-1/16,-1/16,1/16,-1/16,1/16,-1/16,1/16,-1/16,1/16,1/16,-1/16,1/16,-1/16, 1/16,-1/16,-1/16,1/16,1/16,-1/16,-1/16,1/16,1/16,-1/16,-1/16,1/16,1/16,-1/16,-1/16,1/16, 1/16,1/16,1/16,1/16,-1/16,-1/16,-1/16,-1/16,-1/16,-1/16,-1/16,-1/16,1/16,1/16,1/16,1/16, 1/16,1/16,1/16,1/16,-1/16,-1/16,-1/16,-1/16,1/16,1/16,1/16,1/16,-1/16,-1/16,-1/16,-1/16, 1/16,-1/16,-1/16,1/16,1/16,-1/16,-1/16,1/16,-1/16,1/16,1/16,-1/16,-1/16,1/16,1/16,-1/16, 1/16,-1/16,1/16,-1/16,-1/16,1/16,-1/16,1/16,1/16,-1/16,1/16,-1/16,-1/16,1/16,-1/16,1/16, 1/16,1/16,-1/16,-1/16,1/16,1/16,-1/16,-1/16,-1/16,-1/16,1/16,1/16,-1/16,-1/16,1/16,1/16, 1/16,1/16,-1/16,-1/16,-1/16,-1/16,1/16,1/16,1/16,1/16,-1/16,-1/16,-1/16,-1/16,1/16,1/16, 1/16,-1/16,1/16,-1/16,1/16,-1/16,1/16,-1/16,-1/16,1/16,-1/16,1/16,-1/16,1/16,-1/16,1/16, 1/16,-1/16,-1/16,1/16,-1/16,1/16,1/16,-1/16,1/16,-1/16,-1/16,1/16,-1/16,1/16,1/16,-1/16, 1/16,1/16,1/16,1/16,1/16,1/16,1/16,1/16,-1/16,-1/16,-1/16,-1/16,-1/16,-1/16,-1/16,-1/16; // This is the ring of probability distributions. ring rP = 0,(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16),dp; //This is the Fourier transform. matrix qtop[16][16] = 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,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,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,-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,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,-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,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,(a0,a1,b0,b1,c0,c1,d0,d1,e0,e1,f0,f1,g0,g1),dp; ideal P = a0*b0*c0*d0*e0*f0*g0+a0*b0*c1*d0*e1*f0*g1+a0*b1*c0*d1*e1*f0*g0+a0*b1*c1*d1*e0*f0*g1+a1*b0*c0*d1*e0*f1*g0+a1*b0*c1*d1*e1*f1*g1+a1*b1*c0*d0*e1*f1*g0+a1*b1*c1*d0*e0*f1*g1, a0*b0*c0*d1*e1*f0*g0+a0*b0*c1*d1*e0*f0*g1+a0*b1*c0*d0*e0*f0*g0+a0*b1*c1*d0*e1*f0*g1+a1*b0*c0*d0*e1*f1*g0+a1*b0*c1*d0*e0*f1*g1+a1*b1*c0*d1*e0*f1*g0+a1*b1*c1*d1*e1*f1*g1, a0*b0*c0*d0*e1*f0*g1+a0*b0*c1*d0*e0*f0*g0+a0*b1*c0*d1*e0*f0*g1+a0*b1*c1*d1*e1*f0*g0+a1*b0*c0*d1*e1*f1*g1+a1*b0*c1*d1*e0*f1*g0+a1*b1*c0*d0*e0*f1*g1+a1*b1*c1*d0*e1*f1*g0, a0*b0*c0*d1*e0*f0*g1+a0*b0*c1*d1*e1*f0*g0+a0*b1*c0*d0*e1*f0*g1+a0*b1*c1*d0*e0*f0*g0+a1*b0*c0*d0*e0*f1*g1+a1*b0*c1*d0*e1*f1*g0+a1*b1*c0*d1*e1*f1*g1+a1*b1*c1*d1*e0*f1*g0, a0*b0*c0*d0*e0*f0*g1+a0*b0*c1*d0*e1*f0*g0+a0*b1*c0*d1*e1*f0*g1+a0*b1*c1*d1*e0*f0*g0+a1*b0*c0*d1*e0*f1*g1+a1*b0*c1*d1*e1*f1*g0+a1*b1*c0*d0*e1*f1*g1+a1*b1*c1*d0*e0*f1*g0, a0*b0*c0*d1*e1*f0*g1+a0*b0*c1*d1*e0*f0*g0+a0*b1*c0*d0*e0*f0*g1+a0*b1*c1*d0*e1*f0*g0+a1*b0*c0*d0*e1*f1*g1+a1*b0*c1*d0*e0*f1*g0+a1*b1*c0*d1*e0*f1*g1+a1*b1*c1*d1*e1*f1*g0, a0*b0*c0*d0*e1*f0*g0+a0*b0*c1*d0*e0*f0*g1+a0*b1*c0*d1*e0*f0*g0+a0*b1*c1*d1*e1*f0*g1+a1*b0*c0*d1*e1*f1*g0+a1*b0*c1*d1*e0*f1*g1+a1*b1*c0*d0*e0*f1*g0+a1*b1*c1*d0*e1*f1*g1, a0*b0*c0*d1*e0*f0*g0+a0*b0*c1*d1*e1*f0*g1+a0*b1*c0*d0*e1*f0*g0+a0*b1*c1*d0*e0*f0*g1+a1*b0*c0*d0*e0*f1*g0+a1*b0*c1*d0*e1*f1*g1+a1*b1*c0*d1*e1*f1*g0+a1*b1*c1*d1*e0*f1*g1, a0*b0*c0*d0*e0*f1*g0+a0*b0*c1*d0*e1*f1*g1+a0*b1*c0*d1*e1*f1*g0+a0*b1*c1*d1*e0*f1*g1+a1*b0*c0*d1*e0*f0*g0+a1*b0*c1*d1*e1*f0*g1+a1*b1*c0*d0*e1*f0*g0+a1*b1*c1*d0*e0*f0*g1, a0*b0*c0*d1*e1*f1*g0+a0*b0*c1*d1*e0*f1*g1+a0*b1*c0*d0*e0*f1*g0+a0*b1*c1*d0*e1*f1*g1+a1*b0*c0*d0*e1*f0*g0+a1*b0*c1*d0*e0*f0*g1+a1*b1*c0*d1*e0*f0*g0+a1*b1*c1*d1*e1*f0*g1, a0*b0*c0*d0*e1*f1*g1+a0*b0*c1*d0*e0*f1*g0+a0*b1*c0*d1*e0*f1*g1+a0*b1*c1*d1*e1*f1*g0+a1*b0*c0*d1*e1*f0*g1+a1*b0*c1*d1*e0*f0*g0+a1*b1*c0*d0*e0*f0*g1+a1*b1*c1*d0*e1*f0*g0, a0*b0*c0*d1*e0*f1*g1+a0*b0*c1*d1*e1*f1*g0+a0*b1*c0*d0*e1*f1*g1+a0*b1*c1*d0*e0*f1*g0+a1*b0*c0*d0*e0*f0*g1+a1*b0*c1*d0*e1*f0*g0+a1*b1*c0*d1*e1*f0*g1+a1*b1*c1*d1*e0*f0*g0, a0*b0*c0*d0*e0*f1*g1+a0*b0*c1*d0*e1*f1*g0+a0*b1*c0*d1*e1*f1*g1+a0*b1*c1*d1*e0*f1*g0+a1*b0*c0*d1*e0*f0*g1+a1*b0*c1*d1*e1*f0*g0+a1*b1*c0*d0*e1*f0*g1+a1*b1*c1*d0*e0*f0*g0, a0*b0*c0*d1*e1*f1*g1+a0*b0*c1*d1*e0*f1*g0+a0*b1*c0*d0*e0*f1*g1+a0*b1*c1*d0*e1*f1*g0+a1*b0*c0*d0*e1*f0*g1+a1*b0*c1*d0*e0*f0*g0+a1*b1*c0*d1*e0*f0*g1+a1*b1*c1*d1*e1*f0*g0, a0*b0*c0*d0*e1*f1*g0+a0*b0*c1*d0*e0*f1*g1+a0*b1*c0*d1*e0*f1*g0+a0*b1*c1*d1*e1*f1*g1+a1*b0*c0*d1*e1*f0*g0+a1*b0*c1*d1*e0*f0*g1+a1*b1*c0*d0*e0*f0*g0+a1*b1*c1*d0*e1*f0*g1, a0*b0*c0*d1*e0*f1*g0+a0*b0*c1*d1*e1*f1*g1+a0*b1*c0*d0*e1*f1*g0+a0*b1*c1*d0*e0*f1*g1+a1*b0*c0*d0*e0*f0*g0+a1*b0*c1*d0*e1*f0*g1+a1*b1*c0*d1*e1*f0*g0+a1*b1*c1*d1*e0*f0*g1; // 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(0,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; }