前言

扩展欧几里得算法是一个很好的解决同余问题的算法,非常实用。

欧几里得算法

简介

欧几里得算法,又称辗转相除法。

主要用途

求最大公因数\(gcd\)。

公式

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

公式证明

\(a\)可以表示成\(a=kb+a\%b\)(\(k\)为自然数)。

假设\(g\)是\(a,b\)的一个公约数,则有\(g|a, g|b\)。

\(\because a\%b=a-kb\),

\(\therefore g|(a\%b),\therefore g\)是\(b,a\%b\)的公约数。

综上所述,\(a,b\)和\(b,a\%b\)的公约数是一样的,其\(gcd\)也必然相等。

代码实现

inline int gcd(int x,int y) {return y?gcd(y,x%y):x;}

扩展欧几里得算法

简介

扩展欧几里得建立于欧几里得算法的基础上。(该算法的升级版 徐xgcd有待XuRuiYang奆佬发明)

主要用途

对于已知a,b求解x,y使其满足ax+by=gcd(a,b)。

解法

我们可以对\((a,b)\)不断辗转相除。

根据欧几里得算法,最后剩下的两个数一定为\((gcd(a,b),0)\),

显然,此时\(x=1,y=0\)是原式的一组解。

现在,我们需要考虑,若已知\((b,a\%b)\)的解,如何推出\((a,b)\)的解。

设\(x_0,y_0\)为\((b,a\%b)\)的一组解,则\(x_0·b+y_0(a\%b)=gcd(b,a\%b)\)。

将这个式子转化一下,可以得到\(x_0·b+y_0(a-\lfloor\frac ab\rfloor*b)=gcd(a,b)\)。

去括号,得\(x_0·b+y_0·a-(y_0·\lfloor\frac ab\rfloor)·b=gcd(a,b)\)。

合并同类项,得\(y_0·a+(x_0-y_0·\lfloor\frac ab\rfloor)·b=gcd(a,b)\)。

\(\therefore x=y_0,y=x_0-y_0·\lfloor\frac ab\rfloor\)是原式的一组解。

递归即可。

代码实现

inline int exgcd(int x,int y,int &s1,int &s2)
{
if(!y) return s1=1,s2=0,x;
register int res=exgcd(y,x%y,s2,s1);
return s2-=x/y*s1,res;
}

扩欧的典型应用:求乘法逆元

关于乘法逆元可以看看这篇博客:浅谈乘法逆元的三种解法

同余问题(一)——扩展欧几里得exgcd的更多相关文章

  1. 扩展欧几里得(exgcd)与同余详解

    exgcd入门以及同余基础 gcd,欧几里得的智慧结晶,信息竞赛的重要算法,数论的...(编不下去了 讲exgcd之前,我们先普及一下同余的性质: 若,那么 若,,且p1,p2互质, 有了这三个式子, ...

  2. 浅谈扩展欧几里得[exgcd] By cellur925

    关于扩展欧几里得从寒假时就很迷,抄题解过了同余方程,但是原理并不理解. 今天终于把坑填上了qwq. 由于本人太菜,不会用markdown,所以这篇总结是手写的(什么).(字丑不要嫌弃嘛) ****** ...

  3. 扩展欧几里得(exgcd)-求解不定方程/求逆元

    贝祖定理:即如果a.b是整数,那么一定存在整数x.y使得ax+by=gcd(a,b).换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍.(可以来判断一个这样的式子有没有解)有一个 ...

  4. 扩展欧几里得 exGCD

    Elementary Number Theory - Extended Euclid Algorithm Time Limit : 1 sec, Memory Limit : 65536 KB Jap ...

  5. 数论--扩展欧几里得exgcd

    算法思想 我们想求得一组\(x,y\)使得 \(ax+by = \gcd(a,b)\) 根据 \(\gcd(a,b) = \gcd(b,a\bmod b)\) 如果我们现在有\(x',y'\) 使得 ...

  6. 【数学】【NOIp2012】同余方程 题解 以及 关于扩展欧几里得与同余方程

    什么是GCD? GCD是最大公约数的简称(当然理解为我们伟大的党也未尝不可).在开头,我们先下几个定义: ①a|b表示a能整除b(a是b的约数) ②a mod b表示a-[a/b]b([a/b]在Pa ...

  7. poj1061-青蛙的约会-(贝祖定理+扩展欧几里得定理+同余定理)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:132162   Accepted: 29199 Descripti ...

  8. poj 2891 扩展欧几里得迭代解同余方程组

    Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...

  9. Acwing-203-同余方程(扩展欧几里得)

    链接: https://www.acwing.com/problem/content/205/ 题意: 求关于x的同余方程 ax ≡ 1(mod b) 的最小正整数解. 思路: 首先:扩展欧几里得推导 ...

随机推荐

  1. Eclipse中Android公共库的正确建立及调用方法(转)

    转自http://www.cnblogs.com/SkyD/archive/2011/09/01/2161502.html 引言 之前一直头痛于没有办法在多个程序中共享资源,用作公共类库的方法也是使用 ...

  2. 项目经验:Glyphicons字体图标改造,制造适合自己项目的字体图标

    Bootstrap对我们来说已经不陌生了,大型的项目一定会用到它.它的DOM结构,字体图标,组件,响应式布局等,很大程度上提高了WEB开发速度. 在bootstrap刚出来的时候,它拥有丰富的组件.美 ...

  3. python基本数据类型练习

    一.元素分类# 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中.# 即 ...

  4. linux环境下jdk部署配置

    1.java官网下载相关的jdk包 2.配置系统环境变量,编辑/etc/profile文件,在文件的末尾添加一下信息: export JAVA_HOME=/usr/jdk1.8.0_101export ...

  5. ORACLE数据库的备份和还原。

    Oracle数据库备份与还原命令 数据导出: 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中 exp system/manager@TEST ...

  6. LeetCode 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence.Fo ...

  7. Storm概念学习系列之storm出现的背景

      不多说,直接上干货! storm出现的背景 互联网从诞生的第一时间起,对世界的最大改变就是让信息能够实时交互,从而大大加速了各个环节的效率.正因为大家有对信息实时响应.实时交互的需求,所以软件行业 ...

  8. Swift网络库Alamofire的导入

    一.手动导入 1, 官网下载 Alamofire 2, 解压下载的文件 放入工程的顶层目录下 3, 打开工程 Add Files 4, 选中项目 TARGETS > General > E ...

  9. C 碎片五 数组

    构造类型数据是有基本类型数据按照一定规则组成的.数组,结构体,共用体都属于构造类型的数据.数组是有序数据的集合,C语言数组中的每一个元素都属于同一个数据类型,用数组名和下标来唯一确定数组中的元素. 一 ...

  10. easyUI 实现异步tree

    html: <ul id="relInfoTree" class="easyui-tree"></ul> js: $(document) ...