Eculid算法 以及Extend_Eculid算法 证明及实现
2024-08-31 17:49:43
Eculid算法 欧几里得算法
证明:
设两数a,b(a<b).
- 令c=gcd(a,b) . 则 设a=mc, b=nc 。
- 所以 r= r =a-kb=mc-knc=(m-kn)c 。
- 所以 c也是r的因数 。
- 可以断定 m-kn 与 n 互质 。【假设m-kn=xd,n=yd (d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)cd,b=nc=ycd,则a与b的一个公约数cd>c,故c非a与b的最大公约数,与前面结论矛盾】,因此,c也是b与r的最大公约数。
- 得证。
代码实现:
int gcd (int a, int b)
{
return b == ? a : gcd(b, a%b);
}
Extend_Eculid 拓展欧几里得算法
证明:
设a>b
当b=0时,a∗1+b∗0=a=gcd(a,b),此时x=1,y=0
当b!=0时,设
a∗x1+b∗y1=gcd(a,b)
b∗x2+a%b∗y2=gcd(b,a%b)
由于gcd(a,b)=gcd(b,a%b),所以有a∗x1+b∗y1=b∗x2+a%b∗y2
将a%b=a−(a/b)∗b代入,
得到 a∗x1+b∗y1=a∗y2+b∗x2−(a/b)∗b∗y2
即 x1=y2,y1=x2−(a/b)∗y2
因此可以递归的定义exgcd,同样b=0时递归结束。返回最大公约数
代码实现:
void ext_gcd(int a, int b, int &d, int &x, int &y)
{
if(!b)
{
d = a;
x = ;
y = ;
}
else
{
ext_gcd(b, a%b, d, y, x);
y -= x*(a/b);
}
}
最新文章
- JavaWeb-springMVC
- 【转】Linux下如何清除系统日志
- xfire框架内部基本结构解析
- Bootstrap 我的学习记录2 栅格系统初识
- 比较StringBuffer字符串内容是否相等?
- python 练习 13
- 《Linear Algebra and Its Applications》-chaper6-正交性和最小二乘法- 格拉姆-施密特方法
- Android 自定义View (一)
- mockito学习笔记
- Web Server PROPFIND Method internal IP Discosure
- 跨平台的C++应用和UI开发库 QT
- NYOJ-914 Youth的最大化(贪心)
- 黄文俊:Serverless小程序后端技术分享
- Netty源码—四、事件处理
- 让pip使用python3而不是python2
- C++: 模板函数定义与声明分离;
- 页面滚动到指定class样式位置
- I/O复用之select
- 经典矩阵快速幂之一-----poj3233(矩阵套矩阵
- i=i+1,i+=1,i++哪个执行效率最高?为什么?