有限体Fp上での除算を拡張Euclid互除法を用いて高速化する.
有限体Fpでa÷bしたい
↓
px+by=1となるx,yが求まる.(p,bは互いに素なので,拡張Euclidの互除法を適用可)
↓
by=1となる.(有限体Fp上では,pxは0となる)
↓
b^-1=yとなる.
↓
a÷b=a*(b^-1)=a*yとなる.
↓
除算が乗算になってうれしい.
ソースコードは以下のようになる.
#include <stdio.h> void extgcd(int a,int b,int* x,int* y,int* d){ int u,v,q,t; *x=1; *y=0; u=0; v=1; while(b>0){ q=a/b; t=u;u=*x-q*u;*x=t; t=v;v=*y-q*v;*y=t; t=b;b=a-q*b;a=t; } *d=a; } int main(){ int a,b,p; int x,y,d; printf("a:");scanf("%d",&a); printf("b:");scanf("%d",&b); printf("p:");scanf("%d",&p); extgcd(p,b,&x,&y,&d); printf("%d/%d=%d\n",a,b,(a*y)%p); return 0; }