算法学习笔记-exgcd

这篇具有很好参考价值的文章主要介绍了算法学习笔记-exgcd。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

\(\operatorname {exgcd}\),顾名思义,是 \(\gcd\) 的一种扩展。\(\gcd\) 是求最大公因数,所用到的是辗转相除法,基于 \(\gcd(a,b)=\gcd(b,a\mod b) (a>b)\) 的原理,在学习 \(\operatorname{exgcd}\) 前,请确保已掌握 \(\gcd\) ,并懂得一点数学归纳法。如果您已掌握这些前置知识,请开始学习。

例题:

先看这样一道题,给定整数 \(a,b\) ,求 \(x,y\) 使得 \(ax+by=1\)

性质:

性质1:

这显然是一道数学题(废话),考虑将原式根据乘法分配律转换为 \(\gcd(a,b)\times (\frac{a}{\gcd(a,b)}x+\frac{b}{\gcd(a,b)}y)=1\)。而如果两个整数乘积为 \(1\),则他们一定为 \(1\),因此 \(\gcd(a,b)=1\) ,换句话说,\(a,b\) 互质。

综上所述,我们得出性质,若原方程有解,当且仅当 \(a,b\) 互质。

性质2:

这个性质就比较简单,它实际上是类似于递归边界的东西,并不需要怎么推导。考虑当 \(a=1,b=0\) ,原方程有一组解为 \(x=1,y=0\)

推导:

先看原式:\(ax+by=1\)
\(m = a\mod b\)\(k=\frac{a}{b}\),则 \(a=bk+m\)。(其实就是余数和商)。
设有一个和原式一样的方程 \(x'm+y'b=1\)

根据 \(m\) 的定义,转换为 \(x'(a-kb)+y'b=1\)

将式子打开,变为 \(x'a-x'kb+y'b=1\)

合并同类项,变为 \(x'a-(y'-kx')b=1\)

可以发现一个神奇的事情,转化后的方程与原方程本质是一样的!唯一变化的只有 \(x\)\(y\) 的值。也就是说,若 \(x'(a \mod b)+y'b=1\) 有解,那么 \(ax+by=1\) 也一定有解。而且这个解就是 \(x=x'\), \(y=y'-kx'\)(将所推方程代入)。而根据 \(\gcd\) 的写法,两个互质的数到递归边界时一定是 \(a=1,b=0\)。因为 \(a=1,b=0\) 的情况是有解的,所以 \(\gcd(a,b)=1\) 也是有解的,这也进一步证明了上面的性质。

如果你到这里都听懂了,那么下面的问题就很简单了,只需将 \(x,y\) 代入下面推出来的式子即可。

结论:

通过以上推导,可以得出:

  1. 原方程有解当且仅当 \(gcd(a,b)==1\)
  2. 原方程解为 \( \begin{cases} x=1,y=0 & a=1,b=0 \\ x=x',y=y'-kx (x'a \mod b +y'b = 1, k = \frac{a}{b}) & otherwise \\ \end{cases} \)

实现:

\(\operatorname{exgcd}\) 模版见下(递归):

点击查看代码
void exgcd(int a, int b, int &x, int &y)
{
	if(a == 1 && b == 0)//边界 
	{
		x = 1, y = 0;
		return ;
	}
	exgcd(b, a % b, y, x);
	//这里之所以要交换x和y的位置,是因为b与a%b交换了,根据公式要把x,y也换过去 
	y = a / b * x;//按照公式赋值,由于是引用,所以x的值已经更改了。 
}

总结:

第一次学 \(\operatorname{exgcd}\) 时,刚开始看到结论十分蒙,等到搞清楚证明时觉得这个证明妙不可言。笔者认为,学习 \(\operatorname{exgcd}\) 应不仅只会背代码,更要明白证明的过程,最好自己手推一遍。因为证明不仅是解决之后的许多与 \(\operatorname{exgcd}\) 的题有关,更能扩展思维,对数论有很大帮助。

鉴于笔者也是蒟蒻,文中给出的部分推导过程与表述可能不严谨,欢迎大佬在评论区指出。
同时如果您对文章内容有不理解的地方,欢迎随时提问。文章来源地址https://www.toymoban.com/news/detail-648958.html

到了这里,关于算法学习笔记-exgcd的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 课程学习前言

    app 抓包分析可以看到有签名有加固,毕竟需要 APK 去访问服务、获取数据,都需要 APK 有完整的信息,而这些信息、代码经过各种加密,还是放在 APK 里面。说白了,就是门锁紧了,钥匙藏在门口某个地方,也许就是地垫下面 逆向流程 拿到 App 应用的 apk ; 使用工具进行查壳

    2024年02月06日
    浏览(45)
  • Gowin FPGA学习记录——前言

            好久没有写博客了,想想是不是又该写点啥东西了么,准备写点国产FPGA的使用经历吧                  得益于目前国内的政策对国产化芯片扶持,越来越要求核心器件能够自主可控,因此作为核心芯片FPGA,国产FPGA的势头也发展很快。          现在FPGA的这

    2024年02月16日
    浏览(43)
  • 【自制C++深度学习框架】前言

    此GitHub项目是一个初学者的深度学习框架,使用C++编写,旨在为用户提供一种简单、易于理解的深度学习实现方式。以下是本项目的主要特点和功能: 计算图:使用计算图来描述深度学习模型的计算过程,利用计算图将神经网络的计算过程视为一个有向无环图。通过构建计算

    2024年02月07日
    浏览(43)
  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(58)
  • 大数据、人工智能、机器学习、深度学习关系联系前言

    1.大数据和人工智能关系 2.机器学习、深度学习、人工智能关系 3.监督学习、无监督学习、半监督学习、强化学习、迁移学习关系 4.机器学习具体内容 1.数据驱动的人工智能 :人工智能系统需要大量的数据来进行训练和学习。大数据提供了海量的信息,可以用于训练机器学习

    2024年02月12日
    浏览(62)
  • 【C++初阶(一)】学习前言以及命名空间

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习排序知识   🔝🔝 对于复杂的问题,规模较大的程序 需要高度的抽象和建模时 C语言不再适合应用于这种场景 于是在1982年 C++创始人 Bjarne Stroustrup 在C语言

    2024年02月11日
    浏览(53)
  • 【C++初阶(一)】学习前言 命名空间与IO流

    本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C++ 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 C++是基于C语言而产生的,它既可以进行C语言的

    2024年02月08日
    浏览(97)
  • Linux tcp/ip 网路协议栈学习-00 前言

    Linux tcp/ip 网路协议栈学习-00 前言 目录 Linux  tcp/ip 网路协议栈学习-00 前言 (1)预备知识  (2)前置知识 (3)学习目标 (4)总结     (1)预备知识  好工具事半功倍,做任何事情都需要有方法和工具,同样,阅读 Linux 内核源码也是如此。由于当前内核源码非常庞大,学习上,不能一

    2024年04月26日
    浏览(45)
  • 初等数论——素数,逆元,EXGCD有关

    设整数 (pne 0,pm 1) 。如果 (p) 除了平凡约数以外没有其他约数,那么称 (p) 为素数(不可约数)。 若整数 (ane 0,pm 1) 且 (a) 不是素数,则称 (a) 为合数。 ——————OI Wiki 如何判断一个数 (x) 是不是质数? 很显然我们可以暴力的枚举 (1) 到 (sqrt{x}) 来看是否整除

    2024年02月05日
    浏览(35)
  • 【C++初阶】前言——C++的发展简述及学习方法分享

     ========================================================================= 主页点击直达: 个人主页 我的小仓库: 代码仓库 C语言偷着笑: C语言专栏 数据结构挨打小记: 初阶数据结构专栏 Linux被操作记: Linux专栏 LeetCode刷题掉发记: LeetCode刷题 算法: 算法专栏  C++头疼记: C++专栏 ====

    2024年02月08日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包