数论——欧几里得算法、裴蜀定理、扩展欧几里得算法 学习笔记

这篇具有很好参考价值的文章主要介绍了数论——欧几里得算法、裴蜀定理、扩展欧几里得算法 学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数论——欧几里得算法、裴蜀定理、扩展欧几里得算法

引入

最大公约数

最大公约数即为 Greatest Common Divisor,常缩写为 gcd。

一组整数的公约数,是指同时是这组数中每一个数的约数的数。\(\pm 1\) 是任意一组整数的公约数;
一组整数的最大公约数,是指所有公约数里面最大的一个。

特殊的,我们定义 \(\gcd(a, 0) = a\)

最小公倍数

最小公倍数即为 Least Common Multiple,常缩写为 lcm。

一组整数的公倍数,是指同时是这组数中每一个数的倍数的数。\(0\) 是任意一组整数的公倍数;
一组整数的最小公倍数(Least Common Multiple, LCM),是指所有正的公倍数里面,最小的一个数。

互质

如果两个数 \(a\)\(b\) 满足 \(\gcd(a, b) = 1\),我们称 \(a\)\(b\) 互质,记作 \(a\perp b\)

欧几里得算法

欧几里得算法(Euclidean algorithm),是求解两个数最大公约数的最常用的算法。

算法思想

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

具体证明见:OI-Wiki。

代码

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

因此也有递归写法:

int gcd(int a, int b) {
    int tmp;
    while (b != 0) tmp = a, a = b, b = tmp % b;
    return a;
}

对于 C++14,我们可以使用 中的 __gcd(a,b) 函数来求最大公约数。

时间复杂度

在输入为两个长为 \(n\) 的二进制整数时,欧几里得算法的时间复杂度为 \(O(n)\)
换句话说,在默认 \(a, b\) 同阶的情况下,时间复杂度为 \(O(\log\max(a, b))\)

欧几里得算法的最劣时间复杂度情况是 \(\gcd(\operatorname{Fib}_{n + 1}, \operatorname{Fib}_n)\),其时间复杂度为 \(O(n)\)
但是,有 \(\gcd(\operatorname{Fib}_{n + 1}, \operatorname{Fib}_n) = \operatorname{Fib}_{\gcd(n + 1, n)}\)

最小公倍数

计算

\(\gcd(a, b) \times \operatorname{lcm}(a, b) = a \times b\)

要求两个数的最小公倍数,先求出最大公约数即可。

证明

\(a = p_1^{k_{a_1}}p_2^{k_{a_2}} \dots p_s^{k_{a_s}}\)\(b = p_1^{k_{b_1}}p_2^{k_{b_2}} \dots p_s^{k_{b_s}}\)

我们发现,对于 \(a\)\(b\) 的情况,二者的最大公约数等于 \(p_1^{\min(k_{a_1}, k_{b_1})}p_2^{\min(k_{a_2}, k_{b_2})} \dots p_s^{\min(k_{a_s}, k_{b_s})}\)

最小公倍数等于 \(p_1^{\max(k_{a_1}, k_{b_1})}p_2^{\max(k_{a_2}, k_{b_2})} \dots p_s^{\max(k_{a_s}, k_{b_s})}\)

由于 \(k_a + k_b = \max(k_a, k_b) + \min(k_a, k_b)\)
所以得到结论是 \(\gcd(a, b) \times \operatorname{lcm}(a, b) = a \times b\)

裴蜀定理

定义

\(a\)\(b\) 是不全为零的整数,则存在整数 \(x\)\(y\),使得 \(ax + by = \gcd(a, b)\)

推广

\(A[1 \sim n]\) 是非零整数序列,则整数序列 \(X[1 \sim n]\) 一定满足:

\(\displaystyle \sum_{i = 1}^n A_iX_i = k \times \gcd(A_1, A_2, \dots, A_n)\),其中 \(k\) 为正整数。

扩展欧几里得算法

扩展欧几里得算法(Extended Euclidean algorithm,EXGCD),常用于求 \(ax + by = \gcd(a, b)\) 的一组可行解。

算法思路

对于 \(ax + by = \gcd(a, b)\),考虑与欧几里得算法相似的思路:

结论:
求一组解 \(x'\)\(y'\),使得 \(bx' + (a \bmod b)y' = \gcd(b, a \bmod b)\)
(欧几里得定理)\(\gcd(a, b) = \gcd(b, a \bmod b)\) \(bx' + (a \bmod b)y' = \gcd(a, b)\)
(模运算的定义)\(a \bmod b = a - \lfloor \dfrac{a}{b} \rfloor \times b\) \(bx' + (a - \lfloor \dfrac{a}{b} \rfloor \times b)y' = \gcd(a, b)\)
整理,得 \(ay' + b(x' - \lfloor \dfrac{a}{b} \rfloor \times y') = \gcd(a, b)\)

我们要求一组解,使得 \(ax + by = \gcd(a, b)\)

因此有一组解为 \(\left\{\begin{array}{l} x = y' \\ y = x' - \lfloor \dfrac{a}{b} \rfloor \times y'\end{array}\right.\)

其边界值为 \(b = 0\),这时有 \(ax = \gcd(a, 0) = a\),既有 \(x = 1\);为了方便起见,我们取 \(y = 0\)

即:若 \(b = 0\),则取 \(\left\{\begin{array}{l} x = 1 \\ y = 0\end{array}\right.\)

代码

来自 OI-Wiki:

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

简化后可以写作:

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;
}

特解到通解

假设我们现在求出了一组特解 \(x_0\)\(y_0\),使得 \(ax_0 + by_0 = \gcd(a, b)\)
接下来:

\[\begin{array}{rl} ax_0 + by_0 &= \gcd(a, b) \\ (ax_0 + H) + (by_0 - H) &= \gcd(a, b) \\ a(x_0 + H / a) + b(y_0 - H / b) &= \gcd(a, b) \end{array} \]

可以看出 \(H\) 即是 \(a\) 的倍数,又是 \(b\) 的倍数,
所以 \(H = k \times \operatorname{lcm}(a, b)\),其中 \(k\) 可以是任意整数。

即:\(\left\{\begin{array}{l} x = x_0 + k \times \dfrac{\operatorname{lcm}(a, b)}{a} \\ y = y_0 + k \times \dfrac{\operatorname{lcm}(a, b)}{b}\end{array}\right.\). 其中 \(k \in \mathbb{Z}\).

Reference

[1] https://oi-wiki.org/math/number-theory/bezouts/
[2] https://oi-wiki.org/math/number-theory/gcd/文章来源地址https://www.toymoban.com/news/detail-710173.html

到了这里,关于数论——欧几里得算法、裴蜀定理、扩展欧几里得算法 学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Exgcd(拓展欧几里得算法)的初步理解

    若a,b是整数,且 gcd(a,b)=d ,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1. 针对于一次不定方程 ax+by=c 进行求解,利用以上的裴蜀定理可以进行求解,当然要满足 gcd(a,b)|

    2024年02月16日
    浏览(33)
  • 一文看懂什么是欧几里得算法!多图演示辗转相除算法究竟是什么!为什么要这样开展!多图预警!

    ps:全文图片均为手绘,如果有不标准的地方还望谅解,之后会慢慢熟悉画图工具的,感谢感谢!!! 欧几里得算法 又称为 辗转相除法 ,是指用于计算两个非负整数a,b的最大 公约数 。 两个整数的最大公约数是指能够同时整除它们的最大的正整数。 辗转相除法能够实现效

    2024年02月02日
    浏览(48)
  • 快乐地谈谈:关于RSA算法中求私钥d的欧几里得方法(辗转相除法)考试向的欸

    关于RSA算法本身,就提及一下,它是属于非对称密码体制. 基本的加密方式就如下图所示: c为加密后的密文,m为加密前的明文 其中一般会给出公开密钥n、e的值,这样根据规则,便可以实现加密过程。而题目往往需要进行解密,那么就需要 先求解出p、q,随后再求解出私钥

    2024年02月04日
    浏览(38)
  • Python欧几里得距离变换

    edt ,即 Euclidean distance transform. ,欧氏距离变换。对于一个二值矩阵 A A A ,元素 a ∈ A ain A a ∈ A ,则 edt ⁡ ( a ) operatorname{edt}(a) edt ( a ) 为 a a a 到矩阵中0元素的最短距离。假设现有一矩阵 A = [ 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 ] A = begin{bmatrix} 01111\\\\ 00111\\\\ 01111\\\\ 01110\\\\

    2024年02月06日
    浏览(40)
  • 【非欧几里得域信号的信号处理】使用经典信号处理和图信号处理在一维和二维欧几里得域信号上应用低通滤波器研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 算例1 2.2 算例2 2.3 算例3  2.4 算例4 

    2024年02月13日
    浏览(71)
  • 机器学习中的数学——距离定义(一):欧几里得距离(Euclidean Distance)

    分类目录:《机器学习中的数学》总目录 相关文章: · 距离定义:基础知识 · 距离定义(一):欧几里得距离(Euclidean Distance) · 距离定义(二):曼哈顿距离(Manhattan Distance) · 距离定义(三):闵可夫斯基距离(Minkowski Distance) · 距离定义(四):切比雪夫距离(

    2023年04月11日
    浏览(37)
  • 【抽象代数】素理想、极大理想、唯一析因环、主理想整环、欧几里得环

    设 R R R 是一个环, I I I 是 R R R 的理想,若 a b ∈ I ⇒ a ∈ I abin I Rightarrow a in I a b ∈ I ⇒ a ∈ I 或 b ∈ I b in I b ∈ I ,则称 I I I 是素理想。 例: 整数环 p p p (由元素p生成的主理想), 若p是素数,且 a b ∈   p ab in p a b ∈   p ,则 p ∣ a b p | ab p ∣ a b , p ∣ a 或 p ∣

    2024年02月09日
    浏览(53)
  • 算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理

    互质就是两个数的最大公因数只有1,体现到代码里面就是 a和b互质,则b mod a = 1 mod a (目前我不是很理解,但是可以这样理解:a和b的最大公因数是1,即1作为除数和b作为除数时,对于被除数a来说余数是一样的,即1/a的余数和b/a是一样的,即 b mod a = 1 mod a ) 欧拉函数的作用是

    2024年02月09日
    浏览(45)
  • 数论——中国剩余定理、扩展中国剩余定理 学习笔记

    中国剩余定理(Chinese Remainder Theorem,CRT) 求解如下形式的一元线性同余方程组(其中 (m) 两两互质): $left{begin{matrix}x equiv a_1 pmod {m_1} \\\\x equiv a_2 pmod {m_2} \\\\ dots \\\\x equiv a_k pmod {m_k}end{matrix}right.$ 计算所有模数的积 (M = prod m_i) ; 对于第 (i) 个方程: 计算: (M_i

    2024年02月08日
    浏览(39)
  • 裴蜀定理

    目录 裴蜀定理 OJ实战 力扣 1250. 检查「好数组」 力扣 2543. 判断一个点是否可以到达 裴蜀定理:若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。 给你一个正整数数组  nums ,你需要从中任选一些子集,然后将

    2024年02月14日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包