gcd与exgcd

gcd与exgcd

#include<cmath>
#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
#define LL long long
LL read()
{
	LL x=0,w=1;
	char ch=0;
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
			w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return w*x;
}
int a,b,X,Y;
int gcd(int x,int y)
{
	while(y!=0)
	{
		int z=x;
		x=y;
		y=z%y;
	}
	return x;
}
int exgcd(int a,int b,int &x,int &y)//用来解a*x+b*y=gcd(a,b)的情况 
{
	if(b==0)
	{
		x=1;
		y=0;
		return a;
	}
	int r=exgcd(b,a%b,x,y);
	int t=x;
	x=y;
	y=t-a/b*y;
	return r;
}
int lcm(int a,int b)
{
	int ans=a/gcd(a,b);
	return ans*b;
}
int main()
{
	while(cin>>a>>b)
	{
		cout<<"GCD:"<<gcd(a,b)<<endl;
		int tt=exgcd(a,b,X,Y);
		cout<<"exGCD:"<<a<<"*"<<X<<'+'<<b<<'*'<<Y<<'='<<tt<<endl;
	}
	return 0;
 } 
03-16
### 扩展欧几里得算法(ExGCD)实现及应用 #### 一、理论基础 扩展欧几里得算法基于欧几里得算法的核心原理,即 \( \text{gcd}(a, b) = \text{gcd}(b, a \% b) \)[^1]。通过递归计算最大公约数的同时,该算法能够找到满足线性不定方程 \( ax + by = \text{gcd}(a, b) \) 的整数解 \( x \) 和 \( y \)[^2]。 裴蜀定理进一步指出,如果两个整数 \( a \) 和 \( b \) 的最大公约数为 \( d \),则对于任何整数系数 \( x \) 和 \( y \),\( ax + by \) 始终是 \( d \) 的倍数;并且总能找到一组特解使得 \( ax + by = d \) 成立。 --- #### 二、算法实现 以下是扩展欧几里得算法的标准 C++ 实现: ```cpp #include <iostream> using namespace std; // 定义函数原型 long long extended_gcd(long long a, long long b, long long& x, long long& y); int main() { long long a, b; cin >> a >> b; long long x, y; long long gcd_value = extended_gcd(a, b, x, y); cout << "GCD: " << gcd_value << endl; cout << "Coefficients: x = " << x << ", y = " << y << endl; return 0; } // 扩展欧几里得算法核心逻辑 long long extended_gcd(long long a, long long b, long long& x, long long& y) { if (b == 0) { // 边界条件 x = 1; y = 0; return a; // 返回当前的最大公约数 } long long gcd_ab = extended_gcd(b, a % b, x, y); // 递归调用 // 更新x和y的关系 long long temp_x = x; x = y; y = temp_x - (a / b) * y; return gcd_ab; // 返回上一层的结果 } ``` 上述代码实现了扩展欧几里得算法的功能,可以求解给定两数 \( a \) 和 \( b \) 的最大公约数以及对应的贝祖系数 \( x \) 和 \( y \)[^3]。 --- #### 三、实际应用场景 ##### 应用场景 1:求解线性同余方程 扩展欧几里得算法可用于解决形如 \( ax \equiv c \ (\text{mod} \ b) \) 的线性同余方程。当且仅当 \( \text{gcd}(a, b) \mid c \) 时,此方程有解。具体步骤如下: 1. 使用扩展欧几里得算法求出 \( ax + by = \text{gcd}(a, b) \) 的解; 2. 如果 \( \text{gcd}(a, b) \nmid c \),无解; 3. 否则调整得到通解形式并取最小非负解。 ##### 应用场景 2:模逆元的计算 在密码学等领域中,经常需要计算乘法逆元。设 \( m \) 是模数,则 \( a \) 关于模 \( m \) 的乘法逆元定义为满足 \( ax \equiv 1 \ (\text{mod} \ m) \) 的 \( x \)。利用扩展欧几里得算法可高效求解此类问题。 --- #### 四、注意事项 1. 当输入参数 \( a \) 或 \( b \) 中有一个为零时,需特殊处理边界情况。 2. 计算过程中可能出现负数解,应将其转换为标准范围内的正值解。 3. 对于大数值运算,建议采用高精度数据类型(如 Python 的 `int` 类型或 C++ 的 `__int128`),以防止溢出。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值