有限体Fp上の楕円曲線上の有理点の加算を考える.
とは言っても,『楕円曲線暗号入門』を見たほうが分かりやすい.
定義1.20自体がアルゴリズムっぽく書かれているけど,それをC言語として書き起こすと以下のようになる.
ただし一箇所,y_P=-y_Qではなくx_P=x_Qかつy_P=-y_QとなったときにRを無限遠点としている.
void add(point *P,point *Q,point *R,int a,int p){
int x,y,d;
if(P->x==-1&&P->y==-1){
R->x=Q->x;
R->y=Q->y;
}else if(Q->x==-1&&Q->y==-1){
R->x=P->x;
R->y=P->y;
}else{
if(P->x==Q->x&&P->y==mod(-Q->y,p)){
R->x=-1;
R->y=-1;
}else{
int lambda;
int numerator,denominator;
if(P->x!=Q->x){
numerator=P->y-Q->y;
denominator=P->x-Q->x;
}else{
numerator=3*P->x*P->x+a;
denominator=2*P->y;
}
numerator=mod(numerator,p);
denominator=mod(denominator,p);
extgcd(p,denominator,&x,&y,&d);
lambda=mod(numerator*y,p);
R->x=mod(lambda*lambda-P->x-Q->x,p);
R->y=mod(lambda*(P->x-R->x)-P->y,p);
}
}
}