扩展欧几里得算法exgcd基本运用 与 exgcd求逆元
基础用法
给定
裴蜀定理
对于任意正整数
假设
,那么 一定要是 的倍数 显然,
都是 的倍数,因此 是 的倍数 因此
最小是一倍的 ,也就是 所以这个方程
最小的解便是
因此题中的方程一定有解
这个解就由扩展欧几里得算法
解出
想法
先回顾欧几里得算法
:
if(!b)
{
return a;
}
return gcd(b, a % b);
if(!b)
的情况,当
代入原式中,
解得
if(b)
时,用int d
记录exgcd(b, a % b, y, x)
由于此处颠倒了
的顺序,因此传入 时也要颠倒
此处
由于
所以
因此
把
乘进去,得:
码来!
#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;
}
扩展欧几里得算法求逆元
我们已知当快速幂算法
求逆元
详见这篇博客
那么,当
答案是:扩展欧几里得算法
有逆元的充分必要条件是 与 互质,因此
所以设逆元为,则
则
那么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;
}
感谢观看~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!