首页 > 编程语言 >[待更新]欧几里得算法(辗转相除法)与拓展欧几里得算法

[待更新]欧几里得算法(辗转相除法)与拓展欧几里得算法

时间:2024-12-08 13:58:51浏览次数:5  
标签:frac gcd int bmod mid 算法 ax 除法 欧几里得

更新日志 2024/12/08:开工。

欧几里得算法

用途与原理

欧几里得算法,用于求两个数的最大公约数。

其核心原理为:\(\gcd(a,b)=\gcd(b,a\bmod b)\)

证明

首先,我们证明 \(\gcd(a,b)=\gcd(b,a\bmod b)\)。

为了方便证明,这里我们令 \(a>b\)。

\[\because \gcd(a,b)\mid a \text,\gcd(a,b)\mid b\\ \therefore \gcd(a,b)\mid a-\lfloor \frac{a}{b}\rfloor\cdot b\Leftrightarrow \gcd(a,b)\mid a\bmod b\\ \because \gcd(a,b)\mid b,\gcd(a,b)\mid a\bmod b\\ \therefore \gcd(a,b)\mid \gcd(b,a\bmod b) \]

\[\because \gcd(b,a\bmod b)\mid b,\gcd(b,a\bmod b)\mid a\bmod b\\ \therefore\gcd(b,a\bmod b)\mid a\bmod b+\lfloor \frac{a}{b}\rfloor\cdot b\Leftrightarrow \gcd(b,a\bmod b)\mid a\\ \because \gcd(b,a\bmod b)\mid b,\gcd(b,a\bmod b)\mid a\\ \therefore \gcd(b,a\bmod b)\mid \gcd(a,b) \]

\[\because \gcd(a,b)\mid \gcd(b,a\bmod b),\gcd(b,a\bmod b)\mid\gcd(a,b)\\ \therefore \gcd(a,b)=\gcd(b,a\bmod b) \]

证毕。

当 \(b\mid a\)时,显然此时 \(\gcd(a,b)=b\)。

证毕。

实现细节

  1. 实际实现中,我们无需判断 \(a>b\),类似于if(a<b)swap(a,b)的操作是不必要的。
    假如 \(a<b\),那么下一步递归时代入的 \(\gcd(b,a\bmod b)=\gcd(b,a)\),可见没有影响,只多了 \(1\) 的常数。
  2. 更常见的写法是if(!b)return a,当然if(a%b==0)return b也没有问题,不过你也可以看出前者更简洁(实际没有多少),只是会多出 \(1\) 的常数,但通常情况下%都是很慢的,所以前者其实并不比后者劣。

模板

int gcd(int a,int b){return (b?gcd(b,a%b):a);}

如果你不喜欢三目运算符或者压行:

int gcd(int a,int b){
    if(!b)return a;
    return gcd(b,a%b);
}

拓展欧几里得算法

用途

拓展欧几里得算法用来求解形似 \(ax+by=c\) 的线性不定方程。

拓欧常见的利用是求乘法逆元。

原理与证明

首先,我们需要确定上述方程是否有解,根据裴蜀定理,上述方程有解当且仅当 \(\gcd(a,b)\mid c\)。

我们考虑如何借助欧几里得算法求解这个方程。事实上,拓展欧几里得算法是用来求解 \(ax+by=\gcd(a,b)\) 的,但因为 \(\gcd(a,b)\mid c\),所以我们可以以此为跳板求出原方程的解。

思考 \(ax+by=\gcd(a,b)\) 中 \(x,y\) 与 \(bx'+(a\bmod b)y'=\gcd(b,a\bmod b)\) 中 \(x',y'\) 的关系:

\[\because \gcd(a,b)=\gcd(b,a\bmod b)\\ \therefore ax+by=bx'+(a\bmod b)y'\\ \Leftrightarrow ax+by=bx'+(a-\lfloor\frac{a}{b}\rfloor\cdot b)y'\\ \Leftrightarrow ax+by=ay'+b(x'-\lfloor\frac{a}{b}\rfloor\cdot y')\\ \Rightarrow x=y',y=x'-\lfloor\frac{a}{b}\rfloor\cdot y' \]

这样,我们在求 \(\gcd(a,b)\) 的同时,即可求出 \(x,y\)。

考虑边界情况,当 \(b\mid a\) 时,方程式形如:

\[ax+by=b \]

显然此时一组可行解为 \(x=0,y=1\),然后回溯即可。

但并没有结束,我们得到的是 \(ax+by=\gcd(a,b)\) 的解,令之为 \(x',y'\),不难发现原方程的解为:

\[a\frac{c}{\gcd(a,b)}x'+b\frac{c}{\gcd(a,b)}y'=c\\ \therefore x=\frac{c}{\gcd(a,b)}x',y=\frac{c}{\gcd(a,b)}y' \]

实现细节

  1. 考虑到 \(\gcd\) 我们会在 \(b=0\) 时退出(如果不是这种写法请忽略),此时应使 \(x=1,y=0\),这样回溯一步就可以使 \(b|a\) 时 \(ax+by=b\) 的解为 \(x=0,y=1\)。
  2. 上述通过 \(x',y'\) 给 \(x,y\) 赋值的操作有更简洁的写法,可以直接向下传参的时候 \(x'\gets y,y'\gets x\) 且使用引用传参,返回之后 \(y\gets y-\lfloor\frac{a}{b}\rfloor\cdot x\) 即可。

模板

int exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);
    y-=(a/b)*x;
    return d;
}

求乘法逆元

使用 \(\text{exgcd}\) 求乘法逆元的前提是模数与被求的数互质。原因下面会说。

考虑乘法逆元定义:\(ax\equiv 1\pmod p\),其中 \(x\) 即为 \(a\) 逆元。

我们展开原式可得:

\[ax-\lfloor\frac{a}{p}\rfloor p=1\\ \Leftrightarrow ax+py=1 \]

那么就可以用拓欧求解了。根据裴蜀定理,有解的前提是 \(\gcd(a,p)\mid 1\),等同于 \(a,p\) 互质。

最后的 \(x\) 无需除以 \(\text{gcd}\) 然后再乘 \(1\),因为这两个都是 \(1\)。

使用格式大概如下:

int x,y;
exgcd(a,p,x,y);

然后 \(x\) 就是 \(a\) 模 \(p\) 意义下的逆元了。

标签:frac,gcd,int,bmod,mid,算法,ax,除法,欧几里得
From: https://www.cnblogs.com/HarlemBlog/p/18593320

相关文章

  • 【C++算法】33.位运算_判定字符是否唯一
    文章目录题目链接:题目描述:解法C++算法代码:图解题目链接:面试题01.01.判定字符是否唯一题目描述:解法如果使用数据结构的话哈希表:一个一个字符扫描,不在哈希表里面的就放进去,在里面的就返回false。扫描完全部不重复就返回true。也可以优化一下,字母一共26......
  • 【C++算法】34.位运算_丢失的数字
    文章目录题目链接:题目描述:解法C++算法代码:题目链接:268.丢失的数字题目描述:解法哈希表创建一个0~5的数组从前往后遍历一下,有的数字就在表里面标记一下,最后看一下哪些数字没有被标记过。高斯求和先求出应该有的和:(首项+末项)*项数÷2然后减去数组的和......
  • 机器学习(4)Kmeans算法
    1、简述聚类分析的重要性及其在机器学习中的应用  聚类分析,作为机器学习领域中的一种无监督学习方法,在数据探索与知识发现过程中扮演着举足轻重的角色。它能够在没有先验知识或标签信息的情况下,通过挖掘数据中的内在结构和规律,将数据对象自动划分为多个类别或簇。每个簇内的......
  • 算法日记 43-44 day 图论(深搜,广搜)
    直接看题目,还是熟悉写法。题目:孤岛的总面积101.孤岛的总面积(kamacoder.com)题目描述给定一个由1(陆地)和0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。现在......
  • 地平线 bev 参考算法板端一致性验证教程
    01前言由于部署时数据来源的硬件不同以及应用开发的高效性要求,往往会使得在板端部署阶段的数据准备操作与训练时有所差异,导致在同样的输入下,量化模型的输出结果和板端部署模型的输出结果不一致。本文将基于开发者社区中已经发布的地平线bev参考算法板端输入数据准备教程,以be......
  • 【推荐算法】推荐系统中的单目标精排模型
    前言:推荐系统中模型发展较快,初学者【也就是笔者】很难对模型进行一个系统的学习。因此,这篇文章总结了王树森中的视频以及《深度学习推荐系统》中的单目标精排模型,绘制了一个单目标精排模型的思维导图来帮助初学者【笔者】更好的学习。在后面的学习过程中,会加入更多的单目标......
  • 学习王宏志老师《大数据算法》PPT
    哈尔滨工业大学王宏志老师《大数据算法》                                                        ......
  • 最小栈算法
    介绍        最小栈,即具有栈的基本功能,同时可以用O(1)的时间复杂度取出栈中最小值题目链接:155.最小栈-力扣(LeetCode)设计一个支持push,pop,top操作,并能在O(1)时间内检索到最小元素的栈。实现MinStack类:MinStack()初始化堆栈对象。voidpush(intval)......
  • 计算机视觉算法详解
    文章目录计算机视觉算法详解一、引言二、计算机视觉算法核心步骤1、图像获取2、预处理2.1、去噪3、特征提取3.1、边缘提取三、深度学习在计算机视觉中的应用1、卷积神经网络(CNN)四、使用示例五、总结计算机视觉算法详解一、引言计算机视觉作为人工智能领域的......
  • 那些算法中很重要,却总是被你忽略的小技巧,快来看看你和大佬之间的差距吧(位运算)
    1.除法(乘法)转位运算当x的除数(乘数)是2的n次方时,可以转化为x右移(左移)n位x/pow(2,n)==(x>>n)或者x*pow(2,n)==x<<n 因为数据在计算机中通常用2进制表示,位运算通常比乘除效率高的多2.按位与(&)确定资源计算机中通常用一段二进制来确定对应的资源或者空间充裕 例如:在......