扩展欧几里得算法java_拓展欧几里得算法

本文详细介绍了拓展欧几里得算法,并提供了C++和Java的实现。算法可以用于解决模线性同余方程,如求解整数x使得x*a ≡ b (MOD p),并给出了具体的步骤和代码示例。此外,还讨论了方程无解的条件及其应用。
摘要由CSDN通过智能技术生成

写在前面:

bc8af130ead1122a4bbc1b2b4513de3c.png

by celebi-yoshi

结论

拓展欧几里得算法能解决的问题有:

① 已知正整数a,b,求一组p,q使满足p*a+q*b ≡ 0 (MOD GCD(a,b))

② 已知正整数a,b,素数p,求一个整数x使满足x*a ≡ b (MOD p)

③已知正整数a,b,素数p,求一个整数x使满足ax ≡ b (MOD p)

④已知正整数a,b,c,求一个整数x使满足x*a ≡ b (MOD c)

⑤已知正整数a,b,c,求一个整数x使满足ax ≡ b (MOD c)

⑥ 解线性方程组

证明

已知正整数a,b,求一组p,q使满足p*a+q*b ≡ 0 (MOD GCD(a,b))

现在已经有了a-b == GCD(a,b) * (n1-n2),那就可以再来个直接点的

GCD(a,b) + (p*n1+q*n2) == GCD(a,b)

即p*a+q*b == GCD(a,b)

想要求出一组p,q∈Z,满足上式

首先套用欧几里得算法的逻辑:

结合算术基本定理,有

GCD(a,b) == P1min(a1,b1)P2min(a2,b2)......Pnmin(an,bn)

a MOD b == P1a1-b1P2a2-b2......Pnan-bn(执行的条件为ai>=bi)

则能得到GCD(a,b) == GCD(b,a MOD b)

那么就有p*a+q*b == GCD(a,b) == GCD(b,a MOD b)

这样就可以写一个递归函数,一层一层MOD下去

这样化简,直到ai MOD bi == 0

即p*GCD(a,b) == GCD(a,b),那么在最后一层里面p==1

所以在拓展欧几里得里面,bi==0这一层中,ai即为GCD(a,b)

(到此为止和欧几里得算法一模一样,我甚至是复制的欧几里得算法)

而如果想要求出p和q,那么有一个回溯的过程就好了

如何回溯得到p和q呢?

来找一下相邻的层数间pi和pi+1,qi和qi+1的关系

因为有p*a+q*b == GCD(a,b)

则在每一层中:

GCD(a,b)

== pi*a+qi*b

== pi+1*b + qi+1*(a MOD b)

== pi+1*b + qi+1*(a - (a/b)*b)

== pi+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值