您的位置:首页 > 其它

欧几里德与扩展欧几里德算法

2016-06-27 21:58 267 查看
欧几里德算法(辗转相除法) 可用于计算两个整数a,b的公约数和公倍数

定理:gcd(a, b) = gcd(b , a%b)

int gcd(int a,int b)
{
return b ? gcd(b,a%b):a;
}

最小公倍数是:  
a*b/gcd(a,b)
不过我们为了防止a*b的溢出 采取先除后乘
a/gcd(a,b)*b
扩展欧几里德算法
基本算法:对于不完全为 0 的非负整数 a,b,必然存在整数对 x,y ,使得
gcd(a,b)=ax+by

★★用类似辗转相除法,求二元一次不定方程47x+30y=1的整数解。(网上看到的推导过程  觉得很好理解)

47=30*1+17

30=17*1+13

17=13*1+4

13=4*3+1

然后把它们改写成“余数等于”的形式

17=47*1+30*(-1) //式1

13=30*1+17*(-1) //式2

4=17*1+13*(-1) //式3

1=13*1+4*(-3)

然后把它们“倒回去”

1=13*1+4*(-3) //应用式3

1=13*1+[17*1+13*(-1)]*(-3)

1=13*4+17*(-3) //应用式2

1=[30*1+17*(-1)]*4+17*(-3)

1=30*4+17*(-7) //应用式1

1=30*4+[47*1+30*(-1)]*(-7)

1=30*11+47*(-7)

得解x=-7, y=11。

具体代码如下:
int exgcd(int a,int b,int & x,int & y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
int r = exgcd(b, a%b, x, y);
int t = y;
y = x - (a/b)*y;
x = t;
return r;
}

扩展欧几里德应用:

同余方程ax≡b (mod n),如果 gcd(a,n)== 1,则方程只有唯一解。

在这种情况下,如果 b== 1,同余方程就是 ax=1 (mod n ),gcd(a,n)= 1。

这时称求出的 x 为 a 的对模 n 乘法的逆元。

对于同余方程 ax= 1(mod n ), gcd(a,n)= 1 的求解就是求解方程

ax+ ny=同余方程ax≡b (mod n),如果 gcd(a,n)== 1,则方程只有唯一解。

在这种情况下,如果 b== 1,同余方程就是 ax=1 (mod n ),gcd(a,n)= 1。

这时称求出的 x 为 a 的对模 n 乘法的逆元。

对于同余方程 ax= 1(mod n ), gcd(a,n)= 1 的求解就是求解方程

ax+ ny= 1,x, y 为整数。这个可用扩展欧几里德算法求出,原同余方程的唯一解就是用扩展欧几里德算法得出的 x 。 1,x, y 为整数。这个可用扩展欧几里德算法求出,原同余方程的唯一解就是用扩展欧几里德算法得出的 x 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: