如何求解这个方程:\(ax + by = gcd (a, b)\)?

\(∵gcd(a, b) = gcd (b, a \% b)\)

\(∴\)易证 $ gcd(a, b)$ 总是可以化为 \(gcd (a',0)\)的形式

对于原方程\(a'*x + 0*y = gcd (a',0)\) (根据定义\(gcd(a',0) = a'\))

存在解为\({x=1,y=0}\)

设$gcd(a_1,b_1) \(为当前的\)gcd\(,\)gcd(a_2,b_2)\(为向下迭代后的\)gcd$

\({x1,y1}\)是当前解,\({x2,y2}\)是下一次\(gcd\)的解

$$a_1x_1 + b_1y_1 = gcd(a_1,b_1)$$

$$=gcd (a_2,b_2)$$

$$= gcd(b_1,a_1%b_1)$$

$$ = b_1*x2 + a_1 % b_1 *y2$$

由于\(a\%x = a-x*(a/x)\)

原式可以化简为:

$$a_1x_1 +b_1y_1 = b_1x_2+(a_1-(a_1/b_1)b_1)*y_2$$

$$a_1x_1 +b_1y_1 = a_1y_2+b_1x_2-(a_1/b_1)b_1y_2$$

$$a_1x_1 +b_1y_1 = a_1y_2+b_1(x_2-(a_1/b_1)*y_2)$$

我们已知下一次迭代得到的解\(x_2,y_2\)和\(a_1,b_1\)(边界为最终解\({x=1,y=0 }\))

那么就可以据此,系数对应,求出当前解:

$$x_1=y_2,y_1=x_2-(a_1/b_1)*y_2$$

经过层层迭代,就可以得到最终解。

代码:

int exgcd (int a1, int b1, int &x2, int &y2) {
//传址引用修改x2, y2
if (b1 == 0) {
x2 = 1, y2 = 0;
return a1;//边界情况
}
int div = exgcd (b1, a1 % b1, x2, y2);//向下递归
int x1 = y2, y1 = x2 - y2 * (a1 / b1);
return div;//返回约数 (可能没啥用QwQ关键求的是方程解)
}

用处:作为\(gcd\)的扩展版,它着力求的并不是\(gcd\),而是利用其性质求解形如\(ax + by = gcd (a, b)\)的方程,通常可以把逆元化为这种方程形式用\(exgcd\)快速求解。

(可能还有更多用处)

∵\(A*X\) \(mod\) \(B=1\)

∴\(A*X-B*Y=1\)

若\(B\)是质数,则二者\(gcd\)显然为\(1\)

(\(B\)不是质数逆元就不存在啦\(QwQ\))

代入\(exgcd\),求出来\(X\)的值就是\(A\)关于\(mod\) \(B\)的逆元

exgcd证明和最基础应用的更多相关文章

  1. IPFS:Filecoin和复制证明

    这篇文章主要来讲一下Filecoin协议里面的复制证明(Proof of Replication),由于协议涉及到很多概念,可能看起来有点晕乎乎的,小编尽量把复杂问题简单化 ,力求给大家做大普及IPF ...

  2. 检验 java 基础数据类型参数传递方式

    测试证明,java基础数据类型参数传递值虽是引用传递但是值不会改变.对象是引用传递,值会改变. 为什么?找到一段话来解释这个问题. "对于字符串对象来说,虽然在参数传递的时候也是引用传递,但 ...

  3. PHP反射API

    近期忙着写项目,没有学习什么特别新的东西,所以好长时间没有更新博客.我们的项目用的是lumen,是基于laravel的一个轻量级框架,我看到里面用到了一些反射API机制来帮助动态加载需要的类.判断方法 ...

  4. NOIP2012国王游戏

      题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在 ...

  5. Java学习之路:不走弯路,就是捷径

    1.如何学习程序设计? JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用.有编程高手认为,JAVA也好C也好没什么分别,拿来就用.为 ...

  6. OpenCV坐标体系的初步认识

    实验基础 本次实验通过一个简短的例子,主要来说明下面4个问题: 1. 坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线:Y轴为图像矩形左边的那条垂直线.该坐标体系在诸如结构体Mat, ...

  7. Codeforces Round #280 (Div. 2) E. Vanya and Field 数学

    E. Vanya and Field Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/492/pr ...

  8. Java自学成长路线(转载)

    JAVA自学之路 一:学会选择  决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等.  JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅 ...

  9. Java学习路径:不走弯路,这是一条捷径

    1.如何学习编程? JAVA是一种平台.也是一种程序设计语言,怎样学好程序设计不只适用于JAVA,对C++等其它程序设计语言也一样管用.有编程高手觉得,JAVA也好C也好没什么分别,拿来就用.为什么他 ...

随机推荐

  1. over-relaxation

    逐次超松弛sor 参考1https://blog.csdn.net/lusongno1/article/details/68941137 有各种对比和程序 主要就是取了加权平均,没仔细看

  2. 51nod 1503 猪和回文(dp滚存)

    题面 大意:在一个n*m的矩形中从(1,1)走到(n,m)而且走过的路径是一条回文串,统计方案数 sol:我们考虑从(1,1)和(n,m)两端开始算,这样就只要保证每次经过的字符一样就可以满足回文了, ...

  3. hdu-1711(kmp)

    题意:给你两串数字,问你第二串数字第一次出现在第一串数字的位置,没有输出-1: 解题思路:其是就是字符串匹配,就是这里是数字匹配,把char数组改成int型就可以了: 代码: #include< ...

  4. 了解AutoCAD对象层次结构 —— 4 —— 符号表

    上一小节我们看到了符号表包含了一系列的表(共9个),这些表数量是固定的,用户不能增加新的表,也不能删除现有的表. 符号表名称 符号表功能 Block Table 块表 存储图形数据库中定义的块.此表中 ...

  5. Photoshop独立安装包下载页面

    下载页面地址:https://helpx.adobe.com/cn/creative-cloud/kb/creative-cloud-apps-download.html

  6. BZOJ2342[Shoi2011]双倍回文——回文自动机

    题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...

  7. centos 7创建ss服务(方式一)

    一:安装PIP,由于安装的是python 版本的ss,所以需要先安装PIP: $ curl "https://bootstrap.pypa.io/get-pip.py" -o &q ...

  8. 基准对象object中的基础类型----列表 (四)

    object有如下子类: CLASSES object basestring str unicode buffer bytearray classmethod complex dict enumera ...

  9. android打电话方法(直接拨通)

    新建了CallPhone方法,如下: private void CallPhone() { String number = et_number.getText().toString(); if (Te ...

  10. Docker基本使用(二)

    Docker 客户端 我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项. 可以通过命令 docker command --help 更深入的了解指定的 Docker 命 ...