//This is the ideal Fourier invariants. ring rQ = 0,(q1,q2,q3,q4),dp; ideal Invariants = q2*q3^2-q1*q4^2; // This is the inverse of the Fourier transform. matrix ptoq[4][4] = 1/16,3/16,3/8,3/8, 3/8,-3/8,3/4,-3/4, 3/16,9/16,-3/8,-3/8, 3/8,-3/8,-3/4,3/4; // This is the ring of probability distributions. ring rP = 0,(p1,p2,p3,p4),dp; //This is the Fourier transform. matrix qtop[4][4] = 1,1,1,1, 1,-1/3,1,-1/3, 1,1/3,-1/3,-1/3, 1,-1/3,-1/3,1/3; 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,d0,d1),dp; ideal P = b0^2*d0^3+3*b0^2*d1^3+6*b0*b1*d0^2*d1+6*b0*b1*d0*d1^2+12*b0*b1*d1^3+3*b1^2*d0^3+6*b1^2*d0^2*d1+6*b1^2*d0*d1^2+21*b1^2*d1^3, 6*b0^2*d0^2*d1+6*b0^2*d0*d1^2+12*b0^2*d1^3+12*b0*b1*d0^2*d1+84*b0*b1*d0*d1^2+48*b0*b1*d1^3+30*b1^2*d0^2*d1+102*b1^2*d0*d1^2+84*b1^2*d1^3, 3*b0^2*d0^2*d1+3*b0^2*d0*d1^2+6*b0^2*d1^3+6*b0*b1*d0^3+12*b0*b1*d0^2*d1+12*b0*b1*d0*d1^2+42*b0*b1*d1^3+6*b1^2*d0^3+21*b1^2*d0^2*d1+21*b1^2*d0*d1^2+60*b1^2*d1^3, 18*b0^2*d0*d1^2+6*b0^2*d1^3+24*b0*b1*d0^2*d1+60*b0*b1*d0*d1^2+60*b0*b1*d1^3+24*b1^2*d0^2*d1+114*b1^2*d0*d1^2+78*b1^2*d1^3; // 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(1,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; }