首页 > 其他分享 >扩展欧几里得学习笔记

扩展欧几里得学习笔记

时间:2023-03-01 18:25:49浏览次数:57  
标签:tmp begin frac gcd 欧几里得 扩展 笔记 end cases

温馨提示:本文推式子比较多,建议跟着文章自己推一推。

扩展欧几里得是什么

扩展欧几里得(exgcd)是一个可以用来求 \(ax+by=c\)(\(c\%\gcd(a,b)=0\),否则无解)的解的算法

求解 \(ax+by=\gcd(a,b)\)

首先,如果 \(b=0\) 的话,\(\gcd(a,b)=a\),则解为 \(\begin{cases}x=1 \\ y=0\end{cases}\)

设此方程的解为 \(\begin{cases}x=x_0 \\ y=y_0\end{cases}\)

那么我们需要做的就是将 \(ax_0+by_0=\gcd(a,b)\) 转化为 \(b=0\) 的格式,这就要用到辗转相除法了。

设另一个方程:\(bx_1+(a\%b)y_1=\gcd(b,a\%b)\)

令 \(a_1=b,b_1=a\%b\)

则该方程转化为 \(a_1x_1+b_1y_1=\gcd(a_1,b_1)\)

我们会发现它和原方程的格式是一样的,而且根据欧几里得原理,它可以一直递推到 \(a_nx_n+b_ny_n=\gcd(a_n,b_n)\) 使得 \(b_n=0\),就可以求得解 \(\begin{cases}x_n=1 \\ y_n=0\end{cases}\)

那假设我们已经求得了该结果,那如何推导出 \(x_0\) 和 \(y_0\) 呢?

我们首先研究如何从 \(x_1\) 和 \(y_1\) 推导出一组合法的 \(x_0\) 和 \(y_0\),其他的就同理了

因为

\[\begin{cases}bx_1+(a\%b)y_1=\gcd(b,a\%b) \\ ax_0+by_0=\gcd(a,b)\end{cases} \]

且根据欧几里得定理,\(\gcd(a,b)=\gcd(b,a\%b)\)

所以

\[ax_0+by_0=bx_1+(a\%b)y_1 \]

且 \(a\%b=a-\lfloor\frac{a}{b}\rfloor b\)(模运算的意义)

所以

\[\begin{matrix} \begin{aligned} ax_0+by_0&=bx_1+(a-\lfloor\frac{a}{b}\rfloor b)y_1 \\ &=bx_1+ay_1-\lfloor\frac{a}{b}\rfloor b y_1 \\ &=b(x1-\lfloor\frac{a}{b}\rfloor y_1)+ay_1 \\ &=ay_1+b(x_1-\lfloor\frac{a}{b}\rfloor y_1) \end{aligned} \\ \begin{cases}x_0=y_1 \\ y_0=x_1-\lfloor\frac{a}{b}\rfloor y_1 \end{cases} \end{matrix} \]

这样,我们就由 \(x_1\) 和 \(y_1\) 推导出了 \(x_0\) 和 \(y_0\),其他同理

于是乎:

struct node
{
	int x,y;
};
node exgcd(int a,int b)
{
	if(b==0)
	{
		node tmp;
		tmp.x=1,tmp.y=0;
		return tmp;
	}
	node tmp=exgcd(b,a%b);//递归求出x_(k+1)和y_(k+1)
	node ans;
	ans.x=tmp.y,ans.y=(tmp.x)-a/b*(tmp.y);//推导出x_k和y_k
	return ans;
}

这样,我们就求出了 \(ax+by=\gcd(a,b)\) 的一组解

\(ax+by=c\) 的一组解 \(\begin{cases} x=x_{tmp}\\y=y_{tmp} \end{cases}\)

我们已经求出了 \(ax+by=\gcd(a,b)\) 的一组解 \(\begin{cases} x=x_0 \\ y=y_0 \end{cases}\)

那么我们就可以知道 \(akx_0+bky_0=k\gcd(a,b)\)

又因为要求 \(c\) 是 \(\gcd(a,b)\) 的倍数(否则无解)

所以 \(k=\frac{c}{\gcd(a,b)}\)

所以很简单:

\[\begin{cases} x_{tmp}=kx_0=\frac{c}{\gcd(a,b)}x_0 \\ y_{tmp}=ky_0=\frac{c}{\gcd(a,b)}y_0 \end{cases} \]

3.\(ax+by=c\) 的所有解 \(\begin{cases} x=x_{ans}\\y=y_{ans} \end{cases}\)

我们已经求出了 \(ax+by=c\) 的一组解 \(\begin{cases}x=x_{tmp} \\ y=y_{tmp}\end{cases}\)

即 \(ax_{tmp}+by_{tmp}=c\)

将它加上再减去 \(\frac{ab}{\gcd(a,b)}\),得到

\[\begin{matrix} ax_{tmp}+\frac{ab}{\gcd(a,b)}+by_{tmp}-\frac{ab}{\gcd(a,b)}=c \\ a(x_{tmp}+\frac{b}{\gcd(a,b)})+b(y_{tmp}-\frac{a}{\gcd(a,b)})=c \end{matrix} \]

在 \(x_{tmp}\) 上减,在 \(y_{tmp}\) 上加也同理

所以 \(\begin{cases} x=x_{tmp}\pm\frac{b}{\gcd(a,b)} \\ y=y_{tmp}\mp\frac{a}{\gcd(a,b)} \end{cases}\) 也是一组解

这个变换进行多次,即可得到

\[\begin{cases} x_{ans}=x_{tmp}+t\times\frac{b}{\gcd(a,b)} \\ y_{ans}=y_{tmp}-t\times\frac{a}{\gcd(a,b)} \end{cases} \]

\(x\) 和 \(y\) 各自的最小正整数解

以 \(x\) 的最小正整数解为例:

求出任意一组解 \(\begin{cases}x=x_{tmp} \\ y=y_{tmp}\end{cases}\)

因为将 \(x_{tmp}\) 加或减 \(\frac{b}{\gcd(a,b)}\) 也成立,所以可设 \(d=\frac{b}{\gcd(a,b)}\)(注意这里分子是 \(b\) )

\(x_{min}=(x_{tmp}\%d+d)\%d\)(因为 \(x_{tmp}\) 有可能是负数)

同理对于 \(y\),设 \(d=\frac{a}{\gcd(a,b)}\)(注意这里分子是 \(a\))

\(y_{min}=(y_{tmp}\%d+d)\%d\)

完结撒花

至此,你已经学完了扩展欧几里得的基础用法,如有不懂的地方,建议对照着文章自己推一推,悟一悟。

做个题练习一下吧:洛谷 P5656 【模板】二元一次不定方程 (exgcd)

标签:tmp,begin,frac,gcd,欧几里得,扩展,笔记,end,cases
From: https://www.cnblogs.com/cxm1024/p/17168365.html

相关文章

  • 均值不等式学习笔记
    从平均数说起我们都知道\(n\)个数的平均数表示为:\[\frac{a_1+a_2+a_3+\cdotsa_n}{n}\]这种最常见的平均数被称为“算术平均数”(ArithmeticMean)。还有一种常用的平均......
  • php扩展开发
    1.下载php源码进入官网找到相应的版本下载地址​ wget-chttps://www.php.net/distributions/php-8.1.11.tar.gz2.编译并安装php解压下载的文件后进入目录./buildco......
  • 博弈论学习笔记
    挖个巨坑,慢慢填。从Nim游戏入手问题:有\(n\)堆石子,第\(i\)堆石子有\(s_i\)个,两个人轮流取石子,每人每次只能从一堆中取任意数量的石子,可以取完,不能不取。问先手必......
  • C#初步学习2(个人笔记,基于老赵.Net的视频自学,不喜勿喷)
    //此笔记仅针对个人学习而写,会有所缺失的内容,不喜勿喷初步学习C#中的基本变量除了最基本的“byte,short,int,long,float,double,char,string(C#中“String”和“string”......
  • 韦东山2440-学习笔记-platform
    1.简介platform是设备驱动总线模型2.示例#include<linux/platform_device.h>#include<linux/module.h>staticstructplatform_device*led_dev;staticstru......
  • 极光笔记 | 极光PUSH服务助力企业提升抢单速度
    随着硬件、软件、网络等不断发展、完善,互联网已经渗透到了日常生活中的方方面面,在直接赋能原有行业服务的同时也带来了很多新的服务模式,给人们日常生活带来了极大便利。例......
  • 《金阁寺》——读书笔记
    2023.2.25①我的少年时期混浊着微明的曙色。虽然暗影漆黑的世界极其可怕,但白昼般清晰透明的生也不属于我②母亲很快给我来了一封电报,说父亲大量咳血,已经去世了2023.2.......
  • 数据库笔记
    第二讲数据库系统的结构抽象与演变1.数据库系统的标准结构(1)数据库系统的分层抽象?DBMS管理数据的三个层次外部层次(ExternalLevel)=用户层次(UserLevel)某一用户能够......
  • 【读书笔记&个人心得】第8章:Map
    Map一种元素对(pair)的无序集合,给定key,对应的value可以迅速定位,这个结构也称为关联数组或字典(如需要有序请使用结构体)给定key,对应的value可以迅速定位声明、初......
  • 【读书笔记&个人心得】第7章:数组与切片
    数组与切片这章我们开始剖析集合,它是可以包含大量条目(item)的数据结构,例如数组、切片和map。从这看到Go明显受到Python的影响。数组有特定的用处,但是却有一些呆......