//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 = q1*q8*q15-q3*q5*q16, q4*q6*q15-q2*q7*q16, q7*q12*q14-q8*q10*q15, q1*q12*q14-q2*q9*q16, q5*q11*q14-q6*q9*q15, q4*q11*q14-q3*q10*q16, q6*q12*q13-q5*q10*q16, q3*q12*q13-q4*q9*q15, q8*q11*q13-q7*q9*q16, q2*q11*q13-q1*q10*q15, q2*q8*q13-q4*q5*q14, q3*q6*q13-q1*q7*q14, q2*q8*q11-q3*q6*q12, q4*q5*q11-q1*q7*q12, q2*q7*q9-q3*q5*q10, q4*q6*q9-q1*q8*q10, q1*q4*q14*q15-q2*q3*q13*q16, q6*q8*q13*q15-q5*q7*q14*q16, q1*q6*q12*q15-q2*q5*q11*q16, q4*q8*q11*q15-q3*q7*q12*q16, q11*q12*q13*q14-q9*q10*q15*q16, q4*q6*q12*q14-q2*q8*q10*q16, q3*q5*q12*q14-q2*q8*q9*q15, q1*q8*q11*q14-q3*q6*q9*q16, q2*q7*q11*q14-q3*q6*q10*q15, q1*q8*q12*q13-q4*q5*q9*q16, q2*q7*q12*q13-q4*q5*q10*q15, q4*q6*q11*q13-q1*q7*q10*q16, q3*q5*q11*q13-q1*q7*q9*q15, q3*q8*q10*q13-q4*q7*q9*q14, q2*q6*q9*q13-q1*q5*q10*q14, q5*q8*q10*q11-q6*q7*q9*q12, q2*q4*q9*q11-q1*q3*q10*q12, q3*q4*q5*q6-q1*q2*q7*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,a2,a3,b0,b1,b2,b3,c0,c1,c2,c3),dp; ideal P = a0*b0*c0+a1*b1*c1+a2*b2*c2+a3*b3*c3, a0*b1*c1+a1*b0*c0+a2*b3*c3+a3*b2*c2, a0*b2*c2+a1*b3*c3+a2*b0*c0+a3*b1*c1, a0*b3*c3+a1*b2*c2+a2*b1*c1+a3*b0*c0, a0*b0*c1+a1*b1*c0+a2*b2*c3+a3*b3*c2, a0*b1*c0+a1*b0*c1+a2*b3*c2+a3*b2*c3, a0*b2*c3+a1*b3*c2+a2*b0*c1+a3*b1*c0, a0*b3*c2+a1*b2*c3+a2*b1*c0+a3*b0*c1, a0*b0*c2+a1*b1*c3+a2*b2*c0+a3*b3*c1, a0*b1*c3+a1*b0*c2+a2*b3*c1+a3*b2*c0, a0*b2*c0+a1*b3*c1+a2*b0*c2+a3*b1*c3, a0*b3*c1+a1*b2*c0+a2*b1*c3+a3*b0*c2, a0*b0*c3+a1*b1*c2+a2*b2*c1+a3*b3*c0, a0*b1*c2+a1*b0*c3+a2*b3*c0+a3*b2*c1, a0*b2*c1+a1*b3*c0+a2*b0*c3+a3*b1*c2, a0*b3*c0+a1*b2*c1+a2*b1*c2+a3*b0*c3; // 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; // This 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; }