Я уже проверял подобные вопросы, но я не мог решить свою проблему. Наиболее актуальным является Elliptic curve addition in Jacobian coordinates, но решения нет.Добавление эллиптической точки кривой в якобиан Координаты
У меня есть вспомогательный класс, называемый якобиан, который будет иметь три якобиевы координаты X, Y & X Я последовал алгоритм опубликован на http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-2007-bl
Алгоритм является:
Z1Z1 = Z12
Z2Z2 = Z22
U1 = X1*Z2Z2
U2 = X2*Z1Z1
S1 = Y1*Z2*Z2Z2
S2 = Y2*Z1*Z1Z1
H = U2-U1
I = (2*H)2
J = H*I
r = 2*(S2-S1)
V = U1*I
X3 = r2-J-2*V
Y3 = r*(V-X3)-2*S1*J
Z3 = ((Z1+Z2)2-Z1Z1-Z2Z2)*H
Когда я проверил результат не на определенной кривой. Я также проверил его с Sage, но у меня получился другой результат.
public Jacobian pointAddition(Jacobian jp1, Jacobian jp2){
/*
Reference: http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-2007-bl
Z1Z1 = Z12
Z2Z2 = Z22
U1 = X1*Z2Z2
U2 = X2*Z1Z1
S1 = Y1*Z2*Z2Z2
S2 = Y2*Z1*Z1Z1
H = U2-U1
I = (2*H)2
J = H*I
r = 2*(S2-S1)
V = U1*I
X3 = r2-J-2*V
Y3 = r*(V-X3)-2*S1*J
Z3 = ((Z1+Z2)2-Z1Z1-Z2Z2)*H
*/
if(arePointsInverse(jp1, jp2)){
return P0;
}
if(arePointsEqual(jp1, jp2)){
return pointDoubling(jp1);
}
if(jp1.isInfinity(getGf())){
return jp2;
}
if(jp2.isInfinity(getGf())){
return jp1;
}
BigInteger X1 = jp1.getX();
BigInteger Y1 = jp1.getY();
BigInteger Z1 = jp1.getZ();
BigInteger X2 = jp2.getX();
BigInteger Y2 = jp2.getY();
BigInteger Z2 = jp2.getZ();
BigInteger X3,Y3,Z3;
BigInteger Z1Z1 = Z1.multiply(Z1);
//BigInteger Z1Z1 = Z1.pow(2).mod(getGf());
BigInteger Z2Z2 = Z2.multiply(Z2);
//BigInteger Z2Z2 = Z2.pow(2).mod(getGf());
BigInteger U1 = X1.multiply(Z2Z2);
BigInteger U2 = X2.multiply(Z1Z1);
BigInteger S1 = Y1.multiply(Z2.multiply(Z2Z2));
BigInteger S2 = Y2.multiply(Z1.multiply(Z1Z1));
BigInteger H = U2.subtract(U1);
BigInteger I = (TWO.multiply(H)).pow(2);
BigInteger J = H.multiply(I);
BigInteger r = TWO.multiply(S2.subtract(S1));
BigInteger V = U1.multiply(I);
X3 = ((r.multiply(r)).subtract(J).subtract(TWO.multiply(V))).mod(getGf());
Y3 = ((r.multiply(V.subtract(X3))).subtract(TWO.multiply(S1.multiply(J))))
.mod(getGf());
Z3 = ((((Z1.add(Z2)).pow(2)).subtract(Z1Z1).subtract(Z2Z2)).multiply(H))
.mod(getGf());
return new Jacobian(X3,Y3,Z3);
}
Ваш вопрос будет полезен для вычислительной науки. http://scicomp.stackexchange.com/ –
Не говорите нам, что вы уже «проверили все [релевантную документацию]». Вероятно, это даже не так, и это не поможет вам ответить. Расскажите нам, какие ** конкретные ** документы были ближе всего к ответу на ваш вопрос и почему они этого не сделали. –
@PascalCuoq По крайней мере, я утверждаю, что я уже проверил все из них. Наиболее актуальным является http://stackoverflow.com/questions/21463018/elliptic-curve-addition-in-jacobian-coordinates?rq=1 – Nayef