拡張Euclideanアルゴリズム
1. Euclidean Algorithm
これは
int gcd(int a, int b) {
while (b > 0){
int tmp = a;
a = b;
b = tmp % b;
}
return a;
}
2. Extended Euclidean Algorithm
=d=
ax + by
形式であり、以下のようにすることができる.d0 = a =
ax0 +by0
← x0=1, y0=0d1 = b =
ax1 + by1
← x1=0, y1=1d2 = d0 -(d0/d1)*d1 =
ax2 + by2
d3 =d1 -(d1/d2)d2 = ax3 +by3
...If dk+1 = 0, then gcd(a,b) =
dk = axk + byk
このときaとbは、1 = axk + byk
である.両側のモジュールbは
1 = axk mod b
a^-1 mod b = xk
に等しい.int mul_inv(int a, int m) {
int d0 = a, d1 = m;
int x0 = 1, x1 = 0;
while (d1){
int q = d0 / d1;
int tmp;
tmp = d0;
d0 = d1;
d1 = tmp - q * d1;
tmp = x0;
x0 = x1;
x1 = tmp - q * x1;
}
if (d0 == 1)
return (x0 > 0 ? x0 : x0 + m);
else
return 0;
}
Reference
この問題について(拡張Euclideanアルゴリズム), 我々は、より多くの情報をここで見つけました https://velog.io/@danbibibi/Extended-Euclidean-Algorithm-확장-유클리드-알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol