标签:lfloor gcd int bmod EXGCD 数学 ax aligned
\(\rm EXGCD\),即 扩展欧几里得算法,简称 扩欧,是用来求出方程
\[ax+by=\gcd(a,b) \]的整数解的,其中 \(a,b\) 均为整数.
我们考虑辗转相除法的最后一步,当 \(b=0\) 时,要使得
\[ax+0y=\gcd(a,0)=a \]成立,那么只要取 \(x=1\),\(y\) 取任意整数即可,不妨取 \(y=0\).
因为 \(\gcd(a,b)=\gcd(b,a\bmod b)\),所以可以考虑当整数 \(x,y\) 使得
\[bx+(a\bmod b)y=\gcd(b,a\bmod b) \]成立时,如何推出使得
\[ax'+by'=\gcd(a,b) \]成立的 \(x',y'\).
对于 \(bx+(a\bmod b)y=\gcd(b,a\bmod b)\),
\(\begin{aligned}等式左边&=bx+(a-b\left\lfloor\frac{a}{b}\right\rfloor)y\\&=ay+b(x-\left\lfloor\frac{a}{b}\right\rfloor y)\end{aligned}\)
\(\begin{aligned}等式右边&=\gcd(a,b)\end{aligned}\)
所以要使 \(ax'+by'=\gcd(a,b)\) 的话,取 \(x'=y,y'=x-\left\lfloor\frac{a}{b}\right\rfloor y\) 即可。
就这样一直递归。
\(\text{Code}\)
int x, y;
void exgcd(int a, int b)
{
if (!b)
{
x = 1, y = 0;
return;
}
exgcd(b, a % b);
ll tmp = x; //先将 x 存下来
x = y;
y = tmp - a / b * y;
}
标签:lfloor,gcd,int,bmod,EXGCD,数学,ax,aligned 来源: https://www.cnblogs.com/mangoworld/p/Extended-Euclidean-Algorithm.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。