C言語で楕円曲線の勉強(4.加法公式)

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

 
Githubのソースコード