本文主要是介绍裴蜀定理扩展欧几里得算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
裴蜀定理
也就是Bezout定理,对于任意整数a,b,存在一对整数x,y,满足 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)。
在数论中,裴蜀定理是一个关于最大公约数(或最大公约式)的定理,裴蜀定理得名于法国数学家艾蒂安·裴蜀。
裴蜀定理说明了对任何整数 a、b和它们的最大公约数 d ,关于未知数 x 和 y 的线性丢番图方程(称为裴蜀等式)。
证明:
- 若b=0时,此时迭代到算法的最后一步,显然存在一对整数, x = 1 , y = 0 x=1,y=0 x=1,y=0,使得 a ∗ 1 + 0 ∗ 0 = g c d ( a , 0 ) a*1+0*0 = gcd(a,0) a∗1+0∗0=gcd(a,0)
- 若b>0时,则 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b) = gcd(b,a\,mod\,b) gcd(a,b)=gcd(b,amodb),假设存在一对整数 x 1 , y 1 x_1,y_1 x1,y1,满足 b ∗ x 1 + ( a m o d b ) ∗ y 1 = g c d ( b , a m o d b ) b*x_1+(a\,mod\,b)*y_1 = gcd(b,a\,mod\,b) b∗x1+(amodb)∗y1=gcd(b,amodb),因为 b ∗ x 1 + ( a m o d b ) ∗ y 1 = b ∗ x 1 + ( a − a / b ∗ b ) y 1 = a ∗ y 1 + b ∗ ( x 1 − ( a / b ) ∗ y 1 ) b*x_1+(a\,mod\,b)*y_1 = b*x_1+(a-a/b*b)y_1 = a*y_1 +b*(x_1-(a/b)*y_1) b∗x1+(amodb)∗y1=b∗x1+(a−a/b∗b)y1=a∗y1+b∗(x1−(a/b)∗y1)
- 证毕
裴蜀定理是按照欧几里得算法的思路被证明的,并且同时给出了整数x和y的计算方法。这种计算方法被称为扩展欧几里得算法。
联立一下
{ g c d = a ∗ x + b ∗ y g c d = a ∗ y 1 + b ∗ ( x 1 − ( a / b ) ∗ y 1 ) \begin{cases} gcd=a*x+b*y \\ gcd = a*y_1 + b*(x_1-(a/b)*y_1) \end{cases} {gcd=a∗x+b∗ygcd=a∗y1+b∗(x1−(a/b)∗y1)
可以得出
{ x = y 1 y = x 1 − ( a / b ) ∗ y 1 \begin{cases} x=y_1 \\ y = x_1-(a/b)*y_1 \end{cases} {x=y1y=x1−(a/b)∗y1
实现
int exgcd(int a,int b,int &x,int &y){if(b==0){x = 1,y = 0;return a;}int ans = exgcd(b,a%b,x,y);int z = y;y = x - (a/b)*z,x = z;return ans;
}
说明
上述程序求出的是一组特解 x 0 , y 0 x_0,y_0 x0,y0,并返回a,b的最大公约数d。
未完,待续…
这篇关于裴蜀定理扩展欧几里得算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!