首页 > 编程语言 >【算法】裴蜀定理

【算法】裴蜀定理

时间:2023-11-24 14:45:30浏览次数:36  
标签:gcd int 定理 最大公约数 算法 ax aligned 裴蜀

裴蜀定理

在数论中,裴蜀等式(英语:Bézout's identity)或裴蜀定理(Bézout's lemma)(或称贝祖等式)是一个关于最大公约数(或最大公约式)的定理。裴蜀定理得名于法国数学家艾蒂安·裴蜀,说明了对任何整数 \(a\) 和 \(b\) 和 \(m\),关于未知数 \(x\) 和 \(y\) 的线性丢番图方程(称为裴蜀定理) \(ax + by = m\) 有整数解时当且仅当 \(m\) 是 \(a\) 和 \(b\) 的最大公约数 \(d\) 的倍数。裴蜀等式有解时必然有无穷多个整数解,每组解 \(x\) 、 \(y\) 都称为裴蜀数,可用扩展欧几里得算法求得。[1]
特别的,当 \(a\) 和 \(b\) 互质时,裴蜀定理说明了存在整数 \(x\) 和 \(y\) 使得 \(ax + by = 1\),这是裴蜀定理的一个推论。[1:1]

想要完整理解裴蜀定理,我们首先从最大公约数开始。

1. 辗转相除法

最大公约数(Greatest Common Divisor,GCD)是指能够整除给定整数集合中所有整数的最大的那个数。

设 \(a\) 和 \(b\) 是两个正整数,\(a > b\),则 \(a\) 和 \(b\) 的最大公约数等于 \(a\) 除以 \(b\) 的余数 \(r\) 和 \(b\) 的最大公约数。即 \(gcd(a, b) = gcd(b, r)\)。

证明:

设 \(a \div b = m \cdots r\) ,则 \(a = mb + r\).设 \(d\) 是 \(a\) 和 \(b\) 的一个最大公约数。

由于 \(d\) 是 \(a\) 的约数,得 \(d\) 是 \(mb + r\) 的约数,又 \(d\) 是 \(b\) 的约数,所以 \(d\) 也是 \(mb\) 的约数,即得 \(d\) 是 \(r\) 的约数。得 \(d\) 是 \(a\) 和 \(r\) 的公约数。

由于 \(b > r\),\(d\) 是 \(a\) 和 \(b\) 的最大公约数,所以 \(d\) 是 \(b\) 和 \(r\) 的最大公约数。

同理,对于 \(b\) 和 \(r\),我们可以找到 \(b\) 和 \(r\) 的最大公约数 \(d'\),\(d'\) 是 \(b\) 和 \(r\) 的最大公约数,所以 \(d'\) 是 \(a\) 和 \(b\) 的最大公约数。

当如此循环往复,直到 \(r = 0\) 时,\(b\) 和 \(r\) 的最大公约数就是 \(b\),所以 \(d\) 是 \(a\) 和 \(b\) 的最大公约数。

证明结束。

写成公式表示:

\[gcd(a,b) = \begin{cases} a, & b = 0 \\ gcd(b, a\ \text{mod}\ b), & b \neq 0 \end{cases} \]

使用递归的方式实现:

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

2. 扩展欧几里得算法

扩展欧几里得算法是求解裴蜀等式的一种算法,它可以在 \(O(\log{n})\) 的时间复杂度内求解裴蜀等式的一组解。

前文已经提到,裴蜀等式 \(ax + by = m\) 有解时当且仅当 \(m\) 是 \(a\) 和 \(b\) 的最大公约数 \(d\) 的倍数。(公式表示:\(ax + by = k \cdot gcd(a, b), k\in \mathbb{Z}\))

证明[1:2]过程详见维基百科。

我们根据证明可以得到,若裴蜀等式 \(ax + by = m\) 有解,既 \(ax + by = k \cdot gcd(a, b), k\in \mathbb{Z}\)。

根据辗转相除法,我们可以得到:

\[gcd(a, b) = gcd(b, a\ \text{mod}\ b) = gcd(b, a - \lfloor \frac{a}{b} \rfloor b) \]

(注: 这里得符号 \(\text{mod}\) 表示取模,而不是求余。 但是在 C++ 中,% 表示的是求余,因此下面我们讨论的范围是 \([0, b)\)。 )

展开裴蜀等式,在 \(a,b \in [0, max(a,b))\) , 我们可以得到:

\[\begin{aligned} ax + by &= k \cdot gcd(a, b) \\ bx^{(1)} + (a - \lfloor \frac{a}{b} \rfloor b)y^{(1)} &= k \cdot gcd(b, a\ \text{mod}\ b) \\ &\cdots \end{aligned} \]

(注: 这里 \(x\) 和 \(y\) 的上标表示第几次迭代的结果,而不是导数或者幂。)

  1. 当 \(b \neq 0\) 时,根据前文的辗转相除法, \(gcd(a, b) = gcd(b, a\ \text{mod}\ b)\)。由此我们可以得到:

    \[\begin{aligned} ax + by = bx^{(1)} + (a - \lfloor \frac{a}{b} \rfloor b)y^{(1)} \\ ax + by = ay^{(1)} + b(x^{(1)} - \lfloor \frac{a}{b} \rfloor y^{(1)}) \\ \end{aligned} \]

    故得:

    \[\begin{aligned} x &= y^{(1)} \\ y &= x^{(1)} - \lfloor \frac{a}{b} \rfloor y^{(1)} \end{aligned} \]

    继续计算,我们可以得到:

    \[\begin{aligned} x^{(1)} &= y^{(2)} \\ y^{(1)} &= x^{(2)} - \lfloor \frac{b}{a} \rfloor y^{(2)} \\ &\cdots \end{aligned} \]

  2. 当 \(b = 0\) 时,我们可以得到:

    \[\begin{aligned} ax + by &= k \cdot gcd(a, b) \\ ax &= k \cdot gcd(a, 0) = k \cdot a \\ \end{aligned} \]

    解得:

    \[ x = k \\ y = 0 \]

令上述递推式中的 \(k = 1\),我们即可得到裴蜀等式的一组解。

// @param a, b: 两个正整数
// @param x, y: 一组解,利用引用带出递归函数
// @return: a 和 b 的最大公约数
int ExGcd(int a, int b, int &x, int &y)
{
    if (b == 0)  // 递归边界 b = 0
    {
        x = 1;
        y = 0;
        return a;
    }
    // 递归求解
    // 1. 计算 x1, y1
    int r = ExGcd(b, a % b, x, y); // 递归求解gcd(b, a % b)
    int x1 = x; // 保存 x1
    x = y; // 更新 x
    y = x1 - a / b * y; // 用y1和x1更新y
    return r;
}

个人见解,谨慎参考。
欢迎讨论!




  1. 维基百科编者. 貝祖等式[G/OL]. 维基百科, 2023(20231104)[2023-11-04]. https://zh.wikipedia.org/w/index.php?title=貝祖等式&oldid=79621447. ↩︎ ↩︎ ↩︎

标签:gcd,int,定理,最大公约数,算法,ax,aligned,裴蜀
From: https://www.cnblogs.com/BryceAi/p/17852767.html

相关文章

  • 羚通视频智能分析平台:人员闯入算法检测与入侵识别报警系统
    在当今社会中,安全问题已经成为人们关注的焦点。无论是家庭、企业还是公共场所,都需要有一套完善的安全防范系统来保障人们的生命财产安全。随着科技的不断发展,视频监控系统已经从传统的模拟监控升级为数字化、网络化的智能监控系统。其中,羚通视频智能分析平台的人员闯入算法检测和......
  • 基于uwb和IMU融合的三维空间定位算法matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述        基于UWB和IMU融合的三维空间定位算法是一个结合了无线脉冲波(UWB)和惯性测量单元(IMU)各自优势的定位方法。UWB通过测量信号的传输时间来计算距离,具有精度高、抗干扰能力强等优点......
  • 羚通视频智能分析平台烟火识别 智慧工地烟火识别算法检测
    羚通视频智能分析平台是一种先进的烟火识别系统,它利用深度学习技术进行智能算法检测。通过对大量样本数据的学习和训练,该系统能够准确地识别出烟雾和火焰的特征。它具有高精度检测、实时性强、可扩展性强、智能分析和预警等优点,能够满足安防监控领域中对烟火检测的需求,提高监控效......
  • 羚通视频智能分析平台烟火识别 智慧工地烟火识别算法检测
    羚通视频智能分析平台是一种先进的烟火识别系统,它利用深度学习技术进行智能算法检测。通过对大量样本数据的学习和训练,该系统能够准确地识别出烟雾和火焰的特征。它具有高精度检测、实时性强、可扩展性强、智能分析和预警等优点,能够满足安防监控领域中对烟火检测的需求,提高监控效率......
  • 羚通视频智能分析平台自动识别反光衣穿戴 反光衣算法识别检测系统
    羚通视频智能分析平台自动识别反光衣穿戴的检测系统是一种高效的安全监控工具,它利用先进的人工智能技术,特别是深度学习和计算机视觉技术,对工地上的安全帽和反光背心穿戴情况进行实时分析和识别。这个系统通过实时视频监控工作人员的反光衣穿戴情况,对未穿反光衣的危险......
  • 文心一言 VS 讯飞星火 VS chatgpt (142)-- 算法导论12.1 2题
    二、用go语言,二叉搜索树性质与最小堆性质(见6.1节)之间有什么不同?能使用最小堆性质在O(n)时间内按序输出一棵有n个结点树的关键字吗?可以的话,请说明如何做,否则解释理由。文心一言:在二叉搜索树(BinarySearchTree,BST)和最小堆(MinHeap)中,元素的排列顺序都是根据其关键字的......
  • 二分图匹配---Munkres算法(匈牙利算法)
    在任务指派问题(如n项工作由n个人承担,每个人完成不同工作所花时间不同,那如何分配使得花费的时间最少)以及一些多目标检测任务中的数据关联部分(如一个目标有多个特征点,有多个目标时检测到的特征点属于哪一个目标的问题)常常会看到Munkres算法,这里从原理及实现上简单介绍一下Munkres算......
  • Java算法练习—递归/回溯
    递归是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。因此递归过程,最重要的就是查看能不能将原本的问题分解为更小的子问题,这是使用递归的关键。如果是线型递归,子问题直接回到父问题......
  • 算法学习笔记(42): 颜色段均摊
    颜色段均摊反正ODT!对于ODT来说,其区间推平的复杂度是\(O((n+m)\logn)\)的,十分的优秀,但是对于查询来说,我们需要通过分块或者线段进行辅助,从而达到正确的复杂度。有一种特殊情况例外:如果推平和查询同时发生,意味着推平时对于每一段查询的复杂度是没有问题的!判断是否......
  • 算法~让整数从指定范围开始
    题目有个需求,我有4种类型,每种类型又有自己的数列,问我如何用一个数字来表示它们思路可以看一下java里的线程的实现,它是将一个int64的数字进行分区,每个区间代表一种状态,如运行中,挂起,暂停等,我们也可以通过这个方法来实现。实现在int32中,我找一个范围,存储我的运行中状态的数列,为......