void g(ECn& A,ECn& B,ZZn& Qx,ZZn2& Qy,ZZn2& num,BOOL precomp,ZZn* store,int& ptr) { ZZn lam,x,y,m,nx; ZZn2 u; big pointer; if (num.iszero()) return; if (!precomp) { // Store line start point and slope. // Evaluate line from A, and then evaluate vertical through destination extract(A,x,y); pointer=A.add(B); if (pointer==NULL) {num=0; return;} lam=pointer; store[ptr++]=x; store[ptr++]=y; store[ptr++]=lam; if (A.iszero()) return; // line m=Qx; u=Qy; m-=x; m*=lam; // 1 ZZn muls u-=y; u-=m; } else { // extract precalculated values from the store.... - nx is a peek ahead x=store[ptr++]; y=store[ptr++]; lam=store[ptr++]; nx=store[ptr]; if (nx.iszero()) return; m=Qx; u=Qy; m-=x; m*=lam; // 1 ZZn muls u-=y; u-=m; } num*=u; // 3 ZZn muls }
void g(ECn& A,ECn& B,ZZn2& Qx,ZZn2& Qy,ZZn2& num) { ZZn lam,mQy; ZZn2 d,u; big ptr; ECn P=A; // Evaluate line from A A.add(B, &ptr, NULL, NULL); #ifndef SCOTT if (A.iszero()) { u=vertical(P,Qx); d=1; } else { #endif if (ptr==NULL) u=1; else { lam=ptr; u=line(P,A,lam,Qx,Qy); } #ifndef SCOTT d=vertical(A,Qx); } num*=(u*conj(d)); // 6 ZZn muls #else // denominator elimination! num*=u; #endif }
void g(ECn& A,ECn& B,ZZn2& Qx,ZZn2& Qy,ZZn2& num) { int type; ZZn lam,mQy; ZZn2 d,u; big ptr; ECn P=A; // Evaluate line from A type=A.add(B,&ptr); #ifndef SCOTT if (!type) { u=vertical(P,Qx); d=1; } else { #endif lam=ptr; u=line(P,A,lam,Qx,Qy); #ifndef SCOTT d=vertical(A,Qx); } num*=(u*conj(d)); // 6 ZZn muls #else // denominator elimination! num*=u; #endif }
ZZn6 g(ECn& A,ECn& B,ECn& C,ECn& D,ZZn3& Qx,ZZn3& Qy,ZZn3& Sx,ZZn3& Sy) { ZZn6 u; ZZn lam; big ptr; ECn P; P=A; ptr=A.add(B); if (ptr==NULL) return (ZZn6)1; lam=ptr; u=line(P,A,lam,Qx,Qy); P=C; ptr=C.add(D); if (ptr==NULL) return (ZZn6)1; lam=ptr; return u*line(P,C,lam,Sx,Sy); }
ZZn6 g(ECn& A,ECn& B,ECn& C,ECn& D,ZZn3& Qx,ZZn3& Qy,ZZn3& Sx,ZZn3& Sy) { ZZn6 u; int type; ZZn lam; big ptr; ECn P; P=A; type=A.add(B,&ptr); if (!type) return (ZZn6)1; lam=ptr; u=line(P,A,lam,Qx,Qy); P=C; type=C.add(D,&ptr); if (!type) return (ZZn6)1; lam=ptr; return u*line(P,C,lam,Sx,Sy); }
ZZn8 g(ECn& A,ECn& B,ZZn4& Qx,ZZn4& Qy) { int type; ZZn lam; big ptr; ECn P=A; // Evaluate line from A type=A.add(B,&ptr); if (!type) return (ZZn8)1; lam=ptr; return line(P,A,lam,Qx,Qy); }
ZZn4 g(ECn& A,ECn& B,ZZn2& Qx,ZZn2& Qy) { int type; ZZn lam,extra1,extra2; big ptr,ex1,ex2; ECn P=A; // Evaluate line from A type=A.add(B,&ptr,&ex1,&ex2); if (!type) return (ZZn4)1; lam=ptr; extra1=ex1; extra2=ex2; return line(P,A,B,type,lam,extra1,extra2,Qx,Qy); }
ZZn2 g(ECn& A,ECn& B,ZZn& Px,ZZn& Py) { int type; ZZn lam,extra1,extra2; ZZn2 u; ECn P=A; big ptr,ex1,ex2; type=A.add(B,&ptr,&ex1,&ex2); if (!type) return (ZZn2)1; lam=ptr; extra1=ex1; extra2=ex2; return line(P,A,B,type,lam,extra1,extra2,Px,Py); }
ZZn2 g(ECn& A,ECn& B,ZZn& a,ZZn& d) { int type; ZZn lam,extra1,extra2; ECn P=A; big ptr,ex1,ex2; // Evaluate line from A - lam is line slope type=A.add(B,&ptr,&ex1,&ex2); if (!type) return (ZZn2)1; lam=ptr; // in projective case slope = lam/A.z extra1=ex1; extra2=ex2; return line(P,A,B,type,lam,extra1,extra2,a,d); }
void g(ECn& A,ECn& B,ZZn6& Qx,ZZn6& Qy,ZZn6& num,BOOL first) { ZZn lam; ZZn6 u; big ptr; ECn P=A; // Evaluate line from A ptr=A.add(B); if (ptr==NULL) { num.clear(); return; } else lam=ptr; if (A.iszero()) return; u=line(P,A,lam,Qx,Qy); if (first) num= u; else num*=u; }
void g(ECn& A,ECn& B,ZZn2& Qx,ZZn& Qy,ZZn2& num,ZZn2& denom,int as,BOOL first) { ZZn lam,mQy; ZZn2 d,u; big ptr; ECn P=A; if (as==ADD) { // Evaluate line from A, and then evaluate vertical through destination ptr=A.add(B); if (ptr==NULL) { num=0; return; } else lam=ptr; if (A.iszero()) { u=vertical(P,Qx); d=1; } else { u=line(P,A,lam,Qx,Qy); d=vertical(A,Qx); } } else // as==SUB { // Evaluate Vertical at A, and then line from A to destination // (Note swap num and denom, Qy=-Qy, process lines "backwards") u=vertical(A,Qx); ptr=A.sub(B); if (ptr==NULL) { num=0; return; } else lam=ptr; if (A.iszero()) { d=u; } else { mQy=-Qy; d=line(P,A,lam,Qx,mQy); } } if (first) {num= u; denom= d; } else {num*=u; denom*=d; } // 6 ZZn muls }