裴蜀等式与扩展欧几里得算法

裴蜀等式

对于任何整数 a a a b b b和它们的最大公约数 d d d,关于未知数 x x x y y y的线性丢番图方程称为裴蜀等式

a x + b y = m ax+by=m ax+by=m有整数解时当且仅当 m m m d d d的倍数

裴蜀等式有解时必然有无穷多个整数解,每组解 x x x y y y都成为裴蜀数, x x x y y y可用扩展欧几里得算法 ( E x t e n d e d E u c l i d e a n a l g o r i t h m ) (Extended\ Euclidean\ algorithm) (Extended Euclidean algorithm)求得

特别地, a x + b y = 1 ax+by=1 ax+by=1有整数解,当且仅当 a a a b b b互素

拓展欧几里得算法

欧几里得算法地终止状态是 a = g c d , b = 0 a=gcd,b=0 a=gcd,b=0,那么此时方程 a x + b y = g c d ax+by=gcd ax+by=gcd的解 x = 1 , y x=1,y x=1,y为任意数

当然,上面说的是最终状态,但是我们能否从最终状态反推初始状态?

假设当前要求的是 a a a b b b的最大公约数,并求出 x x x y y y,使得 a x + b y = g c d ⋅ ⋅ ⋅ ⋅ ( F o r m u l a 1 ) ax+by=gcd····(Formula\ 1) ax+by=gcd(Formula 1)

而我们已经求出了下一状态 b b b a % b a\%b a%b的最大公约数,并且也求出了一组解 x 1 x_1 x1 y 1 y_1 y1,使得 b × x 1 + ( a % b ) × y 1 = g c d b\times x_1 + (a\%b)\times y_1 = gcd b×x1+(a%b)×y1=gcd

那么这两个状态之间是否存在某种关系呢?

我们知道 a % b = a − ( a / b ) × b a\%b = a - (a/b)\times b a%b=a(a/b)×b(这里的/指的是整除),那么可以进一步得到:
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{split} …

对比 F o r m u l a 1 Formula\ 1 Formula 1 F o r m u l a 2 Formula\ 2 Formula 2,我们发现一个递推式
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{split} …
其中, x x x y y y分别是递归时第 i i i a x + b y = g c d ax+by=gcd ax+by=gcd的一组解, x 1 x_1 x1 y 1 y_1 y1分别是递归时第 i + 1 i+1 i+1 a x 1 + b y 1 = g c d ax_1+by_1=gcd ax1+by1=gcd的一组解

我们上面推到的其实都是 a x + b y = d ax+by=d ax+by=d的解, d = g c d ( a , b ) d=gcd(a,b) d=gcd(a,b),对于一般的情况 m m m d d d的倍数,则有 a x + b y = m ax+by=m ax+by=m的解为 x × m d x \times \frac{m}{d} x×dm y × m d y \times \frac{m}{d} y×dm

public class exgcd {static long x, y;static long exgcd(long a, long b) {if (b == 0) {x = 1;y = 0;return a;}long res = exgcd(b, a % b);long x1 = x;x = y;y = x1 - (a / b) * y;return res;}/** 线性方程 ax + by = m 当m为gcd(a,b)的倍数时有整数解*/static long linearEquation(long a, long b, long m) throws Exception {long d = exgcd(a, b);if (m % d != 0)throw new Exception("无解");long n = m / d;x *= n;y *= n;return d;}public static void main(String[] args) {try {linearEquation(2, 7, 1);System.out.println(x + " " + y);} catch (Exception e) {System.out.println("无解");}}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部