扩展欧几里得算法(Exgcd)

裴蜀定理

对于任意一组整数 \(a,b\),存在一组整数 \(x,y\),满足 \(ax+by=\gcd(a,b)\)。

Proof:

考虑数学归纳法。

当 \(b=0\) 时,由于 \(\gcd(a,0)=a\),则对于 \(ax+0y=a\) 这个不定方程,\(x=1\),\(y\) 取任意整数。

假设存在一组整数 \(x,y\),满足 $bx+(a\bmod b)y=\gcd(b,a\bmod b)=\gcd(a,b) $。

那么接下来证明也存在一组整数 \(x',y'\) 满足 \(ax'+by'=\gcd(a,b)\)。

\[\begin{aligned}
bx+(a\bmod b)y &= bx+(a-b\lfloor\dfrac{a}{b}\rfloor)y\\
&= bx+ay-b\lfloor\dfrac{a}{b}\rfloor y\\
&= ay+b(x-\lfloor\dfrac{a}{b}\rfloor y)
\end{aligned}
\]

当 \(x'=y,y'=x-\lfloor\dfrac{a}{b}\rfloor y\) 时满足条件。

那么利用辗转相除法进行递归,总能递归到 \(b=0\) 的情况。命题得证。

Exgcd

求关于 \(x,y\) 的方程 \(ax+by=c\) 的整数解。

设 \(d=\gcd(a,b)\),方程有整数解的充要条件是 \(d\mid c\)。

Proof:

设 \(a=k_1d,b=k_2d\),则有 \(k_1dx+k_2dy=c \Rightarrow k_1x+k_2y=\dfrac{c}{d}\)。

先证必要性: 由于 \(\dfrac{c}{d}\) 必须为整数,则 \(d \mid c\)。

再证充分性:上式中,\(k_1\perp k_2\),则方程 \(k_1x'+k_2y'=1\) 一定有整数解。由于 \(\dfrac{c}{d} \in\mathbb{Z}\),那么原方程也一定有整数解。

先将方程化简,两边同除以 \(d\)。此时 \(a,b\) 互质。

注意,为了方便表述,下面提到的方程都是化简后的方程

那么我们可以先利用裴蜀定理求出 \(ax'+by'=1\) 的一组特解 \(x',y'\),从而求出原方程的一组特解 \(x_0=cx’,y_0=cy'\)。

考虑如何求出通解。

让 \(x\) 加上一个数,那么 \(y\) 就要减去一个数。设这两个数为 \(\Delta_x,\Delta_y\),则有:

\[\begin{aligned}
a(x+\Delta_x)+b(y-\Delta_y) &= c\\
ax+a\Delta_x+by-b\Delta_y &= c\\
a\Delta_x-b\Delta_y&=0\\
a\Delta_x &= b\Delta_y \\
\dfrac{a}{b} &= \dfrac{\Delta_y}{\Delta_x}
\end{aligned}
\]

由于 \(a,b\) 互质,则 \(\dfrac{a}{b}\) 为最简整数比,则有 \(a \mid \Delta_y\) 且 \(\ b\mid \Delta_x\)。

由于 \(\Delta_x,\Delta_y \in \mathbb{Z}\),则 \(\Delta_x\) 最小取到 \(b\),\(\Delta_y\) 最小取到 \(a\)。

通解即为:

\[\begin{cases}
x=x_0+kb\\
y=y_0+ka\\
\end{cases}
(k\in \mathbb{Z})
\]

代回原方程,可以消掉 \(kb,ka\)。

接下来考虑,当存在正整数解时,如何求出最小正整数解与正整数解的个数。

对 \(x\) 的通解进行变形,求 \(x\) 的最小正整数解 \(x_1\):

\[\begin{aligned}
x_1 \bmod b &= (x_0+kb) \bmod b\\
x_1 \bmod b &= x_0 \bmod b\\
x_1&=(((x_0-1) \bmod b)+b)\bmod b+1
\end{aligned}
\]

先减一是为了避免 $x_0 \bmod a $ 一开始就为 \(0\) 的情况,从而保证 \(x_1>0\)。

易得,当 \(x\) 增大时,\(y\) 减小。当 \(x\) 取 \(x_1\) 时,\(y\) 取到最大正整数解 \(y_2\)。

同理,求出 \(y\) 的最小正整数解 \(y_1\),当 \(y\) 取 \(y_1\) 时,\(x\) 取到最大正整数解 \(x_2\)。

由通解公式可得,\(x\) 每两个整数解之间相差 \(b\),\(y\) 每两个整数解之间相差 \(a\)。

正整数解的个数即为 \(\dfrac{x_2-x_1}{b}+1\) 或 \(\dfrac{y_2-y_1}{a}+1\)。

Ex.1 【模板】二元一次不定方程 (exgcd)

根据上面的分析,套用公式即可。

ll T,A,B,C,x,y,d,x1,x2,y1,y2,cnt; 

ll GetX(ll Y){return (C-B*Y)/A;}

ll GetY(ll X){return (C-A*X)/B;}

ll Exgcd(ll a,ll b,ll &x,ll &y){
if(b==0) return x=1,y=0,a;
ll res=Exgcd(b,a%b,x,y);
ll z=x;
x=y;
y=z-(a/b)*y;
return res;
} void Solve(){
read(A),read(B),read(C);
d=Exgcd(A,B,x,y);
if(C%d) return puts("-1"),void();
A/=d,B/=d,C/=d;
x*=C,y*=C;
x1=((x-1)%B+B)%B+1;
y2=GetY(x1);
y1=((y-1)%A+A)%A+1;
x2=GetX(y1);
cnt=(x2-x1)/B+1;
if(y2<=0) printf("%lld %lld\n",x1,y1);
else printf("%lld %lld %lld %lld %lld\n",cnt,x1,y1,x2,y2);
}

Ex.2 [NOIP2012 提高组] 同余方程

对式子进行变形:

\[\begin{aligned}
ax &\equiv 1 \pmod{b}\\
ax+by &= 1
\end{aligned}
\]

利用 Exgcd 求解即可。

这是非常常用的变形技巧,也是当 \(a,b\) 互质但 \(b\) 不是质数时求逆元的方法。

Ex.3 青蛙的约会

设跳跃 \(k\) 次后两青蛙相遇,则可列出方程:

\[\begin{aligned}
x+kn &\equiv y+km &\pmod{L}\\
(x-y)+k(n-m) &\equiv 0 &\pmod{L}\\
(x-y)+k(n-m) &= pL\\
k(n-m)-pL&=y-x\\
kS-pL&=C
\end{aligned}
\]

其中 \(S,L,C\) 为常数。

把 \(k,p\) 看作未知数,利用 Exgcd 求 \(k\) 的最小正整数解即可。

二元一次不定方程(Exgcd)(更方便的解法)的更多相关文章

  1. P5656 【模板】二元一次不定方程(exgcd)

    还不会 exgcd 的请移步窝的学习笔记,这里只讲怎么搞出烦人的答案. 在 \(a,b\) 两者互质的情况下,二元一次不定方程的通解:\(a(x+db)+b(y+da)=c\). 所以要先将 \(a, ...

  2. poj 2115 二元一次不定方程

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14765   Accepted: 3719 Descr ...

  3. poj 1061 青蛙的约会(二元一次不定方程)

      Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...

  4. exgcd、二元一次不定方程学习笔记

    (不会LATEX,只好用Word) ( QwQ数论好难) 再补充一点,单次询问a,b求逆元的题可以直接化简然后套用exgcd求解. 例题:https://www.luogu.org/problemne ...

  5. uva 10090 二元一次不定方程

    Marbles Input: standard input Output: standard output I have some (say, n) marbles (small glass ball ...

  6. MySQL root密码忘记,原来还有更优雅的解法!

    一直以来,对于MySQL root密码的忘记,以为只有一种解法-skip-grant-tables. 问了下群里的大咖,第一反应也是skip-grant-tables.通过搜索引擎简单搜索了下,无论是 ...

  7. LeetCode 62,从动态规划想到更好的解法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第36篇文章,我们一起来看下LeetCode的62题,Unique Paths. 题意 其实这是一道老掉牙的题目了 ...

  8. 奇异值分解(SVD)和最小二乘解在解齐次线性超定方程中的应用

    奇异值分解,是在A不为方阵时的对特征值分解的一种拓展.奇异值和特征值的重要意义相似,都是为了提取出矩阵的主要特征. 对于齐次线性方程 A*X =0;当A的秩大于列数时,就需要求解最小二乘解,在||X| ...

  9. 数论专项复习(一)扩展欧几里得算法(exgcd)

    简介 扩展欧几里得算法(简称扩欧,exgcd),用来求下列方程的一组解: \[ax+by=(a,b) \] 算法介绍 1. 裴蜀定理 裴蜀定理(Bézout's lemma):若 \(a\in \ma ...

  10. day3(数论)

    总得来说,这是可怕的一天,极其可怕的一天(完) 一.数论 阴影啊! 首先,设ab为两个整数,则存在唯一的q和r,使得a=qb+r 若r=0,则b整除a,记作b|a. (1)同余 若a/m和b/m的余数 ...

随机推荐

  1. 使用Jackson读取xml

    找了不少,什么峰的,什么dn的参差不齐的资料,废话不少,问题是导入的包也没有.不多废话,看下面代码直接复用. package bean;import com.fasterxml.jackson.dat ...

  2. js正则匹配以$开头和结尾的内容,并改变颜色

    let res = "$你好你好$" res = res.replace(/\$(?<=\$).*?(?=\$)\$/g, `<span onclick="( ...

  3. esp32挂esphome

    esp32挂esphome 使用docker创建容器 docker run -d --name='esphome' \ --restart=always \ -p 6052:6052 \ -e TZ= ...

  4. LaViT:这也行,微软提出直接用上一层的注意力权重生成当前层的注意力权重 | CVPR 2024

    Less-Attention Vision Transformer利用了在多头自注意力(MHSA)块中计算的依赖关系,通过重复使用先前MSA块的注意力来绕过注意力计算,还额外增加了一个简单的保持对角性 ...

  5. ubuntu 20.04安装GCC G++ 6.2,支持c++ 14

    1. 下载源码包 wget http://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2 2. 解压 tar jxf gcc-6.2.0.tar.bz2 ...

  6. logistic和softmax

    一直觉得logistic regression就是softmax的一种特殊的形式,softmax是多类,logistic是两类. 但是今天仔细想了想logistic的意义以及softmax的意义,感觉 ...

  7. 海光 FTPM 运行报错:Fapi_Provision_Finish() ErrorCode (0x00060025) No EK certificate found.

    使用的是海光 CPU 提供的基于固件的 FTPM,错误原因是海光没有给 TPM 提供相应的 EK 证书.从而导致Fapi_Provision()接口无法通过证书的校验.关于Fapi_Provision ...

  8. CSS & JS Effect – Dialog Modal

    效果 参考: Youtube – Create a Simple Popup Modal Youtube – Create a Modal (Popup) with HTML/CSS and Java ...

  9. SQL Server – Schema

    前言 久仰 dbo 大名, 但是一直没有认真去看它有啥作用. 今天翻看了一下 SQL Server sample database: AdventureWorks2019, 发现它用了许多 Schem ...

  10. 支持Docker的底层技术(Namespaces?CGroups?UnionFS?Docker 架构?)(二)

    上一篇介绍了Docker基本概念,这一篇介绍下支持Docker的底层技术 Docker 本质就是宿主机的一个特殊进程,Docker 是通过 namespace 实现资源隔离,通过cgroup 实现资源 ...