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

扩展欧几里得算法

时间:2023-09-06 09:00:41浏览次数:43  
标签:gcd int 欧几里得 扩展 cfrac 算法 y1 ax aligned

扩展欧几里得算法

问题引入

求 \(ax+by=\gcd(a,b)\) 的一组整数解。

前置知识

欧几里得算法

当 \(a, b\) 为非负整数时,以下等式一定成立。

\[\gcd (a, b) = \gcd (b, a \bmod b) \]

裴蜀定理

对于任意非负整数 \(a, b\) ,一定存在满足的整数对 \((x, y)\) ,使得以下等式成立。

\[ax+by=\gcd(a,b) \]

问题求解

当 \(b=0\) 时,则有 \(ax = a\) ,因而此时有一组解,为 \(x=1,y=0\) 。

当 \(b \neq 0\) 时,由欧几里得算法,可得以下等式。

\[\gcd(a, b) = \gcd(b, a \bmod b) \]

由裴蜀定理,得以下两个等式。

\[\begin{aligned} \gcd(a, b) &= a x + b y \\ \gcd(b, a \bmod b) &= b x_0 + (a \bmod b) y_0 \\ &= b x_0 + (a - \lfloor \cfrac{a}{b} \rfloor b) y_0 \\ &= a y_0 + b(x_0 - \lfloor \cfrac{a}{b} \rfloor y_0) \end{aligned} \]

因为两个等式等价,因此可知 \(x = y_0, y = x_0 - \lfloor \cfrac{a}{b} \rfloor b y_0\) 。

递归算法,最后可以先求得一组特解 \((x', y')\) ,由特解构造通解,得以下式子。

对两个未知数一个加一个数,另一个减去一个数,让这个数达到最小就行。

\[\left\{ \begin{aligned} x &= x' + \cfrac{a}{\gcd(a,b)} * k \\ y &= y’ - \cfrac{a}{\gcd(a,b)} * k \end{aligned} \right. \]

扩展欧几里得算法

扩展欧几里得算法的过程,在上述的问题求解当中,其作用为:求解方程 \(ax + by = \gcd(a, b)\) 的一组特解 \((x_0, y_0)\) 。

具体的实现方式如下。

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

array<int,3> exgcd(int a, int b) {
    if (b == 0) {
        return {a, 1, 0};
    } else {
        auto [g, x1, y1] = exgcd(b, a % b);
        return {g, y1, x1 - a / b * y1};
    }
}
def exgcd(a : int, b : int):
    if b == 0:
        return a, 1, 0
    g, x1, y1 = exgcd(b, a % b)
    return g, y1, x1 - a // b * y1

不定方程

问题引入

求解 \(ax + by = c\) 的一组整数解。

问题分析

由裴蜀定理可知,对不定方程 \(ax_0 + by_0 = \gcd(a, b)\),一定有整数解。当 \(\gcd(a, b) \mid c\) 时,一定存在整数解,否则无整数解。因此,我们可以先构建出两个式子。

\[\begin{aligned} ax + by &= c \\ ax_0 + by_0 &= \gcd(a, b) \end{aligned} \]

可以发现,两个式子之间只差了 \(\cfrac{c}{\gcd(a, b)}\) 倍。因此,我们可以先使用扩展欧几里得算法求解 \(ax + by = \gcd(a, b)\) ,再对求出来的解乘上倍数 \(\cfrac{c}{\gcd(a, b)}\) ,我们就得到了方程的一组特解 \((x_0, y_0)\) 。

对于该不定方程,通解的构造也是一样的思路。

\[\left\{ \begin{aligned} x &= x' + \cfrac{a}{\gcd(a,b)} * k \\ y &= y’ - \cfrac{a}{\gcd(a,b)} * k \end{aligned} \right. \]

同余方程

问题引入

给定整数 \(a, b, m\) ,求解同余方程 \(ax \equiv b \pmod m\) 。

如果方程存在整数解,输出任意一个。

问题求解

同余方程可以转化为不定方程的形式。

我们将同余式转化为等式时,可以引入一个新的未知量。

由 \(ax \equiv b \pmod m\) ,可得 \(ax = m(-y) + b\) ,即 \(ax + my = b\) 。

我们只需要使用求解不定方程的方式求解该等式即可。

标签:gcd,int,欧几里得,扩展,cfrac,算法,y1,ax,aligned
From: https://www.cnblogs.com/FlandreScarlet/p/17681368.html

相关文章

  • 算法衡量优劣之时间复杂度
     选型我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,那么有多少个基本操作就代表会花费多少时间单位,由此可以忽略机器环境的影响而客观的反应算法的时间效率代码执行总时间(T)=操作步骤数量*操作步骤执行时间 算法时间复杂度是用来描述算法在......
  • 代码随想录算法训练营第十四天|二叉树的递归法、迭代法
    二叉树的递归遍历(前中后序遍历-递归法与迭代法)递归三部曲:确定递归函数的参数和返回值确定终止条件确定单层递归的逻辑递归法对二叉树进行前中后序遍历(力扣144.145.94.)//前序遍历·递归·LC144_二叉树的前序遍历classSolution{publicList<Integer>preorderTra......
  • Java实现常见排序算法
    Java实现常见排序算法排序也称排序算法(SortAlgorithm),排序是将一组数据,依指定的顺序进行排列的过程。排序的分类:内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。常见的排序算法分......
  • 2023你需要使用的最佳VSCode扩展
    VisualStudioCode(VSCode)是一款广受欢迎的多功能代码编辑器,在最新的StackOverflow开发者调查中,近75%的开发者将其选为首选集成开发环境。VSCode提供了一系列开箱即用的特性和功能,但其真正的威力在于市场上庞大的扩展生态系统。整理了VSCode30大扩展列表,希望大家能使用这些......
  • 找质数(图算法)、交错字符串(字符串、动态规划)、有效数字(字符串)
    找质数(图算法)找出大于200的最小的质数解答:importjava.util.*;importjava.lang.*;importjava.io.*;classIdeone{publicstaticvoidmain(String[]args)throwsjava.lang.Exception{intn=201;while(true){booleanb=tru......
  • 国内镜像安装Python解释器及扩展包
    一、下载Python解释器1、下载地址官网(下载速度很慢):WelcometoPython.org淘宝镜像(推荐):CNPMBinariesMirror(npmmirror.com)2、下载方法前往淘宝镜像站,选择版本,这里以Python3.10.10为例。如果是64位的系统,点击python-3.10.10-amd64.exe,等待下载完成。3、安装Python解释......
  • 梯度上升算法
    用梯度上升算法进行Logistic回归$w=w+\nabla{f(w)}$对应代码如下importmatplotlib.pyplotaspltimportnumpyasnpfromsklearn.datasetsimportmake_classificationdata_1,labels=make_classification(n_samples=400,n_features=2,n_informative=2,n_redundant=0,n_......
  • 随机森林算法如何用代码实现
    随机森林是一种集成学习算法,通过组合多个决策树来进行分类和回归任务,从而提高预测的稳定性和准确性。以下是使用Python中的sklearn库实现随机森林算法的基本示例:fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.ensemb......
  • 深度神经网络中基于卷积操作的自适应学习算法研究
    本文提出了一种基于卷积操作的自适应学习算法,用于深度神经网络中。该算法通过引入复杂的数学公式和高阶张量操作,实现了对复杂模式的准确建模和学习。我们通过对网络架构的改进和参数的优化,提高了模型的泛化能力和性能表现。实验结果表明,我们的算法在多个基准数据集上取得了优于现有......
  • 遗传算法
     遗传算法(GeneticAlgorithm)是一种基于自然选择原理和自然遗传机制的启发式搜索算法。该算法通过模拟自然界中生物遗传进化的自然机制(选择、交叉和变异操作),将好的遗传基因(最优目标)不断遗传给子代,使得后代产生最优解的概率增加示例代码如下:#导入所需的库importrandomimportmat......