如何求解这个方程:\(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. Jsoup的使用

    http://caidongrong.blog.163.com/blog/static/21424025220139292525874/

  2. Multi-Targeting and Porting a .NET Library to .NET Core 2.0

    Creating a new .NET Standard Project The first step for moving this library is to create a new .NET ...

  3. Nginx 网络事件

    L27-29 应用层(如浏览器等一系列组成的发送get请求) 传输层 系统内核打开一个端口将客户端IP及端口和服务端IP及端口记录下来一并传输到网络层 网络层 打包后到链路层 再到客户端路由器至广域网

  4. windows 环境下通过运行快速启动程序

    在windows环境下,我们可以使用一些系统内置的快捷键来快速启动我们想要的应用程序,我这里举例几个我经常使用的,比如: 快捷键 功能说明 services.msc  查看系统服务 gpedit.ms ...

  5. Mysql 千万级别数据数据查询

    1.构建数据 --创建MyISAM模式表方便批量跑数据 CREATE TABLE `logs1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `logtype` v ...

  6. bzoj 1483: [HNOI2009]梦幻布丁 (链表启发式合并)

    Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色. 例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input ...

  7. github Permission denied (publickey). fatal: Could not read from remote repository.

    github Permission denied (publickey).fatal: Could not read from remote repository. ----------------- ...

  8. 搭建gogs常见问题

    1.无法连接ssh,显示connection refuse. 原因是“custom/conf/app.ini”没有开启ssh功能,改为以下配置就行了  START_SSH_SERVER = true ...

  9. MT【287】余弦的线性组合

    (2017北大特优)在$\Delta ABC$中,$cos A+\sqrt{2}cos B+\sqrt{2}cos C$的最大值____ 解答 :2$cos A+\sqrt{2}cos B+\sqrt ...

  10. 自学Python4.8-生成器(方式二:生成器表达式)

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...