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);