擴展Stein算法一般用來計算兩個數字的最大公約數,其算法思想如下:
用Stein算最大公約數的算法在網上有很多,就不列出了。
現給出擴展Stein算法來求乘法逆元的方法:
算法流程圖如下:(求B在模A上的逆)
C語言代碼如下:
//交換算法
void swap(int *a, int *b) {
*a ^= *b; //a=a^b
*b ^= *a; //b=b^(a^b)=b^a^b=b^b^a=0^a=a
*a ^= *b; //a=(a^b)^a=a^b^a=a^a^b=0^b=b
}
//計算的是B在模A上的逆 B^(-1)modA
int mod_reverse_Stein(int b, int a)
{
int A = a;
int B = b;
int x = 1;
int y = 0;
int x1 = 0;
int y1 = 1;
if (b == 0) {
return -1;
}
while (1) {
if (a % 2 == 0) {
if (y % 2 == 0) {
}
else {
if (y < 0) {
x -= B;
y += A;
}
else {
x += B;
y -= A;
}
}
a /= 2;
x /= 2;
y /= 2;
}
else {
if (a == 1) {
return (y + A) % A;
}
else {
if (a - b > 0) {
}
else {
swap(&a, &b);
swap(&x, &x1);
swap(&y, &y1);
}
a -= b;
x -= x1;
y -= y1;
}
}
}
return -1;
}