首页 > 编程语言 >欧几里得算法 & 扩展欧几里得算法

欧几里得算法 & 扩展欧几里得算法

时间:2024-12-07 18:59:23浏览次数:3  
标签:frac gcd 欧几里得 扩展 times 算法 ax div

一、欧几里得算法
  欧几里得算法,也叫辗转相除,简称 gcd,用于计算两个整数的最大公约数
  引理:\(\gcd(a,b)=\gcd(b,a\%b)\)
  证明
    设 \(r=a%b\) , \(c=gcd(a,b)\)
    则 \(a=xc\) , \(b=yc\) , 其中 \(x , y\) 互质
    \(r=a\%b=a-pb=xc-pyc=(x-py)c\)
    而 \(b=yc\)
    假设 \(y\) 与 \(x-py\) 不互质:
    设 \(y=nk\) , \(x-py=mk\) , 且 \(k>1\) (互质)
    将 \(y\) 带入可得
    \(x-pnk=mk\)
    \(x=(pn+m)k\)
    则 \(a=xc=(pn+m)kc\) , \(b=yc=nkc\)
    那么此时 \(\gcd(a,b)=kc\ne k\),矛盾!
    所以 \(y\) 与 \(x-py\) 互质,\(\gcd(r,b)=c\)
    即 \(\gcd(b,r)=c=\gcd(a,b)\)
    得证!

  当 \(a\%b=0\) 时, \(\gcd(a,b)=b\)

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

二、扩展欧几里得算法
  扩展欧几里得算法,简称 exgcd,一般用来求解不定方程,求解线性同余方程,求解模的逆元等
  引理:存在 \(x\) , \(y\) 使得 \(\gcd(a,b)=ax+by\)
  证明
    当 \(b=0\) 时,\(\gcd(a,b)=a\),此时 \(x=1 , y=0\)
    当 \(b\ne0\) 时,
    设 \(ax_1+by_1=\gcd(a,b)=\gcd(b,a\%b)=bx_2+(a\%b)y_2\)
    又因 \(a\%b=a-\frac{a}{b}\times b\)
    则 \(ax_1+by_1=bx_2+(a-\frac{a}{b}\times b)y_2\)
    \(ax_1+by_1=bx_2+ay_2-\frac{a}{b}\times by_2\)
    \(ax_1+by_1=ay_2+bx_2-b\times \frac{a}{b}\times y_2\)
    \(ax_1+by_1=ay_2+b(x_2-\frac{a}{b}\times y_2)\)
    解得 \(x_1=y_2\) , \(y_1=x_2-\frac{a}{b}\times y_2\)
    因为当 \(b=0\) 时存在 \(x\) , \(y\) 为最后一组解
    而每一组的解可根据后一组得到
    所以第一组的解 \(x\) , \(y\) 必然存在
    得证!

  根据上面的证明,在实现的时候采用递归做法
  先递归进入下一层,等到到达最后一层即 b=0 时就返回x=1 , y=0
  再根据 \(x=y’\) , \(y=x’-\frac{a}{b}\div y’\)(\(x’\) 与 \(y’\) 为下一层的 \(x\) 与 \(y\))得到当层的解
  不断算出当层的解并返回,最终返回至第一层,得到原解

void exgcd(int a,int b)
{
    if(b)
    {
        exgcd(b,a%b);
        int k=x;
        x=y;
        y=k-a/b*y;
    }
    else y=(x=1)-1;
}
  • 应用一:exgcd 解不定方程(使用不将 \(a\) 与 \(b\) 转为互质的方法)
      对于 \(ax+by=c\) 的不定方程,设 \(r=gcd(a,b)\)
      当 \(c\%r \ne 0\) 时无整数解
      当 \(c\%r=0\) 时,将方程右边 \(\times r\div c\) 后转换为 \(ax+by=r\) 的形式
      可以根据扩展欧几里得算法求得一组整数解 \(x_0\) , \(y_0\)
      而这只是转换后的方程的解,原方程的一组解应再 \(\times c\div r\) 转变回去
      则原方程解为 \(x_1=x_0\times c\div r\) , \(y_1=y_0\times c\div r\)
      通解 \(x=x_1+b\times r\div t\) , \(y=y_1-a\times r\div t\) ,其中 \(t\) 为整数

  • 应用二:exgcd 解线性同余方程
      关于 \(x\) 的模方程 \(ax\%b=c\) 的解
      方程转换为 \(ax+by=c\) 其中 \(y\) 一般为非正整数
      则问题变为用 exgcd 解不定方程
      解得 \(x_1=x_0\times c\div r\)
      通解为 \(x=x_1+b\div r\times t\)
      设 \(s=\frac{b}{r}\) (已证明 \(\frac{b}{r}\) 为通解的最小间隔)
      则 \(x\) 的最小正整数解为 \((x_1\%s+s)\%s\)

标签:frac,gcd,欧几里得,扩展,times,算法,ax,div
From: https://www.cnblogs.com/cxy-xlf-1003/p/18592532

相关文章

  • 堆栈实验--KMP算法
     求next数组的思想:最长公共前后缀什么是字符串前后缀呢,比如一个字符串aba,a可以是前缀,ab也可以是,但aba不是(也有资料说是但在kmp我们不认为),同样的,a(最后的a)是后缀,ba也是。求next数组,以ababa为例,若字符数组以0开始,第一位我们默认为-1,即a b a b a-1求第二位,则......
  • 编写一个冒泡算法,对10个整数进行排序
    #include<iostream>//冒泡排序函数voidbubbleSort(intarr[],intn){for(inti=0;i<n-1;++i){for(intj=0;j<n-1-i;++j){if(arr[j]>arr[j+1]){//交换相邻元素inttemp......
  • 【前端知识】简单,可扩展的状态管理组件MobX
    文章目录概念MobX区分了应用程序中的以下三个概念:1.定义State并使其可观察2.使用Action更新State3.创建Derivations以便自动对State变化进行响应Derivations包括许多方式:Mobx区分了两种Derivation:3.1.通过computed对派生值进行建模3.2.使用reacti......
  • [深入探索FireStore Datastore模式:自动扩展与高性能的结合体]
    #引言在现代应用开发中,数据存储是不可或缺的一环。GoogleFirestore以其强大的扩展性与性能,为开发者提供了一种高效的数据存储解决方案。在这篇文章中,我们将深入探讨Firestore的Datastore模式,并学习如何使用它来保存、加载和删除Langchain文档。同时,我们还将探讨一些常见......
  • 栈和队列的应用 ——球钟算法
    栈和队列的应用——球钟算法1.球钟背景球钟是一个利用球的移动来记录时间的简单装置它有三个可以容纳若干个球的指示器:分钟指示器,五分钟指示器,小时指示器若分钟指示器中有两个球,五分钟指示器有六个球,小时指示器有五个球,那就代表时间是5:322.工作原理每过一分钟球钟就......
  • [学习笔记 #8] Manacher 算法
    目录[学习笔记#8]Manacher算法[学习笔记#8]Manacher算法至今都不会exKMP/dk/dk/dk[]里的是我还不确定的。Manacher是对序列上每个点求它作为[回文中心]的最长回文子串长度/端点的算法,时间复杂度是\(O(|S|)\)。具体地,从左往右加入每个点,记录当前字符串的回......
  • 【C++算法】31.前缀和_连续数组
    文章目录题目链接:题目描述:解法C++算法代码:图解题目链接:525.连续数组题目描述:解法前缀和思想:如果把0变成-1,那么就是在区间内找一个最长的子数组,使得子数组中所有元素的和为0前面做过一个前缀和为k的子数组,这里就是转化为和为0。前缀和+哈希表哈希表里......
  • 【C++算法】32.前缀和_矩阵区域和
    文章目录题目链接:题目描述:解法C++算法代码:题目链接:1314.矩阵区域和题目描述:解法防止有人看不明白题目,先解释一下题目二维前缀和思想:使用前缀和矩阵ret=[x1,y1]~[x2,y2]=D=(A+B+C+D)-(A+B)-(A+C)+A=dp[x2,y2]-dp[x1-1,y2]-dp[x2,y1-1]+dp[x......
  • 基于机器学习算法的糖尿病风险预测可视化分析
    背景:根据世界卫生组织的数据,全球糖尿病发病率逐年上升。在中国,糖尿病的发病率也呈上升趋势,对人们的生活质量造成严重影响。机器学习算法在糖尿病风险预测方面具有巨大潜力。目的:通过机器学习算法分析糖尿病患者的特征,预测糖尿病风险,并进行可视化分析。内容:数据收集:收集......
  • 深入解析图神经网络:Graph Transformer的算法基础与工程实践
    GraphTransformer是一种将Transformer架构应用于图结构数据的特殊神经网络模型。该模型通过融合图神经网络(GNNs)的基本原理与Transformer的自注意力机制,实现了对图中节点间关系信息的处理与长程依赖关系的有效捕获。GraphTransformer的技术优势在处理图结构数据任务时,Graph......