首页 > 编程语言 >拓展欧几里得算法揭秘

拓展欧几里得算法揭秘

时间:2023-09-22 22:24:53浏览次数:35  
标签:right gcd bmod 欧几里得 lc 算法 array 揭秘 left

最大公约数

更相减损术:\(\gcd(x,y)=\gcd(y-x,x)(x\leq y)\)。

设 \(\gcd(x,y)=k,\gcd(p,q)=1,x=kp,y=kq\)。

那么 \(\gcd(y-x,x)=\gcd(kq-kp,kp)=k\times\gcd(q-p,p)\)。

设 \(\gcd(q-p,p)=r,q-p=rb,p=ra\)。

那么 \(q=r(a+b)\)。

因为 \(\gcd(p,q)=1=\gcd(ra,r(a+b))\)。

所以 \(r=\gcd(a,a+b)=1,\gcd(y-x,x)=k=\gcd(x,y)\)。


辗转相除法(欧几里得算法):\(\gcd(x,y)=\gcd(y\bmod x,x)(x\leq y)\)。

取模相当于做多次减法,其实就是更相减损术的优化。

最小公倍数

容斥,两数之积除以两数的最大公约数。

有一个小技巧,若数以质因数分解的形式给出,算最大公约数时系数取 \(\min\),算最小公倍数时系数取 \(\max\)。

拓展欧几里得算法

有不定方程 \(ax+by=\gcd(a,b)\),求出任意一组整数解(根据裴蜀定理一定有整数解)。

假设我们当前已经得出了方程

\[b\bmod a\times x+ay=\gcd(b\bmod a,a) \]

的一组整数解 \(\left\{\begin{array}{lc}x=p\\y=q\end{array}\right.\),根据 \(\gcd\) 的性质有

\[b\bmod a\times p+aq=\gcd(a,b) \]

将取模拆掉

\[\left(b-\left\lfloor\frac{b}{a}\right\rfloor a\right)p+aq=\gcd(a,b) \]

整理成最初的形式

\[a\left(q-\left\lfloor\frac{b}{a}\right\rfloor p\right)+bp=\gcd(a,b) \]

那么 \(\left\{\begin{array}{lc}x=q-\left\lfloor\frac{b}{a}\right\rfloor p\\y=p\end{array}\right.\) 就是方程 \(ax+by=\gcd(a,b)\) 的一组整数解。

所以在求解 \(ax+by=\gcd(a,b)\) 时我们可以先递归求解 \(b\bmod a\times x+ay=\gcd(b\bmod a,a)\) 然后计算当前的解。

这个递归的终止条件是 \(a=0\),此时 \(\left\{\begin{array}{lc}x=0\\y=1\end{array}\right.\) 是一组解,返回即可(虽然 \(x\) 取什么都没有关系但我们想让解的绝对值尽量小)。


考虑归纳求出解的范围。假设递归得到 \(\left\{\begin{array}{lc}-b\bmod a\leq y'\leq b\bmod a\\-a\leq x'\leq a\end{array}\right.\),现在 \(\left\{\begin{array}{lc}x=y'-\left\lfloor\frac{b}{a}\right\rfloor x'\\y=x'\end{array}\right.\)。

取 \(\left\{\begin{array}{lc}y'=b\bmod a\\x'=-a\end{array}\right.\) 有 \(\left\{\begin{array}{lc}x\leq b\bmod a+\left\lfloor\frac{b-b\bmod a}{a}\right\rfloor a\leq b\\y\geq-a\end{array}\right.\)。

取 \(\left\{\begin{array}{lc}y'=-b\bmod a\\x'=a\end{array}\right.\) 有 \(\left\{\begin{array}{lc}x\geq-b\bmod a-\left\lfloor\frac{b-b\bmod a}{a}\right\rfloor a\geq-b\\y\leq a\end{array}\right.\)。

所以拓欧求出的 \(ax+by=\gcd(a,b)\) 的解满足 \(\left\{\begin{array}{lc}x\in[-b,b]\\y\in[-a,a]\end{array}\right.\),终止边界同样满足。

标签:right,gcd,bmod,欧几里得,lc,算法,array,揭秘,left
From: https://www.cnblogs.com/landsol/p/17723506.html

相关文章

  • 算法训练day16 LeetCod 104
    算法训练day16LeetCod104.111.222104.二叉树的最大深度题目104.二叉树的最大深度-力扣(LeetCode)题解代码随想录(programmercarl.com)递归采用后序的遍历顺序,在根节点处做高度数据的处理classSolution{public:intgetdepth(TreeNode*node){......
  • 算法打卡|Day2 数组part02
    Day2数组part02今日任务:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II目录Day2数组part02今日任务:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵IIProblem:977.有序数组的平方思路解题方法复杂度CodeProblem:209.长度最小的子数组思路解题方法复杂......
  • Aho-Corasick 算法 AC自动机实现
    敏感词过滤在社区发帖、网站检索、短信发送等场景下是很常见的需求,尤其是在高并发场景下如何实现敏感词过滤,都对过滤算法提出了更高的性能要求,Ahocorasick算法能够实现毫秒级的万字过滤匹配,能够很好的满足各种场景下的敏感词过滤需求。Aho-Corasick算法通过将模式串预处理为确定......
  • 【Python】递归算法
    定义递归是一种解决问题的有效方法,在递归过程中,函数将自身作为子例程调用。思想函数调用函数本身,直到不能调用为止注意事项基本情况用于保证程序调用及时返回,不在继续递归,保证了程序可终止。递推关系,可将所有其他情况拆分到基本案例。​递推关系​:一个问题的结......
  • 常用的校验算法
     CRC校验码publicstaticstringCRCCheck(stringval){val=val.TrimEnd('');string[]spva=val.Split('');byte[]bufData=newbyte[spva.Length+2];bufData=ToBytes......
  • 【算法题】将十二位之内的数字转为汉字输出
    //单位,末尾个省略constcharUnitArr=['千','百','十','亿','千','百','十','万','千','百','十',''];//数字0-9的汉字写法constchartN......
  • TCP连接的关键之谜:揭秘三次握手的必要性
    TCP连接建立当我们浏览网页、发送电子邮件或者进行在线游戏时,我们常常不会想到背后复杂的网络连接过程。然而,正是这些看似不起眼的步骤,确保了我们与服务器之间的稳定通信。其中最重要的步骤之一就是TCP连接的建立,而其中的核心环节就是三次握手。本文将详细探讨三次握手的原理、......
  • [算法学习笔记] 浅谈二路归并&双指针&归并排序
    二路归并·双指针是一种优化思想。它可以在\(O(n)\)的复杂度下把两个长度为\(n\)的有序数组合并为一个有序数组。它的具体处理方法如下:定义两个长度为\(n\)的升序数组\(a,b\)。,合并完后长度为\(2n\)的数组\(c\),初始化两个指针\(x=y=1\)(这里数组下标从\(1\)开始)......
  • 基本差分算法:一维差分、二维差分
    1、一维差分首先要知道,差分是前缀和的逆运算,a1a2……an前缀和b1b2……bn差分以AcWing.797为例,题目要求如下:输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l,r,c,表示将序列中[l,r]之间的每个数加上c。请你输出进行完所有操作后的序......
  • 基本前缀和算法:一维前缀和、二维前缀和、子矩阵和
    1、一维前缀和以AcWing.795为例,题目要求如下:输入一个长度为N的整数序列。接下来再输入m个询问,每个询问输入一对l,r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数l和r,表示一......