扩展欧几里得算法
扩展欧几里得算法
欧几里得算法#
分析#
首先,既然有扩展欧几里得算法,那欧几里得算法是什么?
答案是在log时间内,求两个数的最大公约数实际上我感觉欧几里得算法和辗转相除法是一样的。(就是一样的)
令两个数为 a , b ( a > b ).则 gcd(a,b)=gcd(b , a%b)=gcd(a%b , b%(a%b) )。通过不断地计算,我们最终就可以计算出 gcd(a,b).
代码实现#
int gcd(int a,int b){
if(b==0) return a;
else return gcd(b,a%b);
}
扩展欧几里得算法#
分析#
根据裴蜀定理中的总有一对x,y,使ax+by=gcd(a,b);
再根据gcd(a,b)=gcd(b , a%b),可以得出bx’+(a%b)y’=gcd(b , a%b).那么这是不是就跟辗转相除法一样,通过递归最后得出答案。那么接下来的目标很明确:找出 x 与x’或y’ 和 y与x’或y’ 的关系。直接见下图吧
经过推导我们得出这样的关系式。如上图。
代码#
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int a,b,x,y,d;
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main(){
cin>>a>>b;
d=exgcd(a,b,x,y);
cout<<d<<endl;
cout<<x<<" "<<y;
return 0;
}
再分析#
为什么当 b=0 时x=1,return a ? 当b=0,ax+by=ax就等于a,gcd=a;
那么再根据x=y’ y=x’-a/b* x; d=exgcd(b,a%b,y,x); x=y’; y=x’。接下来只需要对y进行操作y-=a/b*x;
- &x 表示在函数中直接对x进行操作。
结束了。我滴任务完成了!
2022-05-08 13:24:33完结
本文来自博客园,作者:huaziqi 转载请注明原文链接:https://www.cnblogs.com/huaziqi/p/16245437.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效