线性同余方程解法exgcd模板(新模板)

本文介绍了线性同余方程的解法,重点在于使用扩展欧几里得算法(exgcd)来求解,并给出了C++代码实现。通过exgcd求解ax+by=gcd(a,b),进而解决ax≡c(mod b)的方程。讨论了解的存在性条件,并解释了如何确保找到最小正整数解。
摘要由CSDN通过智能技术生成

之前的板子太恶心了,数论题做多了就觉得非常难受,因此换了一个无论是代码难度还是理解难度都更低的写法。

线性同余方程:

(1)形式:形如ax≡c(mod b)的方程.
(2)解法:将原始转化为ax+by=c的二元一次不定方程,然后用exgcd求解
(3)解的存在情况:
《1》当gcd(a,b)|c时原方程有解,且有无数个解。
《2》当c=gcd(a,b)时有唯一解
《3》当方程有无数个解时,解可正可负
tips:所有出现的数都限定为整数

模板:

#include<bits/stdc++.h>
using namespace std;
long long x, y;//目前方程真正的解 
long long a,b;
void exgcd(long long a, long long b)
{
	//当前目的:求解 ax + by = gcd(a, b) 这么一个方程 
	if(b == 0) //a, b不断改变的过程中,b最终必然会成为0
	{
		//在 b = 0 时方程还要成立? 使 x = 1, y = 0 ,必然成立 
		x = 1;
		y = 0; //建议返回0。不过y = 7能AC,证明了最后一个等式不受最后一个y影响
		return;
	} 
	exgcd(b, a % b);//把下一层系数传进去(先求下一个方程的解 )
	//现在我们已经拿到了下一个方程的解x, y
	long long tx = x;//暂时存一下x,别丢了
	x = y;
	y = tx - a / b * y; 
}
int main()
{
	scanf("%lld%lld",&a,&b);
	exgcd(a, b);
	x = (x % b + b) % b;//我们求出来的x必然满足方程,但不一定是最小正整数解,所以要进行答案处理
	printf("%lld\n", x);
	return 0;
}

tips:
关于为什么这一句就可以使x成为最小整数解:

x=(x%b+b)%b;

(1)理解1:分正负性讨论
<1>若x>0,显然成立
<2>若x<0,x%b会使x成为一个绝对值小于b的负数,因此也成立

<2>理解2:严谨数学式
ax+by=c
ax+by-kab+kab=c
a(x+bk)+b(y-ak)=c
由于这里所有的数都是整数,且在无限解的情况下,x和(x+bk)的数集是完全相等的。
因此可以得出结论:对x加上或减去任意个b,x的解仍然不重不漏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值