博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扩展欧几里得
阅读量:2048 次
发布时间:2019-04-28

本文共 1322 字,大约阅读时间需要 4 分钟。

是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = (a, b) =d(解一定存在,根据中的相关定理)。

扩展欧几里德常用在求解模及方程组中。

 

首先,证明一下gcd(a,b)==gcd(b,a%b)

设gcd(a,b) = k

a = n1 * k
b = n2 * k
a%b = (n1%n2)*k
b = n2 * k
现在只需证n2 和 n1%n2 没有公因子
假设有公因子,为r
n2 = num2 * r
n1%n2 = num1 * r
n1 = k*n2 + num1*r
n1 = (k*num2+num1)*r
n1和n2有公因子,这与设gcd(a,b) = k矛盾,因为如果n1和n2有公因子,那么gcd(a,b)=k*r
所以gcd(b,a%b) = gcd (a,b)

()

由上面的等式,我们可得:

∵gcd(a,b)==gcd(b,a%b)

∴a*x1+b*y1==b*x2+(a%b)*y2            //一定有整数解x,y

∵在计算机科学里a%b的实际运算是 a-(a/b)*b        //a/b因为都是整形变量,所以计算时a/b==⌊a/b⌋

∴a*x1+b*y1==b*x2+(a-(a/b)*b)*y2

整理可得a*x1+b*y1==a*y2+b*(x2-(a/b)*y2)

x1=y2,y1=x2-(a/b)*y2

显然,我们只要找到递归边界,就可以不断求解,直到得出答案

辗转相除法:

int gcd(int a,int b)

{

return b==0?a:gcd(b,a%b);

}

也就是说边界是 a*x+b*y==gcd(a,b)==a  //因为此时b==0

那么现在x是不是就是1,y可以取任意整数

 

以下为最简c++语言写法:

void gcd(int a,int b,int &x,int &y)

{
  if (b==0){x=1,y=0;return;}
  gcd(b,a%b,y,x);          //注意x,y的位置
  y-=a/b*x;
}

 

这里的引用解决了x1=y2,所以仅剩y1=x2-(a/b)*y2;

又是因为引用,y1=x2,x1=y2;

所以y1=y1-(a/b)*x1;

不得不说,能首先写出这个的大佬,的确思维逻辑很好!!!

 

 

当然,不用引用的话,返回一个结构体也行(貌似会更好理解)

struct ans

{
  int x,y;
};
ans gcd(int a,int b)
{
  ans myans,t;
  if(b==0){myans.x=1,myans.y=0;return myans;}
  t=gcd(b,a%b);
  myans.x=t.y;
  myans.y=t.x-a/b*t.y;
  return myans;
}

 

可以试一下改变递归边界中的y的值,会有惊喜;

 

我们得出了一组解  x,y

显然a*x0+b*y0==a*x+b*y  //x0,y0为已得解,x,y为其他答案

x=x0+k*b,y=y0-k*a    //k为整数,其实你将x,y带入原式,就会发现显然成立

 

转载地址:http://lqhof.baihongyu.com/

你可能感兴趣的文章
Sophus的编译与使用
查看>>
Python中切片的用法
查看>>
安装OpenCV时提示缺少boostdesc_bgm.i文件的问题解决方案(附带百度云资源)
查看>>
最简单的 kubernetes 高可用安装方式
查看>>
Contour 学习笔记(一):使用 Contour 接管 Kubernetes 的南北流量
查看>>
K8s 学习者绝对不能错过的最全知识图谱(内含 58个知识点链接)
查看>>
Contour 学习笔记(一):使用 Contour 接管 Kubernetes 的南北流量
查看>>
Contour 学习笔记(二):使用级联功能实现蓝绿部署和金丝雀发布
查看>>
Kubectl 的替代品:kubeman
查看>>
以后别人再问你什么是 Istio,就把这篇文章甩给他
查看>>
新书推荐 |《Prometheus监控实战》
查看>>
Tekton Pipeline 教程
查看>>
Istio 1.3 发布,HTTP 遥测不再需要 Mixer
查看>>
Kubernetes Dashboard 终结者:KubeSphere
查看>>
AdGuard Home 安装使用教程
查看>>
Porter:面向裸金属环境的 Kubernetes 开源负载均衡器
查看>>
Kubernetes Dashboard 终结者:KubeSphere
查看>>
手把手教你部署 Istio 1.3
查看>>
CentOS 8 都发布了,你还不会用 nftables?
查看>>
一点也不流氓的搜狗输入法皮肤
查看>>