浅谈欧几里得算法求最大公约数(GCD)的原理及简单应用鲸小鱼

欧几里得算法又称辗转相除法,用于求两数的最大公约数,计算公式为GCD(a,b)=GCD(b,a%b);

设x为两整数a,b(a>=b)的最大公约数,那么x|a,x|b;

①由整数除法具有传递性(若x能整除a,x能整除b,那么x可整除a,b的任意线性组合)知x|a-b;

②设x不是b的因子,则x不是b和a-b的公因子;设x不是a的因子,则x不是b和a-b的公因子;所以可以得出GCD(a,b)=GCD(b,a-b);

③由a>=b知,a可表示为a=b*q+r;则a减去q个b剩下的数字即为r,所以GCD(a,b)=GCD(b,a%b);

intgcd(inta,intb){returnbgcd(b,a%b):a;}(2)迭代形式:intgcd(inta,intb){for(;;){if(b==0)returna;inttemp=a%b;a=b;b=temp;}}4.几个性质:(1)若GCD(a,b)=1,那么a,b两数互质。

(2)GCD(a,2a)=a;

(3)GCD(a,0)=a;

(4)GCD(a,b)=GCD(-a,b)=GCD(a,-b)=GCD(-a,-b);

(5)LCM(a,b)GCD(a,b)=ab(LCM为两数小公倍数);

(6)GCD(n,n+1)=1;

假设他们不是互素的,有公共因子q

n=p1*1,n+1=p2*q;n+1-n=q(p2-p1)

则q(p2-p1)=1;其中p2,p1均为整数,q>=2,可证不等。得证。

老师想要挑出默契程度最大的k个人参与毕业晚会彩排。可是如何挑呢?老师列出全班同学的号数1,2,……,n,并且相信k个人的默契程度便是他们的最大公约数(这不是迷信哦~)。这可难为了他,请你帮帮忙吧!PS:一个数的最大公约数即本身。

输入格式:两个空格分开的正整数n和k。(n>=k>=1)

输出格式:一个整数,为最大的默契值。

1.注意:“一个数的最大公约数即本身”:我们可以从性质(2)考虑:当两个数是倍数时,最大公约数即为较小的数,那么此时相对同一范围的其他组合这两个数的最大公约数相对较大。

2.在讨论几种特殊情况:k=1时,ans=n;k=2时,若n为偶数,则ans=n/2,若n为奇数,则ans=(n-1)/2;

3.有上述讨论我们发现:满足k*a

#includeusingnamespacestd;intmain(){inta,b;cin>>a>>b;cout<

输入格式:第一行为n,表示有n(n≤100,000)组数据,每组数据的第一行为两个正整数ax和ay,表示猎人的位置,第二行为两个正整数bx和by,表示兔八哥的位置(1≤ax,ay,bx,by≤100,000,000)。

输出格式:共有n行,每行为“yes”或“no”表示兔八哥的位置是否安全。

1.读题后我们可以将题目化简:求两坐标为整数的点确定的直线上两点间是否还存在另一坐标均为整数的点;

2.那么我们可以以猎人的坐标为原点,建立坐标系,设猎人(x1,y1),兔子(x2,y2),那么我们把兔子的坐标改为(x2-x1,y2-y1);

3.那么如何确定该点与原点间没有其他坐标为整数的点呢?通过画图我们可以发现,只要该点坐标互质即能满足要求,由性质(1)知等价于GCD(x,y)=1;

4.由性质(4)我们知道,两数的符号号并不影响它们的最大公约数所以对坐标取绝对值再计算;

5.注意本题有多组数据;

#include#include#include#includeusingnamespacestd;intgcd(inta,intb){returnbgcd(b,a%b):a;}//GCD;intmain(){intn,x1,x2,y1,y2,i,j,k;scanf("%d",&n);for(i=1;i<=n;++i){scanf("%d%d%d%d",&x1,&y1,&x2,&y2);if(x1==x2&&y1==y2){//特判,两者坐标重合时,GCD=0,而兔子有危险;printf("no\n");continue;}x2=abs(x2-x1);y2=abs(y2-y1);if(gcd(x2,y2)==1)printf("no\n");elseprintf("yes\n");}return0;}3.[洛谷P2651]添加括号IIIDescription现在给出一个表达式,形如a1/a2/a3/.../an;如果直接计算,就是一个个除过去,比如1/2/1/4=1/8。然而小A看到一个分数感觉很不舒服,希望通过添加一些括号使其变成一个整数。一种可行的办法是(1/2)/(1/4)=2。现在给出这个表达式,求问是否可以通过添加一些括号改变运算顺序使其成为一个整数。

输入格式:一个测试点中会有多个表达式。第一行t,表示表达式数量。对于每个表达式,第一行是n,第二行n个数,第i个数表示ai。

输出格式:输出t行。对于每个表达式,如果可以通过添加括号改变顺序使其变成整数,那么输出“Yes”,否则输出“No”

1.我们可以发现,为了使其结果尽可能为整数,我们应使分母最大,分子最小;

2.那么我们发现,a2无论如何都是在分母上的,那么我们这样添加括号即可:a1/(a2/a3/.../an)=a1a3...*an/a2,此时满足分母最大,分子最小;

3.那么我们需要进行约分:对每一个分子都和分母求一次GCD,每次求后令分母除以GCD,到最后一项时若分母=1,则结果为整数;

THE END
1.欧几里得小传与《几何原本》英国著名的物理学家和数学家牛顿(Isaac Newton,1643年~1727年)也曾如此评价《几何原本》:“能够从如此少的原理中取得如此多的成就,这是几何学的荣耀。” 当然,欧几里得在《几何原本》开篇的定义中不少都是语意模糊,有着各种逻辑上的缺陷,其中的命题证明也存在一些遗漏和错误https://mp.weixin.qq.com/s?__biz=MzAxNzg3MTE3Ng==&mid=2247516658&idx=1&sn=1f2096724c1f151901d7f698c2fbce51&chksm=9a858cf935bbe468ef32b17cea529ef732e08e73a1eacdc8c6e06ff41ed531e489fd71af709a&scene=27
2.急欧几里得算法是什么原理啊?我知道怎么算的,不过谁来告诉我急 欧几里得算法是什么原理啊?我知道怎么算的,不过谁来告诉我为什么可以这样算,那样记着公式没用我想弄清为什么!我要问为什么这么推可以推出最大公约数!https://www.zybang.com/question/e651ba879662c4335c6f96fba8f7de51.html
3.python欧几里得算法求逆元mob649e815ecee0的技术博客欧几里得算法是一种用来计算两个整数的最大公约数的方法,也被称为辗转相除法。在数论中,求逆元是一个非常重要的概念,它可以帮助我们解决很多关于模运算的问题。本文将介绍欧几里得算法的原理以及如何使用Python来实现求逆元的方法。 欧几里得算法原理 欧几里得算法基于以下定理:对于两个整数a和b,它们的最大公约数等于ahttps://blog.51cto.com/u_16175477/10704995
4.密码学基础1:RSA算法原理全面解析网上写 RSA 算法原理的文章不少,但是基本上要么忽略了数学原理的说明,要么缺少实际的可运行的例子,为此特写了此文,将 RSA 需要用到的数学概念和定理都总结了一番,并基于算法原理使用 python 实现了 RSA 密钥生成和加解密的demo,希望对大家深入了解 RSA 算法有所帮助。本文第 1 节为 RSA 相关的数论基础,第 2https://www.jianshu.com/p/6aa7b59be872
5.探秘欧几里得算法的奥秘欧里几得算法,又称辗转相除法,是一种用于计算两个正整数最大公约数的古老而有效的算法。这一算法的历史可以追溯到古希腊数学家欧几里得,被记载在其著作《几何原本》中。欧里几得算法的基本原理是通过连续进行除法,直到余数为零,此时的除数即为两数的最大公约数。这个算法简单且直观,但其背后的数学原理却深刻而有https://localsite.baidu.com/article-detail.html?articleId=23744227&ucid=PjbzPHbvrj6&categoryLv1=%E6%95%99%E8%82%B2%E5%9F%B9%E8%AE%AD&ch=54&srcid=10004
6.欧几里德算法Theorem 1.3.2 (The Euclidean Algorithm) 假设 a,b 且 a > b. 由除法原理我们知存在 h0,r0 使得 欧几里得算法a = bh0 + r0,其中 r0 < b. 若r0 > 0,则存在 h1,r1 使得 b = r0h1 + r1,其中 0r1 < r0. 若r1 > 0,则存在 h2,r2 使得 https://baike.sogou.com/v294857.htm
7.多元思维模型5.1奥卡姆剃刀原理奥卡姆剃刀原理是 “如无必要,勿增实体”(Entities should not be multiplied unnecessarily)。即切勿浪费较多东西,去做用较少的东西,同样可以做好的事情。 拉丁文原文如下: Numquam ponenda est pluralitas sine necessitate.(避重趋轻) Pluralitas non est ponenda sine necessitate.(避繁逐简) https://zhuanlan.zhihu.com/p/430460297
8.欧几里得原理及扩展欧几里得原理(EuclideanTheoryandExtendedEuclid本文详细介绍了欧几里得原理,用于求解两正整数的最大公约数,以及扩展欧几里得原理在求解二元一次不定方程整数解的应用。通过递归实现的欧几里得原理,结合算法代码展示,阐述了如何从简单不定方程到一般不定方程的解法。 摘要由CSDN通过智能技术生成 题记:这是我第四次复习扩展欧几里得原理,因为不常用到,想要使用的时候又想https://blog.csdn.net/rising_fallmoon/article/details/10724239
9.欧几里得算法.pptx欧几里得算法数学算法 01算法简介算法原理算法版本计算证明程序设计目基本信息欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。欧几里得算法和扩展欧几里得算法可使用多种编程语言实现。 算法简介 算法简介欧几里得算法是https://max.book118.com/html/2023/0622/5204004141010232.shtm
10.RSA算法原理(二)这个方程可以用"扩展欧几里得算法"求解,此处省略具体过程。总之,爱丽丝算出一组整数解为 (x,y)=(2753,-15),即 d=2753。 至此所有计算完成。 第六步,将n和e封装成公钥,n和d封装成私钥。 在爱丽丝的例子中,n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)。 https://xxzx.cusx.edu.cn/info/1038/1854.htm
11.python辗转相除法求最大公约数和最小公倍数的实现python这篇文章主要介绍了python辗转相除法求最大公约数和最小公倍数的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 + 目录 辗转相除法求最大公约数和最小公倍数 辗转相除法数学原理 辗转相除法也称欧几里得算法,是用来求两个正整数的最大公约数的算法。接下来我们用实例来https://www.jb51.net/article/255650.htm
12.裴蜀定理扩展欧几里得算法及其证明腾讯云开发者社区裴蜀定理、扩展欧几里得算法及其证明 定理 裴蜀定理(贝祖定理)是一个关于最大公约数的定理。 裴蜀定理说明了对任何整数a,b和它们的最大公约数d,关于未知数x和y的线性不定方程:若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别的,一定存在整数x,y使ax+by=d成立。https://cloud.tencent.com/developer/article/2088866
13.GitHubfindneo/RSA欧几里得算法是求最大公约数的算法, 也就是中学学的辗转相除法。记gcd(a,b)为a和b的最大公约数,欧几里得算法的基本原理是gcd(a,b)==gcd(b,a%b),(b!=0)和gcd(a,0)==a。 Python实现如下: # 递归版defgcd(a,b):returnaifnotbelsegcd(b,a%b)# 迭代版defgcd2(a,b):whileb:a,b=b,a%bretuhttps://github.com/findneo/RSA-ATTACK