扩展欧几里得算法exgcd基本运用 与 exgcd求逆元

基础用法

给定 n 对正整数 ai,bi,对于每对数,求出一组 xi,yi,使其满足 ai×xi+bi×yi=gcd(ai,bi)

裴蜀定理

对于任意正整数a,b,那么一定存在非零整数x,y使得ax+by=gcd(a,b)

假设ax+by=d,那么d一定要是gcd(a,b)的倍数

显然,a,b,ax,by,ax+by都是gcd(a,b)的倍数,因此d=ax+bygcd(a,b)的倍数

因此d最小是一倍的gcd(a,b),也就是d=gcd(a,b)

所以这个方程ax+by=d最小的解便是gcd(a,b)

因此题中的方程一定有解

这个解就由扩展欧几里得算法解出

想法

先回顾欧几里得算法

if(!b)
{
    return a;
}
return gcd(b, a % b);

1. 先看if(!b)的情况,当b=0时,gcd(a,b)=gcd(a,0)=a

代入原式中,a×x+0×y=a

解得x=1,y=0

2. if(b)时,用int d记录exgcd(b, a % b, y, x)

由于此处颠倒了a,b的顺序,因此传入x,y时也要颠倒

=by+(a%b)x=d

此处a%b=aab×b

由于a÷b=aba

所以a%b=aab×b

因此

by+(aab×b)x=d

x乘进去,得:

ax+b(yabx)=d

码来!

#include <iostream>
using namespace std;

int Extended_Euclidean(int a, int b, int &x, int &y) // 记得加引用
{
    if(!b)
    {
        x = 1;
        y = 0;
        return a;
    }
    
    int d = Extended_Euclidean(b, a % b, y, x); // 颠倒
    
    y = y - a / b * x; // 套公式
    return d; // 返回gcd(a, b)
}

int main()
{
    int n;
    int a, b, x, y;
    scanf("%d", &n);
    while (n -- )
    {
        scanf("%d%d", &a, &b);
        
        Extended_Euclidean(a, b, x, y); // 算法写全名会不会霸气一点 []~( ̄▽ ̄)~*
        
        printf("%d %d\n", x, y);
    }
    return 0;
}

扩展欧几里得算法求逆元

我们已知当p是质数的时候,可以用快速幂算法求逆元

详见这篇博客

那么,当p不是质数的时候,用什么呢?

答案是:扩展欧几里得算法

a有逆元的充分必要条件是ap互质,因此gcd(a,p)=1
所以设逆元为x,则ax1modp
ax+py=1
那么exgcd(a, p, x, y)就能算出来

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;

int exgcd(int a, int b, int &x, int &y) // 记得加引用
{
    if(!b)
    {
        x = 1;
        y = 0;
        return a;
    }

    int d = exgcd(b, a % b, y, x); // 颠倒

    y = y - a / b * x; // 套公式
    return d; // 返回gcd(a, b)
}
int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        int x, y, a, p;
        cin >> a >> p;
        int d = exgcd(a, p, x, y);
        if(d == 1) // 有解
        {
            cout << ((LL)x + p) % p << endl; // 保证正数
        }
        else puts("impossible");
    }
    return 0;
}

感谢观看~

posted @   MoyouSayuki  阅读(108)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
:name :name
点击右上角即可分享
微信分享提示