擴展的歐幾里得算法
椰汁筆記,歡迎指正。
算法原理:
C實現:
/* * 定義擴展歐幾里得數據結構 */
typedef struct{
int d; //最大公因數
int y; //b乘法逆元
int x; //a乘法逆元
} Euclid;
/* * 整數求逆 */
Euclid *get_gcd_inverse(int a, int b)
{
int x, y, d, x1, x2, y1, y2, q, r;
Euclid *e = (Euclid *)malloc(sizeof(Euclid)); i
f (b == 0)
{
d = a;
x = 1;
y = 0;
e->d = d;
e->y = y;
e->x = x;
return e;
}
x2 = y1 = 1;
x1 = y2 = 0;
while (b > 0)
{
q = a / b;
r = a - q * b;
x = x2 - q * x1;
y = y2 - q * y1;
a = b;
b = r;
x2 = x1;
x1 = x;
y2 = y1;
y1 = y;
d = a;
x = x;
y = y2;
}
d = a;
x = x2;
y = y2;
e->d = d;
e->y = y;
e->x = x;
return e;
}
利用結構體實現返回數據更加方便。