数论——扩展欧几里得

No.1 前置知识#

  1. 欧几里得算法(辗转相除法)

  2. 裴蜀定理


No.2 算法,证明及函数#

扩展欧几里得算法用来解决这样一个问题:给定两个非零的整数 ab,求一组整数解 (xy) 使得 ax+by=gcd(a,b) 成立(通过裴蜀定理可知一定存在解)。

证明:#

ax1+by1=gcd(a,b),设 bx2+(amodb)y2=gcd(b,amodb)

由欧几里得算法可知:gcd(a,b)=gcd(b,amodb)

ax1+by1=bx2+(amodb)y2

amodb=akb(k 为商且 kZ)

k=ab

ax1+by1=bx2+(abab)y2

整理得:ax1+by1=ay2+b(x2aby2)

x1=y2,y1=x2aby2

可以看出:(x1,y1) 这组解由 (x2,y2) 得来

不难发现:当xn,yn 关于 gcd(a,0) 时,axn+byn=a,xn=1,yn=0

这组边界整数解可得 x1,y1


函数:#
Code
void exgcd(int a,int b){
    if(b==0){
	x=1;
	y=0;
	return;
    }
    exgcd(b,a%b);
    int t=x;
    x=y;
    y=t-(a/b)*y;
}

No.3 例题#

3.1同余方程#

链接:Link

分析:

题目要求关于 x 的同余方程 ax1(modb) 的最小正整数解。

可以转换得到:axmodb=1

于是 ax+by=1

这个式子我们很熟悉,但是它有一点不对劲,扩欧的标准是 ax+by=gcd(a,b),为什么有 1

很简单,它说明了 gcd(a,b)=1a,b互质。

接下来,就可用扩欧得出 x,y 的一组特殊解。

问题来了,此时 x,y 只满足 ax+by=1x 不一定为最小整数解。

此时,可将 x 加上 kb(kZ),从而得到 x 的最小整数解。

ax+by=1

ax+by+pabpab=1

a(xbp)+b(yap)=1

可得 x 的最小整数解为 (xmodb+b)modb

Code
#include<bits/stdc++.h>
using namespace std;

long long x,y;

long long read(){
	long long s=0,w=1;
	char ch=getchar();
	while(ch>'9'||ch<'0'){
		if(ch=='-'){
			w=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}

void exgcd(long long a,long long b){
	if(b==0){
		x=1;
		y=0;
		return;
	}
	exgcd(b,a%b);
	long long t=x;
	x=y;
	y=t-(a/b)*y;
}

int main(){
	long long a,b;
	scanf("%lld%lld",&a,&b);
	exgcd(a,b);
	printf("%lld\n",(x%b+b)%b);
	return 0;
}

认真学数学ing#

完结#

posted @   faith_xy  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示