////////////////////////////////////////////////////////////////////////
//                        Scheme Theoretic Equations                  //
//                           for Genus 2 Jacobians                    //
////////////////////////////////////////////////////////////////////////

intrinsic JacobianRelations(J::JacHyp) -> SeqEnum
    {}
    return JacobianRelations(Curve(J));
end intrinsic;

intrinsic JacobianRelations(C::CrvHyp) -> SeqEnum
    {}

    f, h := HyperellipticPolynomials(C);
    require h eq 0 : "Hyperelliptic Curve must be a simplified model. See SimplifiedModel()";
    require Genus(C) eq 2 : "Hyperelliptic Curve must have genus 2";
    require Degree(f) eq 6 : "At the moment the curve must be defined as y^2 = sextic";
    
    fs := Eltseq(f);
    return JacobianRelations(fs);

end intrinsic;

intrinsic JacobianRelations(K::Fld) -> SeqEnum
    {}
    F<f0,f1,f2,f3,f4,f5,f6> := FunctionField(K,7 : Global); 
    return JacobianRelations([f0,f1,f2,f3,f4,f5,f6]);
end intrinsic;

intrinsic JacobianRelations(ff::[RngElt]) -> SeqEnum
    {}
    require #ff eq 7 : "Argument must have length 7.";
    F := Universe(ff);
    f0,f1,f2,f3,f4,f5,f6 := Explode(ff);
    K<x1,x2,y1,y2> := FunctionField(F,4 : Global);
    t12 := x1 + x2; 
    n12 := x1 * x2; 
    m00 := (y1-y2)/(x1-x2);
    m01 := (x2*y1-x1*y2)/(x1-x2);
    m02 := (x2^2*y1-x1^2*y2)/(x1-x2);
    m03 := (x2^3*y1-x1^3*y2)/(x1-x2);
    a := [ K | 0 : i in [0..15] ];
    a[15+1] := 1;
    a[14+1] := t12;
    a[13+1] := n12;
    a[12+1] := t12^2 - 2*n12;
    a[11+1] := t12 * n12;
    a[10+1] := n12^2;
    a[09+1] := m00;
    a[08+1] := m01;
    a[07+1] := m02;
    a[06+1] := m03;
    //
    F0 := 2*f0 + f1*(x1+x2) + 2*f2*(x1*x2) + f3*(x1*x2)*(x1+x2)
	+ 2*f4*(x1*x2)^2 + f5*(x1*x2)^2*(x1+x2) + 2*f6*(x1*x2)^3;
    //
    a[05+1] := (F0([x1,x2,y1,y2])-2*y1*y2)/(x1-x2)^2;
    //
    F1 := f0*(x1+x2) + 2*f1*(x1*x2) + f2*(x1*x2)*(x1+x2) + 2*f3*(x1*x2)^2
	+ f4*(x1*x2)^2*(x1+x2) + 2*f5*(x1*x2)^3 + f6*(x1*x2)^3*(x1+x2);
    a[04+1] := (F1([x1,x2,y1,y2])-(x1+x2)*y1*y2)/(x1-x2)^2;
    //
    a[03+1] := a[05+1]*(x1*x2);
    //
    G0 := 4*f0 + f1*(x1+3*x2) + 2*f2*(x1+x2)*x2 + f3*(3*x1+x2)*x2^2
	+ 4*f4*(x1*x2)*x2^2 + f5*(x1*x2)*(x1+3*x2)*x2^2
	+ 2*f6*(x1*x2)*(x1+x2)*x2^3;
    a[02+1] := (G0([x1,x2,y1,y2])*y1-G0([x2,x1,y2,y1])*y2)/(x1-x2)^3;
    //
    G1 := 2*f0*(x1+x2) + f1*(3*x1+x2)*x2 + 4*f2*(x1*x2)*x2
	+ f3*(x1*x2)*(x1+3*x2)*x2 + 2*f4*(x1*x2)*(x1+x2)*x2^2
	+ f5*(x1*x2)*(3*x1+x2)*x2^3 + 4*f6*(x1*x2)^2*x2^3;
    a[01+1] := (G1([x1,x2,y1,y2])*y1-G1([x2,x1,y2,y1])*y2)/(x1-x2)^3;
    //
    a[00+1] := a[05+1]^2;
    //
    P<X00,X01,X02,X03,X04,X05,X06,X07,
      X08,X09,X10,X11,X12,X13,X14,X15> := PolynomialRing(F,16 : Global);
    rels := [
	X00*X03 - X01^2 + f4*X03^2 + (-4*f2*f6 + f3*f5)*X03*X10 -
	8*f1*f6*X04*X10 - 8*f0*f6*X04*X11 - 4*f0*f5*X04*X13 + f0*X05^2 -
	f1*f5*X05*X10 + (-4*f1*f5*f6 - 4*f2*f4*f6 + f2*f5^2 + f3^2*f6)*X10^2
	+ (-4*f0*f5*f6 - 4*f1*f4*f6 + f1*f5^2)*X10*X11 + (-2*f0*f5^2 -
	6*f1*f3*f6)*X10*X13 + (-4*f0*f2*f6 - 2*f0*f3*f5 - 3*f1^2*f6)*X10*X15
	+ (-4*f0*f4*f6 + f0*f5^2)*X11^2 - 8*f0*f3*f6*X11*X13 -
	4*f0*f1*f6*X11*X15 - 2*f0*f1*f5*X13*X15,

	X00*X04 - X01*X02 - f3*f6*X03*X10 + (-9*f0*f5 - f1*f4)*X03*X15 -
	4*f2*f6*X04*X10 + (-20*f0*f6 - 3*f1*f5)*X04*X13 +
	(-7*f1*f6 - f2*f5)*X05*X10 - 2*f0*f4*X05*X14 - f0*f3*X05*X15 -
	4*f1*f6*X06*X08 - 4*f0*f6*X06*X09 + 2*f1*f6*X07^2 +
	4*f0*f6*X07*X08 - 4*f0*f5*X07*X09 + 4*f0*f5*X08^2 +
	(-2*f1*f6^2 - 2*f2*f5*f6)*X10^2 +
	(-4*f0*f6^2 - 2*f1*f5*f6)*X10*X11 - 2*f0*f5*f6*X10*X12 +
	(-18*f0*f5*f6 -	6*f1*f4*f6 - f1*f5^2 - 2*f2*f3*f6)*X10*X13 +
	(-8*f0*f4*f6 - f0*f5^2 - 3*f1*f3*f6)*X10*X14 -
	4*f0*f3*f6*X12*X13 +
	(-20*f0*f3*f6 - 4*f0*f4*f5 - 4*f1*f2*f6 - 2*f1*f3*f5)*X13^2 +
	(-8*f0*f2*f6 - 3*f0*f3*f5 + f1^2*f6)*X13*X14 +
	(-14*f0*f1*f6 - 6*f0*f2*f5 - f1^2*f5)*X13*X15 +
	(-4*f0^2*f6 - 2*f0*f1*f5)*X14*X15 - 4*f0^2*f5*X15^2,

	X00*X05 - X02^2 + f6*X03^2 - f1*f5*X03*X15 - 8*f0*f6*X04*X14 +
	f2*X05^2 - 4*f0*f5*X05*X14 + (-4*f0*f4 + f1*f3)*X05*X15 -
	4*f1*f6*X07*X08 + 4*f1*f6^2*X10*X11 + 2*f1*f5*f6*X10*X13 -
	4*f0*f5*f6*X10*X14 + (-4*f0*f4*f6 + f0*f5^2 -
	2*f1*f3*f6)*X10*X15 - 8*f0*f3*f6*X11*X15 + (-4*f0*f2*f6 +
	f1^2*f6)*X12*X15 + (-8*f0*f2*f6 - 2*f0*f3*f5 +
	4*f1^2*f6)*X13*X15 + (-4*f0*f2*f5 + f1^2*f5)*X14*X15 +
	(-4*f0*f2*f4 + f0*f3^2 + f1^2*f4)*X15^2,
	
	X00*X06 - X01*X03 - f3*X04*X06 - 2*f2*X05*X06 - 3*f1*X05*X07 - 
	4*f0*X05*X08 - 4*f2*f6*X06*X10 - 4*f1*f6*X06*X11 - 
        4*f0*f6*X06*X12 + (-2*f2*f5 + f3*f4)*X07*X10 + (-4*f0*f6 - 
        4*f1*f5)*X07*X11 - 4*f0*f5*X07*X12 + (4*f0*f6 + 2*f1*f5 + 
        f3^2)*X08*X10 + (-4*f0*f5 - 4*f1*f4 + 3*f2*f3)*X08*X11 - 
        4*f0*f4*X08*X12 + (-8*f0*f4 - 2*f1*f3 + 4*f2^2)*X08*X13 + 
        (-4*f0*f3 + 2*f1*f2)*X08*X14 + (-4*f0*f2 + 2*f1^2)*X08*X15 + 
        (6*f0*f5 + 4*f1*f4 - 2*f2*f3)*X09*X10 + (4*f0*f4 + 
        f1*f3)*X09*X11 + f0*f3*X09*X12 + (3*f0*f3 + 2*f1*f2)*X09*X13 + 
        4*f0*f2*X09*X14 + 2*f0*f1*X09*X15,
	X01*X10 - X03*X06 + f3*X07*X10 + 2*f2*X08*X10 + f1*X08*X11 + 
        f1*X09*X10 + 2*f0*X09*X11,

	X01*X11 - 2*X04*X06 - f5*X06*X10 + f3*X08*X10 + 2*f2*X08*X11 + 
        f1*X08*X13 + 2*f1*X09*X11 + 2*f0*X09*X12 + 4*f0*X09*X13,
	X01*X12 - 2*X05*X06 - 4*f6*X06*X10 - f5*X06*X11 - 2*f5*X07*X10 - 
        2*f4*X07*X11 - f3*X08*X11 + f1*X08*X14 + 2*f0*X09*X14,

	X01*X13 - X05*X06 + f3*X08*X11 + 2*f2*X08*X13 + f1*X08*X14 - 
        f3*X09*X10 + f1*X09*X13 + 2*f0*X09*X14,

	X01*X14 - 2*X05*X07 - f5*X07*X11 + f5*X08*X10 - 2*f4*X08*X11 - 
        f3*X08*X13 + f1*X08*X15 + 2*f4*X09*X10 + 2*f0*X09*X15,

	X01*X15 - X05*X08 + 2*f6*X07*X11 - 2*f6*X08*X10 + f5*X08*X11 - 
        f5*X09*X10,

	X02*X10 - X04*X06 + f4*X07*X10 + f3*X08*X10 + f2*X08*X11 + 
        f1*X08*X13 + f1*X09*X11 + f0*X09*X12 + 3*f0*X09*X13,

	X02*X11 - 2*X05*X06 - 2*f6*X06*X10 - f5*X07*X10 + f3*X08*X11 + 
        2*f2*X08*X13 + 2*f1*X08*X14 - f3*X09*X10 + f1*X09*X13 + 
        4*f0*X09*X14,

	X02*X12 - 2*X05*X07 - 2*f6*X06*X11 - 3*f5*X07*X11 + 2*f5*X08*X10 - 
        4*f4*X08*X11 - f3*X08*X12 - 4*f3*X08*X13 - 2*f2*X08*X14 + 
        4*f4*X09*X10 + f3*X09*X11 - f1*X09*X14,

	X02*X13 - X05*X07 + f1*X08*X15 + 2*f0*X09*X15,

	X02*X14 - 2*X05*X08 + 2*f6*X07*X11 - 2*f6*X08*X10 + f5*X08*X11 - 
        f3*X08*X14 - 2*f2*X08*X15 - f5*X09*X10 + f3*X09*X13 - 
        f1*X09*X15,

	X03*X07 - X04*X06 + f4*X07*X10 + f3*X08*X10 + f2*X08*X11 + 
        f1*X09*X11 + f0*X09*X12 + f0*X09*X13,

	X03*X08 - X05*X06 - 2*f6*X06*X10 - f5*X07*X10 + f3*X08*X11 + 
        2*f2*X08*X13 + f1*X08*X14 - f3*X09*X10 + f1*X09*X13 + 
        2*f0*X09*X14,

	X03*X09 - X05*X07 - 2*f6*X06*X11 - 2*f5*X07*X11 + f5*X08*X10 - 
        2*f4*X08*X11 - f3*X08*X13 + f1*X08*X15 + 2*f4*X09*X10 + 
        2*f0*X09*X15,

	X04*X07 - X05*X06 - f6*X06*X10 + f3*X08*X11 + f2*X08*X13 + 
        f1*X08*X14 - f3*X09*X10 + f0*X09*X14,

	X04*X08 - X05*X07 - f6*X06*X11 - f5*X07*X11 + f5*X08*X10 - 
        f4*X08*X11 + f1*X08*X15 + f4*X09*X10 + f0*X09*X15,

	X04*X09 - X05*X08 - f6*X06*X12 - f6*X07*X11 - f5*X07*X12 + 
        f6*X08*X10 - f5*X08*X11 - f4*X08*X12 - 2*f4*X08*X13 - f3*X08*X14
        - f2*X08*X15 + 2*f5*X09*X10 + f4*X09*X11 + f3*X09*X13,

	X06*X13 - X07*X11 + X08*X10,

	X06*X14 - X07*X12 - X08*X11 + 2*X09*X10,

	X06*X15 - X08*X12 - X08*X13 + X09*X11,

	X07*X13 - X08*X11 + X09*X10,

	X07*X14 - X08*X12 - 2*X08*X13 + X09*X11,

	X07*X15 - X08*X14 + X09*X13,

	X00*X07 - X02*X03 - f1*X05*X08 - 2*f0*X05*X09,

	X01*X04 - X02*X03 - f4*X04*X06 - f0*X05*X09 - f3*f6*X06*X10 + 
        (-f3*f5 + f4^2)*X07*X10 - f1*f6*X07*X11 + (f1*f6 - f2*f5 + 
        f3*f4)*X08*X10 + (-f1*f5 + f2*f4)*X08*X11 + (-f0*f5 + 
        f1*f4)*X09*X11 + f0*f4*X09*X12 + f0*f4*X09*X13,

	X02*X15 - X05*X09 + 2*f6*X07*X12 + 2*f6*X08*X11 + 2*f5*X08*X12 + 
        3*f5*X08*X13 + 2*f4*X08*X14 + f3*X08*X15 - 4*f6*X09*X10 - 
        2*f5*X09*X11 - 2*f4*X09*X13,

	X00*X08 - X02*X04 - f6*X03*X06 - f5*X04*X06 + f2*X05*X08 + 
        f4*f5*X07*X10 + f1*f6*X07*X12 + f3*f5*X08*X10 + (f1*f6 + 
        f2*f5)*X08*X11 + f1*f5*X08*X12 + 2*f1*f5*X08*X13 + f1*f4*X08*X14
        + f1*f3*X08*X15 - 2*f1*f6*X09*X10 + f0*f5*X09*X12 + (2*f0*f5 - 
        f1*f4)*X09*X13 + f0*f3*X09*X15,

	X01*X05 - X02*X04 + f6*X03*X06 + f2*X05*X08 + f1*f6*X07*X12 + 
        f1*f6*X08*X11 + f1*f5*X08*X12 + 2*f1*f5*X08*X13 + f1*f4*X08*X14 
        + f1*f3*X08*X15 - 2*f1*f6*X09*X10 - f1*f5*X09*X11 + (f0*f5 - 
        f1*f4)*X09*X13 + f0*f3*X09*X15,

	X00*X09 - X02*X05 - 4*f6*X04*X06 - 3*f5*X05*X06 - 2*f4*X05*X07 - 
        f3*X05*X08 - 4*f5*f6*X06*X10 - f5^2*X07*X10 - 2*f3*f6*X07*X11 + 
        2*f3*f6*X08*X10 + f3*f5*X08*X11 - 2*f1*f6*X08*X12 + (-2*f1*f6 + 
        2*f2*f5)*X08*X13 + f1*f5*X08*X14 - f3*f5*X09*X10 + 
        2*f1*f6*X09*X11 + f1*f5*X09*X13 + 2*f0*f5*X09*X14,

	X00*X10 - X03^2,

	X01*X06 - X03^2 - f4*X06^2 - f3*X06*X07 - 2*f2*X07^2 - 3*f1*X07*X08 
        - 2*f0*X07*X09 - 3*f0*X08^2 + (2*f2*f6 - f3*f5 + f4^2)*X10^2 + 
        (3*f1*f6 - f2*f5 + f3*f4)*X10*X11 + (-2*f0*f6 + 2*f1*f5 - 
        2*f2*f4 + f3^2)*X10*X13 + (5*f0*f6 - f1*f5 + f2*f4)*X11^2 + 
        (-f0*f5 + f1*f4)*X11*X12 + (3*f0*f5 - f1*f4 + f2*f3)*X11*X13 + 
        f0*f4*X12^2 + f1*f3*X12*X13 + f0*f3*X12*X14 + (-f1*f3 + 
        2*f2^2)*X13^2 + (-2*f0*f3 + 2*f1*f2)*X13*X14 + (-4*f0*f2 + 
        2*f1^2)*X13*X15 + 2*f0*f2*X14^2 + 2*f0*f1*X14*X15 + 
        3*f0^2*X15^2,

	X03*X10 - X06^2 + f4*X10^2 + f3*X10*X11 + f2*X11^2 + f1*X11*X12 + 
        f1*X11*X13 + f0*X12^2 + 2*f0*X12*X13 + f0*X13^2,

	X03*X11 - 2*X06*X07 - f5*X10^2 + f3*X10*X13 + 2*f2*X11*X13 + 
        2*f1*X12*X13 + 2*f0*X12*X14 + 3*f1*X13^2 + 2*f0*X13*X14,

	X03*X12 - 2*X06*X08 - f5*X10*X11 - 2*f4*X10*X13 - f3*X11*X13 + 
        f1*X13*X14 - 2*f0*X13*X15 + 2*f0*X14^2,

	X03*X13 - X07^2 + f6*X10^2 + f2*X13^2 + f1*X13*X14 + f0*X14^2,

	X03*X14 - 2*X07*X08 + 2*f6*X10*X11 + f5*X10*X13 - f3*X13^2 + 
        f1*X13*X15 + 2*f0*X14*X15,

	X03*X15 - X08^2 + f6*X11^2 + f5*X11*X13 + f4*X13^2 + f0*X15^2,

	X04*X10 - X06*X07 + f3*X10*X13 + f2*X11*X13 + f1*X12*X13 + 
        f0*X12*X14 + 2*f1*X13^2 + f0*X13*X14,

	X04*X11 - X06*X08 - X07^2 + f6*X10^2 - f4*X10*X13 + f2*X13^2 + 
        2*f1*X13*X14 - f0*X13*X15 + 2*f0*X14^2,

	X04*X12 - X06*X09 - X07*X08 + f6*X10*X11 - f4*X11*X13 - 2*f3*X13^2 -
        f2*X13*X14 + f0*X14*X15,

	X04*X13 - X07*X08 + f6*X10*X11 + f5*X10*X13 + f1*X13*X15 + 
        f0*X14*X15,

	X04*X14 - X07*X09 - X08^2 - f6*X10*X13 + 2*f6*X11^2 + 2*f5*X11*X13 +
        f4*X13^2 - f2*X13*X15 + f0*X15^2,

	X05*X10 - X07^2 + f6*X10^2 + f2*X13^2 + f1*X13*X14 + f0*X14^2,

	X05*X11 - 2*X07*X08 + 2*f6*X10*X11 + f5*X10*X13 - f3*X13^2 + 
        f1*X13*X15 + 2*f0*X14*X15,

	X05*X12 - 2*X07*X09 - 2*f6*X10*X13 + 2*f6*X11^2 + f5*X11*X13 - 
        f3*X13*X14 - 2*f2*X13*X15 - f1*X14*X15,

	X05*X13 - X08^2 + f6*X11^2 + f5*X11*X13 + f4*X13^2 + f0*X15^2,

	X10*X12 + 2*X10*X13 - X11^2,

	X10*X14 - X11*X13,

	X10*X15 - X13^2,

	X11*X14 - X12*X13 - 2*X13^2,

	X11*X15 - X13*X14,

	X12*X15 + 2*X13*X15 - X14^2,

	X00*X11 - 2*X03*X04 - f5*X06^2 - f3*X07^2 - f1*X08^2 + (f3*f6 + 
        f4*f5)*X10^2 + f3*f5*X10*X11 + (f1*f6 + f2*f5)*X11^2 + 
        f1*f5*X11*X12 + 2*f1*f5*X11*X13 + f0*f5*X12^2 + 2*f0*f5*X12*X13 
        + (f0*f5 + f1*f4 + f2*f3)*X13^2 + f1*f3*X13*X14 + f0*f3*X14^2 + 
        f0*f1*X15^2,

	X01*X07 - X03*X04 - f1*X08^2 - 2*f0*X08*X09 + f3*f6*X10^2 + 
        2*f2*f6*X10*X11 + (-f1*f6 + f2*f5)*X10*X13 + 3*f1*f6*X11^2 + 
        4*f0*f6*X11*X12 + (4*f0*f6 + 2*f1*f5)*X11*X13 + 3*f0*f5*X12*X13 
        + (5*f0*f5 + f1*f4)*X13^2 + 2*f0*f4*X13*X14 + f0*f3*X13*X15,

	X02*X06 - X03*X04 - f3*X07^2 - 2*f2*X07*X08 - f1*X07*X09 - 
        2*f1*X08^2 - 4*f0*X08*X09 + f3*f6*X10^2 + 2*f2*f6*X10*X11 + 
        (-f1*f6 + f2*f5)*X10*X13 + 3*f1*f6*X11^2 + 4*f0*f6*X11*X12 + 
        (4*f0*f6 + 2*f1*f5)*X11*X13 + 3*f0*f5*X12*X13 + (5*f0*f5 + 
        f1*f4)*X13^2 + 2*f0*f4*X13*X14 + f0*f3*X13*X15,

	X04*X15 - X08*X09 + f6*X11*X12 + f6*X11*X13 + f5*X12*X13 + 
        2*f5*X13^2 + f4*X13*X14 + f3*X13*X15,

	X05*X14 - 2*X08*X09 + 2*f6*X11*X12 + 2*f6*X11*X13 + 2*f5*X12*X13 + 
        3*f5*X13^2 + 2*f4*X13*X14 + f3*X13*X15 - f1*X15^2,

	X00*X12 - 2*X04^2 - 2*f6*X06^2 - 4*f5*X06*X07 - 2*f4*X07^2 - 
        4*f3*X07*X08 - 2*f2*X08^2 - 4*f1*X08*X09 - 2*f0*X09^2 + (2*f4*f6
        - f5^2)*X10^2 + 4*f3*f6*X10*X11 + 4*f3*f5*X10*X13 + 
        2*f2*f6*X11^2 + 4*f1*f6*X11*X12 + (4*f1*f6 + 4*f2*f5)*X11*X13 + 
        2*f0*f6*X12^2 + (4*f0*f6 + 6*f1*f5)*X12*X13 + 4*f0*f5*X12*X14 + 
        (2*f0*f6 + 10*f1*f5 + 2*f2*f4 - f3^2)*X13^2 + (4*f0*f5 + 
        4*f1*f4)*X13*X14 + 4*f1*f3*X13*X15 + 2*f0*f4*X14^2 + 
        4*f0*f3*X14*X15 + (2*f0*f2 - f1^2)*X15^2,

	X00*X13 - X04^2 + f6*X06^2 + f4*X07^2 + f2*X08^2 + f0*X09^2 - 
        f4*f6*X10^2 + f3*f5*X10*X13 - f2*f6*X11^2 - f0*f6*X12^2 + 
        (-2*f0*f6 + f1*f5)*X12*X13 + (-f0*f6 + 2*f1*f5 - f2*f4)*X13^2 + 
        f1*f3*X13*X15 - f0*f4*X14^2 - f0*f2*X15^2,

	X01*X08 - X04^2 - f6*X06^2 - f5*X06*X07 + f2*X08^2 + f3*f6*X10*X11 +
        f3*f5*X10*X13 + f2*f6*X11^2 + 2*f1*f6*X11*X12 + (3*f1*f6 + 
        f2*f5)*X11*X13 + 2*f0*f6*X12^2 + (6*f0*f6 + 2*f1*f5)*X12*X13 + 
        2*f0*f5*X12*X14 + (4*f0*f6 + 4*f1*f5)*X13^2 + (3*f0*f5 + 
        f1*f4)*X13*X14 + f1*f3*X13*X15 + f0*f4*X14^2 + f0*f3*X14*X15,

	X02*X07 - X04^2 + f4*X07^2 - f1*X08*X09 - f0*X09^2 + f3*f6*X10*X11 +
        f3*f5*X10*X13 + f2*f6*X11^2 + 2*f1*f6*X11*X12 + (3*f1*f6 + 
        f2*f5)*X11*X13 + 2*f0*f6*X12^2 + (6*f0*f6 + 2*f1*f5)*X12*X13 + 
        2*f0*f5*X12*X14 + (4*f0*f6 + 4*f1*f5)*X13^2 + (3*f0*f5 + 
        f1*f4)*X13*X14 + f1*f3*X13*X15 + f0*f4*X14^2 + f0*f3*X14*X15,

	X03*X05 - X04^2 + f6*X06^2 + f4*X07^2 + f2*X08^2 + f0*X09^2 - 
        f4*f6*X10^2 + f3*f5*X10*X13 - f2*f6*X11^2 - f0*f6*X12^2 + 
        (-2*f0*f6 + f1*f5)*X12*X13 + (-f0*f6 + 2*f1*f5 - f2*f4)*X13^2 + 
        f1*f3*X13*X15 - f0*f4*X14^2 - f0*f2*X15^2,

	X05*X15 - X09^2 + f6*X12^2 + 2*f6*X12*X13 + f5*X12*X14 + f6*X13^2 + 
        f5*X13*X14 + f4*X14^2 + f3*X14*X15 + f2*X15^2,

	X00*X14 - 2*X04*X05 - f5*X07^2 - f3*X08^2 - f1*X09^2 + f5*f6*X10^2 +
        f3*f6*X11^2 + f3*f5*X11*X13 + f1*f6*X12^2 + 2*f1*f6*X12*X13 + 
        f1*f5*X12*X14 + (f1*f6 + f2*f5 + f3*f4)*X13^2 + 2*f1*f5*X13*X14 
        + (f0*f5 + f1*f4)*X14^2 + f1*f3*X14*X15 + (f0*f3 + f1*f2)*X15^2,

	X01*X09 - X04*X05 - 4*f6*X06*X07 - f5*X06*X08 - 2*f5*X07^2 - 
        2*f4*X07*X08 - f3*X08^2 + f3*f6*X10*X13 + 2*f2*f6*X11*X13 + 
        3*f1*f6*X12*X13 + 4*f0*f6*X12*X14 + (5*f1*f6 + f2*f5)*X13^2 + 
        (4*f0*f6 + 2*f1*f5)*X13*X14 + (-f0*f5 + f1*f4)*X13*X15 + 
        3*f0*f5*X14^2 + 2*f0*f4*X14*X15 + f0*f3*X15^2,

	X02*X08 - X04*X05 - 2*f6*X06*X07 - f5*X07^2 + f3*f6*X10*X13 + 
        2*f2*f6*X11*X13 + 3*f1*f6*X12*X13 + 4*f0*f6*X12*X14 + (5*f1*f6 +
        f2*f5)*X13^2 + (4*f0*f6 + 2*f1*f5)*X13*X14 + (-f0*f5 + 
        f1*f4)*X13*X15 + 3*f0*f5*X14^2 + 2*f0*f4*X14*X15 + f0*f3*X15^2,

	X00*X15 - X05^2,

	X02*X09 - X05^2 - 2*f6*X06*X08 - 3*f6*X07^2 - 3*f5*X07*X08 - 
        2*f4*X08^2 - f3*X08*X09 - f2*X09^2 + 3*f6^2*X10^2 + 
        2*f5*f6*X10*X11 + (-4*f4*f6 + 2*f5^2)*X10*X13 + 2*f4*f6*X11^2 + 
        f3*f6*X11*X12 + (-2*f3*f6 + 2*f4*f5)*X11*X13 + f2*f6*X12^2 + 
        f3*f5*X12*X13 + (-f1*f6 + f2*f5)*X12*X14 + (-f3*f5 + 
        2*f4^2)*X13^2 + (3*f1*f6 - f2*f5 + f3*f4)*X13*X14 + (-2*f0*f6 + 
        2*f1*f5 - 2*f2*f4 + f3^2)*X13*X15 + (5*f0*f6 - f1*f5 + 
        f2*f4)*X14^2 + (3*f0*f5 - f1*f4 + f2*f3)*X14*X15 + (2*f0*f4 - 
        f1*f3 + f2^2)*X15^2

	];
    return a, rels;
end intrinsic;
