ZZn12 line(ECn2& A,ECn2& C,ZZn2& slope,ZZn& Qx,ZZn& Qy) { ZZn12 w; ZZn6 nn,dd; ZZn2 X,Y; #ifdef AFFINE A.get(X,Y); dd.set(slope*Qx,Y-slope*X); nn.set((ZZn2)-Qy); w.set(nn,dd); #endif #ifdef PROJECTIVE ZZn2 Z,Z2,ZZ,ZZZ; A.get(X,Y,Z); C.getZ(Z2); ZZ=Z*Z; ZZZ=ZZ*Z; dd.set((ZZZ*slope)*Qx,Z2*Y-Z*X*slope); nn.set((ZZn2)-(ZZZ*Z2)*Qy); w.set(nn,dd); #endif return w; }
ZZn12 line(ECn2& A,ECn2& C,ECn2& B,ZZn2& slope,ZZn2& extra,BOOL Doubling,ZZn& Qx,ZZn& Qy) { ZZn12 w; ZZn4 nn,dd; ZZn2 X,Y; ZZn2 Z3; C.getZ(Z3); // Thanks to A. Menezes for pointing out this optimization... if (Doubling) { ZZn2 Z,ZZ; A.get(X,Y,Z); ZZ=Z; ZZ*=ZZ; nn.set((Z3*ZZ)*Qy,slope*X-extra); dd.set(-(ZZ*slope)*Qx); } else { ZZn2 X2,Y2; B.get(X2,Y2); nn.set(Z3*Qy,slope*X2-Y2*Z3); dd.set(-slope*Qx); } w.set(nn,dd); return w; }
ZZn12 gp(ZZn2* ptable,int &j,ZZn& Px,ZZn& Py) { ZZn12 w; ZZn4 nn,dd; nn.set(Py,ptable[j+1]); dd.set(ptable[j]*Px); j+=2; w.set(nn,dd); return w; }
ZZn12 line(ECn2& A,ECn2& C,ECn2&B,ZZn2& slope,ZZn2& extra,BOOL Doubling,ZZn& Qx,ZZn& Qy) { ZZn12 w; ZZn6 nn,dd; ZZn2 X,Y; #ifdef AFFINE A.get(X,Y); dd.set(slope*Qx,Y-slope*X); nn.set((ZZn2)-Qy); w.set(nn,dd); #endif #ifdef PROJECTIVE ZZn2 Z3; C.getZ(Z3); // Thanks to A. Menezes for pointing out this optimization... if (Doubling) { ZZn2 Z,ZZ; A.get(X,Y,Z); ZZ=Z; ZZ*=ZZ; dd.set(-(ZZ*slope)*Qx,slope*X-extra); nn.set((Z3*ZZ)*Qy); } else { ZZn2 X2,Y2; B.get(X2,Y2); dd.set(-slope*Qx,slope*X2-Y2*Z3); nn.set(Z3*Qy); } w.set(nn,dd); #endif //cout << "w= " << w << endl; return w; }
ZZn12 line(ECn2& A,ECn2& C,ECn2& B,ZZn2& slope,ZZn2& extra,BOOL Doubling,ZZn& Qx,ZZn& Qy) { ZZn12 w; ZZn4 nn,dd,cc; ZZn2 X,Y; #ifdef AFFINE A.get(X,Y); if (get_mip()->TWIST==MR_SEXTIC_M) { nn.set(txx((ZZn2)-Qy),Y-slope*X); cc.seth(slope*Qx); } if (get_mip()->TWIST==MR_SEXTIC_D) { nn.set((ZZn2)-Qy,Y-slope*X); dd.set(slope*Qx); } w.set(nn,dd,cc); #endif #ifdef PROJECTIVE ZZn2 Z3; C.getZ(Z3); // Thanks to A. Menezes for pointing out this optimization... if (Doubling) { ZZn2 Z,ZZ; A.get(X,Y,Z); ZZ=Z; ZZ*=ZZ; if (get_mip()->TWIST==MR_SEXTIC_M) { // "multiplied across" by i to simplify nn.set((Z3*ZZ)*txx((ZZn2)Qy),slope*X-extra); cc.seth(-(ZZ*slope)*Qx); } if (get_mip()->TWIST==MR_SEXTIC_D) { nn.set((Z3*ZZ)*Qy,slope*X-extra); dd.set(-(ZZ*slope)*Qx); } } else { ZZn2 X2,Y2; B.get(X2,Y2); if (get_mip()->TWIST==MR_SEXTIC_M) { nn.set(Z3*txx((ZZn2)Qy),slope*X2-Y2*Z3); cc.seth(-slope*Qx); } if (get_mip()->TWIST==MR_SEXTIC_D) { nn.set(Z3*Qy,slope*X2-Y2*Z3); dd.set(-slope*Qx); } } w.set(nn,dd,cc); #endif return w; }