数论学习笔记

ExGCD:

目的:求形如 \(Ax+By=C\) 的不定方程的通解

有解判断:

方程有解的充要条件是 \(Gcd(a,b)|C\),可以使用数论知识证明

问题简化:

将问题简化为求 \(Ax+By=Gcd(a,b)\) 的通解,先求他的一组解。

思路及证明:

使用递归的思想减小A和B的值,直至方程变为\(x=Gcd(x,0)\)的形式。

已知:

\[Gcd(a,b)=Gcd(b,a\%b) \]

考虑:

\[Ax_1+By_1=Gcd(A,B) \]

\[Bx_2+(A\%B)y_2=Gcd(B,A\%B) \]

然后寻找\((x_1,y_1)\)\((x_2,y_2)\)的递推关系。

\(a\%b=\lfloor\frac{a}{b}\rfloor b\)带入得:

\[A(x_1-y_2)+B(y_1-x_2+\lfloor\frac{A}{B}\rfloor y_2)=0 \]

由于我们只需要每个递归状态的一组解即可,所以我们可以直接使用

\(x_1=y_2\)

\(y_1=x_2-\lfloor\frac{A}{B}\rfloor y_2\)

进行递归,得到一组特解。

求通解:

已知:

\[Ax_1+By_1=C \]

\[Ax_2+By_2=C \]

两式做差:

\[Ax_1+By_1=Ax_2+By_2 \]

\(g=Gcd(A,B)\)

则:

\[\frac{A}{g}(x_1-x_2)+\frac{B}{g}(y_1-y_2)=0 \]

得通解:

\(x=x_0+k\frac{B}{g}\)
\(y=y_0-k\frac{A}{g}\)

例题:

青蛙的约会

本题需要求出x的最小正整数解,可以采用\(M=|\frac{B}{g}|\), \(x=(x_0%M+M)%M\)来求出最小整数解x,注意模数一定取正数!还有注意开longlong

#include<bits/stdc++.h>
#define int long long
using namespace std;

int x, y;

int exgcd(int a, int b){
	if (b == 0){
		x = 1;y = 0;return a;
	}
	int g = exgcd(b, a%b);
	int tmp = x;
	x = y;
	y = tmp - a / b * y;
	return g;
}

signed main(){
	int x0, y0, m, n, l;cin>>x0>>y0>>m>>n>>l;
	int g = exgcd(m - n, l);//方程形如(m-n)x+ly=(y0-x0)
	if((y0 - x0) % g) cout<<"Impossible"<<endl;
	else{
		x *= (y0 - x0) / g;
		l = abs(l / g);
		x = (x % l + l) % l;
		cout<<x<<endl;
	}
	return 0;
}
posted @ 2024-07-20 11:00  hcx1999  阅读(16)  评论(0编辑  收藏  举报