有限体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); } } }