扩展欧几里得算法

扩展欧几里得算法


欧几里得算法#

分析#

首先,既然有扩展欧几里得算法,那欧几里得算法是什么?

答案是在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完结

posted @   huaziqi  阅读(33)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示