一、基本概念

欧几里得算法:又名辗转相除法,计算两个整数a,b的最大公约数。

扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。

二、基本性质

gcd函数的基本性质:gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|)

贝祖定理: 即如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。

三、算法

欧几里得算法

gcd(a,b) = gcd(b,a mod b)

证明:

将a表示为 a=kb+r,则 r=a%b , r=a-kb;

假设d为a,b的一个公约数,则a%d = 0 , b%d = 0  , 又r = a - kb,所以r % d = 0;

整理下:b % d = 0 , r % d = 0( (a % b) % d = 0 )

即 d也是b和a%b的公约数,所以a和b的最大公约数也是b和a%b的最大公约数。

扩展欧几里得算法

已知:a%b=a-(a/b)*b

b*x1 + (a-(a/b)*b)*y1

= b*x1 + a*y1 – (a/b)*b*y1

= a*y1 + b*(x1 – a/b*y1) = gcd

证明:

假设 a>b,

(1)  b=0  gcd(a,b) = a ,  ax = a ,  则x=1,y=0;(这里我还是推荐不把gcd(a,0)理解成最大公约数,而是一个计算机求出来的值)

(2) 假设 ax1+by1=gcd(a,b) (方程一) bx2+(a%b)y2=gcd(b,a%b)(方程二);由欧几里得算法gcd(a,b) =gcd(b,a%b) 得到,

ax1+by1 = bx2+(a%b)y2,即ax1+by1=bx2+(a-a/b*b)y2 ax1+by1=ay2+b(x2-a/b*y2)

四、代码

欧几里得算法

C++版本一

1. 若 r 是 a ÷ b 的余数, 则

gcd(a,b) = gcd(b,r)

2. a 和其倍数之最大公因子为 a。

#include<iostream>
using namespace std;int gcd(int a,int b)
{if(b==0)return a;return gcd(b,a%b);
}int main()
{int a,b;cout<<"Please enter two integers:"<<endl;cin>>a>>b;cout<<a<<" and "<<b<<"'s gcd is:"<<endl;cout<<gcd(a,b)<<endl;
return 0;
}

C++版本二

1. a ÷ b,令r为所得余数(0≤r<b)

若 r = 0,算法结束;b 即为答案。

2. 互换:置 a←b,b←r,并返回第一步。

#include<iostream>
using namespace std;int gcd(int a,int b)
{int temp;while(b!=0){temp=b;b=a%b;a=temp;}return a;
}int main()
{int a,b;cout<<"Please enter two integers:"<<endl;cin>>a>>b;cout<<a<<" and "<<b<<"'s gcd is:"<<endl;cout<<gcd(a,b)<<endl;
return 0;
}

扩展欧几里得算法

C++版本一

#include<iostream>
using namespace std;int exgcd(int a,int b,int &x,int &y)
{if(b==0){x=1;y=0;return a;}int gcd=exgcd(b,a%b,x,y);int x2=x,y2=y;x=y2;y=x2-(a/b)*y2;return gcd;
}int main()
{
int x,y,a,b;
cout<<"请输入a和b:"<<endl;
cin>>a>>b;
cout<<"a和b的最大公约数:"<<endl;
cout<<exgcd(a,b,x,y)<<endl;
cout<<"ax+by=gcd(a,b) 的一组解是:"<<endl;
cout<<x<<" "<<y<<endl;
return 0;
}

C++版本二

#include<iostream>
using namespace std;int exgcd(int a,int b,int &x,int &y)
{int x1,y1,x0,y0;x0=1; y0=0;x1=0; y1=1;x=0; y=1;int r=a%b;int q=(a-r)/b;while(r){x=x0-q*x1; y=y0-q*y1;x0=x1; y0=y1;x1=x; y1=y;a=b; b=r; r=a%b;q=(a-r)/b;}return b;
}int main()
{
int x,y,a,b;
cout<<"请输入a和b:"<<endl;
cin>>a>>b;
cout<<"a和b的最大公约数:"<<endl;
cout<<exgcd(a,b,x,y)<<endl;
cout<<"ax+by=gcd(a,b) 的一组解是:"<<endl;
cout<<x<<" "<<y<<endl;
return 0;
}

五、例题

https://codeforces.com/contest/1152/problem/C(题解:https://blog.csdn.net/weixin_43272781/article/details/89513932)

六、参考文章

https://www.cnblogs.com/haveyoueverbeen/p/4502005.html

https://www.cnblogs.com/haveyoueverbeen/p/4612753.html

https://www.cnblogs.com/haveyoueverbeen/p/4612827.html

欧几里得算法和扩展欧几里得算法(Euclidean_Algorithm and Extended_Euclidean_Algorithm)相关推荐

  1. 欧几里得算法和扩展欧几里得算法——杨子曰数学

    欧几里得算法和扩展欧几里得算法--杨子曰数学 超链接:数学合集 不说废话,咱们直接开始 欧几里得算法 一句话: g c d ( a , b ) = g c d ( b , a m o d b ) gc ...

  2. 密码学基础算法(一)基于整数的欧几里得算法和扩展欧几里得算法

    图片来源: 随便谷歌的一个图片 图片地址: https://jason-chen-1992.weebly.com/uploads/1/0/8/5/108557741/euclidean_3_orig. ...

  3. 欧几里得算法和扩展欧几里得算法详解

    欧几里得算法: int gcd(int x,int y){if(y) return gcd(y,x%y);return x; } 扩展欧几里得算法: 先说一个整体思路: 先求Ax+By=gcd(A,B ...

  4. 欧几里得算法和扩展欧几里得算法的简单例子

    欧几里得算法: #include <cstdio> #include <cstdlib>/* * 挑战...p113 */struct point{ //格点int x;int ...

  5. 欧几里得算法和扩展欧几里得

    主要是为了密码学整理的.(这排版真是..我真的不知道怎么弄,谁能帮帮我) 欧几里得算法 欧几里得算法或者叫做辗转相除法,是指用于计算两个正整数a,b的最大公约数. gcd(a,b)=gcd(b,amo ...

  6. 欧几里得算法和拓展欧几里得算法

    一.欧几里得算法(辗转相除法): 结论:gcd(a,b)=gcd(b,a%b). 证明:假设a,b的最大公约数为r,a=k1r,b=k2r(k1>k2). 则a%b=k1r-nk2r=(k1-n ...

  7. C++ 二元一次不定方程巧妙求解——运用扩展欧几里得算法

    前言 在关于数论的学习中,求解二元一次不定方程是很重要的,在学习求解二元一次不定方程之前,要先了解欧几里得算法和扩展欧几里得算法. 关于数论的学习 欧几里得算法 欧几里得算法就是辗转相除法,欧几里得算 ...

  8. 扩展欧几里得算法求逆元c语言,关于扩展欧几里得算法和逆元

    关于扩展欧几里得算法和逆元 1.扩欧 a*x1+b*y1=gcd(a,b); b*x2+(a%b)*y2=gcd(b, (a%b))= gcd(a,b); a%b=a-(a/b)*b; 联立可得 x1 ...

  9. c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解

    欧几里德算法: 复习:求最大公约数算法(欧几里得算法.也叫辗转相除法).欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd ...

最新文章

  1. 11.PHP与MySQL
  2. php cli mysql_php – 为什么mysql CLI可以连接,但不能连接WordPress?
  3. Django笔记---数据库设计
  4. names文件和data文件_data.table让你的读取速度提升百倍
  5. Kubernetes滚动更新速率控制解读
  6. 马行走路线的测试用例设计
  7. 滴滴App突发Bug:滴滴一下,千元出发
  8. 还在担心漏测吗?快来使用jacoco统计下代码覆盖率
  9. Unity 自定义Log系统
  10. python转cython_Cython的简单使用
  11. python : sha256 、ripemd160
  12. python处理word文档
  13. linux mysql端口被占用解决方法_3306端口被占用导致MySQL无法启动
  14. 7-27 冒泡法排序 (20分) Kotlin
  15. 使用电脑热点和Fiddler对Android app进行抓包
  16. C++基础(C++Primer学习)
  17. 魂斗罗java代码素材和代码_魂斗罗素材
  18. Debian设置合上笔记本盖子不休眠
  19. 黑苹果 MAC Monterey 在睡眠后 bluetoothd 占用很高的cpu解决方案
  20. html 超链接标签 a 的基本用法

热门文章

  1. python读取ini文件编码格式_Python读取txt(.ini)文件BOM问题
  2. centos安装anaconda_每天三分钟之TensorFlow学习03:Win下安装TF2
  3. jsp当前页的变量值显示到文本框中hint_Word中常用的这9个打印技巧,你不一定全懂,非常实用...
  4. ec200s 封装_什么是无闪退免签封装?免签封装如何实现?
  5. java或异运算_JAVA 或与非运算符 与()、或(|)、异或(^)【组图】
  6. java的imshow方法_如何在循环中使用子图,imshow或图形来显示所有图像?
  7. 3维线程格 gpu_论文导读 | GPU加速子图同构算法
  8. CVPR 2021 | Facebook提出FP-NAS:搜索速度更快、分类精度更高、性能更好
  9. 直播 | 清华大学王晨阳:轻量级Top-K推荐框架及相关论文介绍
  10. GELU的两个初等函数近似是怎么来的?