写在前面:
这篇博客是我在[◹]对 算术基本定理 的研究 中的一部分
by pixelkitties
- 拓展欧几里得算法的多解
拓展欧几里德算法是用来在已知a,b的情况下求解一组p,q,使它们满足[◹]Bézout恒等式: pa+qb = gcd(a, b) ==d ——bia度百科 |
求解得到的是一组p,q,是任意的一组p,q吗?
p,q肯定不止一对,那么如何获得多对p,q呢?
是否为随意的一组解先存疑
但能肯定的是,得到的不一定是最小整数解
如wikipedia上的例子:
想要求得多解也很容易:
设gcd(a,b) == d
∵p*a + q*b == d
∴p*a + q*b + n*a*(b/d) - n*(a/d)*b == d
∴(p + n*(b/d) )*a + (q - n*(a/d) )*b == d
注意,n不为0时,上下红色部分不相等
注意,此处除去gcd(a,b)是为了得到所有解
即任意一组解满足:
(p+n*(b/d) ),(q-n*(a/d) )
(d == gcd(a,b) )
显然,对于任意的n∈Z都成立
利用这个性质就能求出所有解了!
此处p,q为利用拓展欧几里得算法得到的一组p,q
那么如何求得p或q的最小整数解呢?
其实同理:
p*a + q*b == gcd(a, b)
(p' + n*b)*a + (q' - n*a)*b == gcd(a, b)
则p%b,q%a就好了
注意,n不为0时,上下红色部分不相等
还有以下情况:
希望在MOD gcd(a,b)的意义下,希望得到最小的一组非负整数解
即求得最小的p,q∈Z*,使得p*a + q*b ≡ 0 (MOD gcd(a,b) )
但是p或q有可能为负数啊?
((p%b)+b)%b,((q%a)+a)%a
这样就能保证是正整数了!