扩展的欧几里得算法的应用

扩展欧几里德算法的应用

(1)求解不定方程

用扩展欧几里得算法解不定方程ax+by=c;

这个应该比较好理解了,两个可以同乘以k

1 bool linear_equation(int a,int b,int c,int &x,int &y)
2 {
3     int d=exgcd(a,b,x,y);
4     if(c%d)
5         return false;
6     int k=c/d;
7     x*=k; y*=k;    //求得的只是其中一组解
8     return true;
9 }

(2)求解模线性方程(线性同余方程

同余方程 ax≡b (mod n) (也就是 ax % n = b) 对于未知数 x 有解,当且仅当 gcd(a,n) | b (也就是 b % (gcd(a,n))==0 )。且方程有解时,方程有 gcd(a,n) 个解。

求解方程 ax≡b (mod n) 相当于求解方程 ax+ ny= b, (x, y为整数)

1 在方程  3x ≡ 2 (mod 6) 中, d = gcd(3,6) = 3 ,3 不整除 2,因此方程无解。
2  
3 在方程 5x ≡ 2 (mod 6) 中, d = gcd(5,6) = 1,1 整除 2,因此方程在{0,1,2,3,4,5} 中恰有一个解: x=4。

证明略去,直接说算法:

首先看一个简单的例子:

5x=4(mod3)

解得x = 2,5,8,11,14…….

由此可以发现一个规律,就是解的间隔是3.

那么这个解的间隔是怎么决定的呢?

如果可以设法找到第一个解,并且求出解之间的间隔,那么就可以求出模的线性方程的解集了.

我们设解之间的间隔为dx.

那么有

a*x = b(mod n);

a*(x+dx) = b(mod n);

两式相减,得到:

a*dx(mod n)= 0;

也就是说a*dx就是a的倍数,同时也是n的倍数,即a*dx是a 和 n的公倍数.为了求出dx,我们应该求出a 和 n的最小公倍数,此时对应的dx是最小的.

设a 和 n的最大公约数为d,那么a 和 n 的最小公倍数为(a*n)/d.

即a*dx = a*n/d;

所以dx = n/d. (d = gcd(a,n) )

因此解之间的间隔就求出来了.

01 bool modular_linear_equation(int a,int b,int n)
02 {
03     int x,y,x0,i;
04     int d=exgcd(a,n,x,y);
05     if(b%d)
06         return false;
07     x0=x*(b/d)%n;   //特解
08     for(i=1;i<d;i++)
09         printf("%d\n",(x0+i*(n/d))%n);
10     return true;
11 }

 (3)求解模的逆元;

同余方程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 。

练习题

青蛙的约会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值