擴展Stein算法計算乘法逆元(C語言版)

擴展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;
}

 

發佈了45 篇原創文章 · 獲贊 6 · 訪問量 8191
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章