Speed records:
Some speed records are different when S/M and D/M are both small:
The following commands for the Magma computer-algebra system check various addition formulas for extended Jacobi-quartic coordinates.
Extended-Jacobi-quartic scaling.
K<a,X1,Y1>:=FieldOfFractions(PolynomialRing(Rationals(),3)); b:=-2*a; R<Z1>:=PolynomialRing(K,1); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4>; U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); // here are the formulas: A:=2*W1; B:=1/A; X2:=V1*B; Y2:=2*Y1*B; Z2:=1; U2:=X2^2; V2:=2*X2; W2:=1; T2:=U2+W2; // check: x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; S!(U2-X2^2); S!(V2-2*X2*Z2); S!(W2-Z2^2); S!(T2-U2-W2); S!(Z2-1); S!(x2-x1); S!(y2-y1);
Extended-Jacobi-quartic addition (8M + 3S + 1D + 12add + 2times2 + 1times4) matches traditional addition. 2007 Duquesne, page 103, Table 1, modified to replace V by V/2, 9M + 2S + 1D + 13add + 2times2 + 2div2, strongly unified:
K<a,X1,Y1,X2,Y2>:=FieldOfFractions(PolynomialRing(Rationals(),5)); b:=-2*a; R<Z1,Z2>:=PolynomialRing(K,2); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4,Y2^2-X2^4-2*a*X2^2*Z2^2-Z2^4>; // affine: x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; U2:=X2^2; V2:=2*X2*Z2; W2:=Z2^2; T2:=U2+W2; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); S!(U2-X2^2); S!(V2-2*X2*Z2); S!(W2-Z2^2); S!(T2-U2-W2); // here are the formulas: R1:=U1; R2:=U2; R3:=V1/2; R4:=V2/2; R5:=W1; R6:=W2; R7:=Y1; R8:=Y2; R9:=R7*R8; R7:=R7+R3; R8:=R8+R4; R3:=R3*R4; R7:=R7*R8; R7:=R7-R9; R7:=R7-R3; R4:=R1*R2; R8:=R5*R6; R1:=R1+R5; R2:=R2+R6; R5:=R1*R2; R5:=R5-R4; R5:=R5-R8; R1:=R8-R4; R2:=R8+R4; R6:=b*R3; R6:=R9-R6; R6:=R6*R2; R3:=2*R3; R3:=R5*R3; R8:=R6+R3; R2:=R7^2; R4:=R1*R7; R6:=R1^2; X3:=R7; Y3:=R8; Z3:=R1; U3:=R2; V3:=2*R4; W3:=R6; T3:=U3+W3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);
2007 Bernstein/Lange, 8M + 3S + 1D + 12add + 2times2 + 1times4, strongly unified:
K<a,X1,Y1,X2,Y2>:=FieldOfFractions(PolynomialRing(Rationals(),5)); R<Z1,Z2>:=PolynomialRing(K,2); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4,Y2^2-X2^4-2*a*X2^2*Z2^2-Z2^4>; // affine: x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; U2:=X2^2; V2:=2*X2*Z2; W2:=Z2^2; T2:=U2+W2; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); S!(U2-X2^2); S!(V2-2*X2*Z2); S!(W2-Z2^2); S!(T2-U2-W2); // here are the formulas: E1:=V1+Y1; E2:=V2+Y2; U1U2:=U1*U2; V1V2:=V1*V2; W1W2:=W1*W2; Y1Y2:=Y1*Y2; F:=W1W2+U1U2; G:=2*V1V2; X3:=E1*E2-V1V2-Y1Y2; Y3:=F*(4*Y1Y2+a*G)+(T1*T2-F)*G; Z3:=2*(W1W2-U1U2); U3:=X3^2; W3:=Z3^2; T3:=U3+W3; V3:=(X3+Z3)^2-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);
Extended-Jacobi-quartic mixed addition (7M + 3S + 1D + 12add + 2times2 + 1times4) matches traditional addition. 2007 Bernstein/Lange, 7M + 3S + 1D + 12add + 2times2 + 1times4:
K<a,X1,Y1,X2>:=FieldOfFractions(PolynomialRing(Rationals(),4)); R<Z1,Y2>:=PolynomialRing(K,2); Z2:=1; S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4,Y2^2-X2^4-2*a*X2^2*Z2^2-Z2^4>; // affine: x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; U2:=X2^2; V2:=2*X2*Z2; W2:=Z2^2; T2:=U2+W2; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); S!(U2-X2^2); S!(V2-2*X2*Z2); S!(W2-Z2^2); S!(T2-U2-W2); // here are the formulas: E1:=V1+Y1; E2:=V2+Y2; U1U2:=U1*U2; V1V2:=V1*V2; Y1Y2:=Y1*Y2; F:=W1+U1U2; G:=2*V1V2; X3:=E1*E2-V1V2-Y1Y2; Y3:=F*(4*Y1Y2+a*G)+(T1*T2-F)*G; Z3:=2*(W1-U1U2); U3:=X3^2; W3:=Z3^2; T3:=U3+W3; V3:=(X3+Z3)^2-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);
Extended-Jacobi-quartic addition with Z1=1 and Z2=1. 2007 Bernstein/Lange, 5M + 4S + 1D + 12add + 1times2:
K<a,X1,X2>:=FieldOfFractions(PolynomialRing(Rationals(),3)); R<Y1,Y2>:=PolynomialRing(K,2); Z1:=1; Z2:=1; S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4,Y2^2-X2^4-2*a*X2^2*Z2^2-Z2^4>; // affine: x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1; T1:=U1+1; U2:=X2^2; V2:=2*X2; T2:=U2+1; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(1-Z1^2); S!(T1-U1-1); S!(U2-X2^2); S!(V2-2*X2*Z2); S!(1-Z2^2); S!(T2-U2-1); // here are the formulas: E1:=X1+Y1; E2:=X2+Y2; B:=X1*X2; U1U2:=B^2; Y1Y2:=Y1*Y2; F:=1+U1U2; G:=2*B; X3:=E1*E2-B-Y1Y2; Y3:=F*(Y1Y2+a*G)+(U1+U2)*G; Z3:=1-U1U2; U3:=X3^2; W3:=Z3^2; T3:=U3+W3; V3:=(X3+Z3)^2-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);
Extended-Jacobi-quartic doubling (3M + 4S + 7add + 1times2) matches traditional doubling. 2007 Duquesne, page 103, Table 1, modified to replace V by V/2, 9M + 2S + 1D + 13add + 2times2 + 2div2, strongly unified:
K<a,X1,Y1>:=FieldOfFractions(PolynomialRing(Rationals(),3)); b:=-2*a; R<Z1>:=PolynomialRing(K,1); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4>; // affine: X2:=X1; Y2:=Y1; Z2:=Z1; x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; U2:=X2^2; V2:=2*X2*Z2; W2:=Z2^2; T2:=U2+W2; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); S!(U2-X2^2); S!(V2-2*X2*Z2); S!(W2-Z2^2); S!(T2-U2-W2); // here are the formulas: R1:=U1; R2:=U2; R3:=V1/2; R4:=V2/2; R5:=W1; R6:=W2; R7:=Y1; R8:=Y2; R9:=R7*R8; R7:=R7+R3; R8:=R8+R4; R3:=R3*R4; R7:=R7*R8; R7:=R7-R9; R7:=R7-R3; R4:=R1*R2; R8:=R5*R6; R1:=R1+R5; R2:=R2+R6; R5:=R1*R2; R5:=R5-R4; R5:=R5-R8; R1:=R8-R4; R2:=R8+R4; R6:=b*R3; R6:=R9-R6; R6:=R6*R2; R3:=2*R3; R3:=R5*R3; R8:=R6+R3; R2:=R7^2; R4:=R1*R7; R6:=R1^2; X3:=R7; Y3:=R8; Z3:=R1; U3:=R2; V3:=2*R4; W3:=R6; T3:=U3+W3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);
2007 Bernstein/Lange, 8M + 3S + 1D + 12add + 2times2 + 1times4, strongly unified:
K<a,X1,Y1>:=FieldOfFractions(PolynomialRing(Rationals(),3)); R<Z1>:=PolynomialRing(K,1); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4>; // affine: X2:=X1; Y2:=Y1; Z2:=Z1; x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; U2:=X2^2; V2:=2*X2*Z2; W2:=Z2^2; T2:=U2+W2; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); S!(U2-X2^2); S!(V2-2*X2*Z2); S!(W2-Z2^2); S!(T2-U2-W2); // here are the formulas: E1:=V1+Y1; E2:=V2+Y2; U1U2:=U1*U2; V1V2:=V1*V2; W1W2:=W1*W2; Y1Y2:=Y1*Y2; F:=W1W2+U1U2; G:=2*V1V2; X3:=E1*E2-V1V2-Y1Y2; Y3:=F*(4*Y1Y2+a*G)+(T1*T2-F)*G; Z3:=2*(W1W2-U1U2); U3:=X3^2; W3:=Z3^2; T3:=U3+W3; V3:=(X3+Z3)^2-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);
2007 Hisil/Carter/Dawson, 3M + 4S + 7add + 1times2:
K<a,X1,Y1>:=FieldOfFractions(PolynomialRing(Rationals(),3)); R<Z1>:=PolynomialRing(K,1); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4>; // affine: X2:=X1; Y2:=Y1; Z2:=Z1; x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); // here are the formulas: B := U1-W1; C := Y1*T1; X3 := C-Y1*(T1+V1); Z3 := T1*B; U3 := X3^2; W3 := Z3^2; T3 := U3+W3; V3 := (X3+Z3)^2-T3; Y3 := 2*C^2-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);
2007 Feng/Wu, first JQN2 doubling formula, obvious typos corrected:
K<a,X1,Y1>:=FieldOfFractions(PolynomialRing(Rationals(),3)); epsilon:=1; delta:=-a; R<Z1>:=PolynomialRing(K,1); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4>; // affine: X2:=X1; Y2:=Y1; Z2:=Z1; x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); // here are the formulas: R1:=(X1*Z1+Y1)^2; R2:=Y1^2; Q1:=(X1^2)^2; S1:=(X1*Z1)^2; T:=R2-epsilon*Q1+2*delta*S1; X3:=R1-R2-S1; Y3:=(T+epsilon*Q1)*(R2-2*delta*S1)+4*epsilon*S1^2; Z3:=T-epsilon*Q1; U3:=X3^2; W3:=Z3^2; T3:=U3+W3; V3:=(X3+Z3)^2-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);2007 Feng/Wu, first JQN2 doubling formula, obvious typos corrected, epsilon=1, scaled, common subexpressions eliminated, 1M + 8S + 1D + 10add + 2times2 + 1times4 + 1times8:
K<a,X1,Y1>:=FieldOfFractions(PolynomialRing(Rationals(),3)); epsilon:=1; delta:=-a; R<Z1>:=PolynomialRing(K,1); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4>; // affine: X2:=X1; Y2:=Y1; Z2:=Z1; x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); // here are the formulas: R1:=(V1+2*Y1)^2; R2:=4*Y1^2; Q1:=U1^2; S1:=V1^2; S12:=2*S1; M:=delta*S12; R2M:=R2+M; X3:=R1-R2-S1; Y3:=R2M*(R2-M)+S12^2; Z3:=R2M-8*Q1; U3:=X3^2; W3:=Z3^2; T3:=U3+W3; V3:=(X3+Z3)^2-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);2007 Feng/Wu, second JQN2 doubling formula, using alpha = sqrt(1 - delta^2):
K<a,X1,Y1>:=FieldOfFractions(PolynomialRing(Rationals(),3)); epsilon:=1; delta:=-a; R<Z1,alpha>:=PolynomialRing(K,2); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4,alpha^2+delta^2-epsilon>; // affine: X2:=X1; Y2:=Y1; Z2:=Z1; x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); // here are the formulas: T1:=(X1*Z1)^2; T2:=Y1^2; S1:=(T2+2*alpha*T1)^2; U:=(X1*Z1+Y1)^2-T1-T2; V:=U^2; X3:=U; Y3:=S1-alpha*V; Z3:=T2+2*delta*T1-2*epsilon*X1^4; U3:=X3^2; W3:=Z3^2; T3:=U3+W3; V3:=(X3+Z3)^2-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);2007 Feng/Wu, second JQN2 doubling formula, using alpha = sqrt(1 - delta^2), epsilon=1, scaled, common subexpressions eliminated, 8S + 3D + 10add + 2times2 + 1times8:
K<a,X1,Y1>:=FieldOfFractions(PolynomialRing(Rationals(),3)); epsilon:=1; delta:=-a; R<Z1,alpha>:=PolynomialRing(K,2); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4,alpha^2+delta^2-epsilon>; // affine: X2:=X1; Y2:=Y1; Z2:=Z1; x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); // here are the formulas: Y12:=2*Y1; T1:=V1^2; T12:=2*T1; T2:=Y12^2; X3:=(V1+Y12)^2-T1-T2; U3:=X3^2; Y3:=(T2+alpha*T12)^2-alpha*U3; Z3:=T2+delta*T12-8*U1^2; W3:=Z3^2; T3:=U3+W3; V3:=(X3+Z3)^2-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);
Extended-Jacobi-quartic doubling with Z1=1. 2007 Hisil/Carter/Dawson, 1M + 6S + 11add + 2times2:
K<a,X1>:=FieldOfFractions(PolynomialRing(Rationals(),2)); R<Y1>:=PolynomialRing(K,1); Z1:=1; S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4>; // affine: X2:=X1; Y2:=Y1; Z2:=Z1; x1:=X1/Z1; y1:=Y1/Z1^2; x2:=X2/Z2; y2:=Y2/Z2^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1; W1:=1; T1:=U1+1; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(1-Z1^2); S!(T1-U1-1); // here are the formulas: A:=U1^2; B:=Y1^2; X3 := -(X1+Y1)^2+U1+B; Z3 := A-1; U3 := X3^2; W3 := Z3^2; T3 := U3+W3; V3 := (X3+Z3)^2-T3; Y3 := 2*B*(A+2*U1+1)-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);
Extended-Jacobi-quartic tripling (4M + 11S + 2D + 13add + 2times2 + 2times4) matches traditional tripling. 2007 Hisil/Carter/Dawson, 8M + 7S + 1D + 15add + 4times2:
K<a,X1,Y1>:=FieldOfFractions(PolynomialRing(Rationals(),3)); R<Z1>:=PolynomialRing(K,1); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4>; // affine: x1:=X1/Z1; y1:=Y1/Z1^2; r:=1-(x1*x1)^2; x2:=(x1*y1+y1*x1)/r; y2:=((1+(x1*x1)^2)*(y1*y1+2*a*x1*x1)+2*x1*x1*(x1^2+x1^2))/r^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); // here are the formulas: A := U1^2; B := W1^2; C := A+B; D := 2*((U1+W1)^2-C); E := A-B; F := 2*A; G := 2*B; J := a*D+2*C; K := J+E; L := J-E; M := C*E; N := G*K; P := F*L; X3 := X1*(M-N); Y3 := Y1*((M+N)*(P-M)+(D*E)^2); Z3 := Z1*(P+M); U3 := X3^2; W3 := Z3^2; T3 := U3+W3; V3 := (X3+Z3)^2-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);
2007 Hisil/Carter/Dawson, 4M + 11S + 2D + 13add + 2times2 + 2times4:
K<a,X1,Y1>:=FieldOfFractions(PolynomialRing(Rationals(),3)); b:=a^2-1; R<Z1>:=PolynomialRing(K,1); S:=quo<R|Y1^2-X1^4-2*a*X1^2*Z1^2-Z1^4>; // affine: x1:=X1/Z1; y1:=Y1/Z1^2; r:=1-(x1*x1)^2; x2:=(x1*y1+y1*x1)/r; y2:=((1+(x1*x1)^2)*(y1*y1+2*a*x1*x1)+2*x1*x1*(x1^2+x1^2))/r^2; r:=1-(x1*x2)^2; x3:=(x1*y2+y1*x2)/r; y3:=((1+(x1*x2)^2)*(y1*y2+2*a*x1*x2)+2*x1*x2*(x1^2+x2^2))/r^2; S!(y1^2-x1^4-2*a*x1^2-1); S!(y2^2-x2^4-2*a*x2^2-1); S!(y3^2-x3^4-2*a*x3^2-1); // already part of input: U1:=X1^2; V1:=2*X1*Z1; W1:=Z1^2; T1:=U1+W1; S!(U1-X1^2); S!(V1-2*X1*Z1); S!(W1-Z1^2); S!(T1-U1-W1); // here are the formulas: UU:=U1^2; WW:=W1^2; VV:=V1^2; A := 4*(UU - WW); AA:=A^2; B := 2*(UU + WW) + a*VV; BB:=B^2; AB:=(A+B)^2-AA-BB; C := b*VV^2; R:=2*(BB-C); X3 := X1*(AB - R); Z3 := Z1*(AB + R); Y3 := Y1*(R^2 - 4*AA*C); U3 := X3^2; W3 := Z3^2; T3 := U3+W3; V3 := (X3+Z3)^2-T3; // check: S!(U3-X3^2); S!(V3-2*X3*Z3); S!(W3-Z3^2); S!(T3-U3-W3); S!(x3-X3/Z3); S!(y3-Y3/Z3^2);