写在前面:

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

本文详细介绍了拓展欧几里得算法,并提供了C++和Java的实现。算法可以用于解决模线性同余方程,如求解整数x使得x*a ≡ b (MOD p),并给出了具体的步骤和代码示例。此外,还讨论了方程无解的条件及其应用。
最低0.47元/天 解锁文章
6678

被折叠的 条评论
为什么被折叠?



