首页 > 编程语言 >数论学习笔记 (4):扩展欧几里得算法

数论学习笔记 (4):扩展欧几里得算法

时间:2024-05-02 14:55:50浏览次数:18  
标签:gcd 数论 text 欧几里得 int 算法 ax cases mod

概述

扩展欧几里得算法 (\(exgcd\)) 可以用来求形如 \(ax+by=c\) 的不定方程的通解。

铺垫 - \(\small\texttt{ax+by=gcd(a,b)}\)的解

\(exgcd\) 的思想是在用辗转相除法递归 \(gcd(a,b)\) 的回溯时求出对应方程 \(ax+by=gcd(a,b)\)的解。

考虑方程 \(ax+by=gcd(a,b)\) 。

看回辗转相除法的代码,我们将他展开一点写。

void gcd(int a,int b){
	if(!b) return a;
	return gcd(b,a%b);
}

注意最后当 \(b=0\) 时,\(gcd(a,b)=gcd(a,0)=a\),此时当 \(\begin{cases}x=1\\y=0\end{cases}\) 时,\(ax+by=gcd(a,b)\),于是最终状态下,\(\begin{cases}x=1\\y=0\end{cases}\) 即为其对应方程的解。

接下来,假设我们已经知道了 \(bx+(a\text{ }mod\text{ }b)y=gcd(b,a\text{ }mod\text{ }b)\) 的一组特解 \(\begin{cases}x=x'\\y=y'\end{cases}\),我们尝试求出 \(ax+by=gcd(a,b)\) 的解。

\(\because ax+by=gcd(a,b)\text{ },\text{ }bx'+(a\text{ }mod\text{ }b)y'=gcd(b,a\text{ }mod\text{ }b)\)

\(\small{且}\text{ }gcd(a,b)=gcd(b,a\text{ }mod\text{ }b)\)

\(\therefore ax+by=bx'+(a\text{ }mod\text{ }b)y'\)

\(\therefore ax+by=bx'+(a-\lfloor\frac{a}{b}\rfloor b)y'\)

\(\small{【变更主元】 得:}\)

\(a(x-y')+b(y-x'+\lfloor\frac{a}{b}\rfloor y')=0\)

\(\small{若想使上式总是成立,只需使:}\)

\(\begin{cases}x-y'=0\\y-x'+\lfloor\frac{a}{b}\rfloor y'=0\end{cases}\)

\(\therefore\begin{cases}x=y'\\y=x'-\lfloor\frac{a}{b}\rfloor y'\end{cases}\)

于是就完成了转换/转移,翻译成代码:

// 不需要知道 gcd(a,b) 是多少,无需返回值
void exgcd(int a,int b,int &x,int &y){ // 传址,直接修改
	if(!b){
		x=1,y=0;
		return;
	}
	exgcd(b,a%b,x,y);
	int tmp=x;
	x=y,y=tmp-(a/b)*y; // 直接修改
}

简便写法:

void exgcd(int a,int b,int &x,int &y){
	if(!b){
		x=1,y=0;
		return;
	}
	exgcd(b,a%b,y,x); // 区别:交换x和y的位置,等同于swap(x,y)
	y-=(a/b)*x;
}

扩展 - \(\small\texttt{ax+by=c}\)的解

先来看一个定理:

裴蜀定理:\(ax+by=c\) 有整数解的充要条件是 \(gcd(a,b) \mid c\)

这个定理是显然的,至少你从直觉上就觉得它没问题。

现在我们知道怎么判无解了,那么接下来的探究都建立在 \(ax+by=c\) 有界的情况下,那我们开始吧。

记 \(g=gcd(a,b).\)

\(\therefore g \mid a,g \mid b\)

\(\small{由裴蜀定理:}\)\(g \mid c\)

记 \(a'=\frac{a}{g},b'=\frac{b}{g},c'=\frac{c}{g}.\)

\(\therefore gcd(a',b')=1\)

发现可以用 \(exgcd\) 求出 \(a'x+b'y=1\) 的解\(\begin{cases}x=x'\\y=y'\end{cases}\)!

\(\therefore a'x+b'y=c'\)\(\text{ }\small{的解为}\)\(\begin{cases}x=c'x'\\y=c'y'\end{cases}\)

\(\therefore a'gx+b'gy=c'g\)\(\text{ }\small{即}\text{ }\)\(ax+by=c\)\(\text{ }\small{的解为}\)\(\begin{cases}x=c'x'\\y=c'y'\end{cases}\)

这样我们就找到了一组特解 \(\begin{cases}x=c'x'\\y=c'y'\end{cases}\).

通解即为 \(\begin{cases}x=c'x'+b'k\\y=c'y'-a'k\end{cases}(k \in \mathbb{Z})\).

(证明、代码略)

Tips
C++ 对负数取模的处理与数学中不一样,如数学中的 \(a\text{ }mod\text{ }b(a \in \mathbb{Z^-})\) 在 C++ 中的值为 \(-(abs(a)\text{ }mod\text{ }b)\).
\(eg:\)
数学:\(-5\text{ }mod\text{ }3=1\)
C++:\(-5\text{ }mod\text{ }3=-2\)
为解决这样的问题,我们一般这么写: ans=(a%b+b)%b

标签:gcd,数论,text,欧几里得,int,算法,ax,cases,mod
From: https://www.cnblogs.com/godmoo/p/18170199

相关文章

  • Java(4)-十大排序算法
    更好的总结:RUNOOB.COM十大经典排序算法冒泡排序冒泡排序的基本思想是比较数组中相邻的两个元素,根据比较结果交换它们的位置,让较大的元素排到数组末尾。遍历过程:首轮遍历:从数组的第一个元素开始,比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置,从而第一遍遍......
  • 数论模拟(1) 小朋友们,我们今天来找规律
    \(60\)分钟,干出来\(30\)至\(40\)分(满分\(50\)),最后一步没写出来还是有点rz.题目:求最小的整数\(n\),使得对至少两个不同的奇素数\(p\),有\[\sum_{k=1}^{n}(-1)^{v_p(k!)}<0.\]解:根据\(v_p\)函数的性质,可以对所有正整数进行规律性地分块,每块中的\(v_p\)值都是相同的:......
  • Akima算法
        测量数据的内插已有各种方法,如线性内插、多项式内插、样条函数插值等,但这里的Akima插值法具有独特的优点。  线性内插只顾及其附近两点的影响。  多项式内插时,低阶多项式由于参数较少,内插精度很低,而使用高阶多项式又会使解不稳定,出现“龙格”现象,即......
  • HPA* (Near Optimal hierarchical Path-finding)算法的效果图
    本文中的图全部来自:https://mohitsharma0690.blogspot.com/2016/01/hierarchical-pathfinding.html图的说明:Hereisanexampleofhowclustersarecreatedinanopenspaceenvironment.Thewhitesquaresrepresentwalkablegrids.Non-walkablegridspacesaremark......
  • 读天才与算法:人脑与AI的数学思维笔记15_声响的数学之旅
    1. 音乐1.1. 巴赫的作品以严格的对位著称,他十分中意对称的结构1.2. 巴托克的作品很多都以黄金比例为结构基础,他非常喜欢并善于使用斐波纳契数列1.3. 有时,作曲家是本能地或者不自知地被数学的模式和结构所吸引,而他们并没有意识到这些数学模式的意义1.4. 有时,他们主动去寻......
  • 排序算法
    数据结构排序算法·插入排序插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。/******************************************************************************functionname:InsertSort*function:......
  • leetcode算法热题--盛最多水的容器
    题目给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释......
  • leetcode算法热题-爬楼梯
    题目假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1阶+1阶2阶示例2:输入:n=3输出:3解释:有三种方法可以爬到楼顶。1阶+1阶+1阶1......
  • CF EDU164-E-数论分块
    link:https://codeforces.com/contest/1954/problem/E有一排怪物,第\(i\)只有\(a_i\)的血,每次攻击可以选择在\(i\)处放一个技能,技能会一直向左/右以相同的\(k\)点伤害扩散,直至遇到边界或已经死亡的怪物。问最少需要放几次技能?需要对所有\(k\)回答答案。\(n,a_i\leq10^......
  • 基于DCT变换的彩色图像双重水印嵌入和提取算法matlab仿真
    1.算法运行效果图预览灰度图   彩色图   2.算法运行软件版本matlab2022a  3.算法理论概述      双重水印嵌入算法涉及两个独立的水印:主水印和辅水印,它们可以是灰度图像、二进制序列或其他形式的数据。以下简述嵌入过程: 图像预处理:将彩色图像从R......