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

扩展欧几里得算法

时间:2023-12-05 18:11:31浏览次数:39  
标签:gcd int 欧几里得 扩展 times 算法 ax equiv mod

扩展欧几里得算法

裴蜀定理(Bézout's lemma)

定义

设 \(a,b\) 是不全为零的整数,对任意整数 \(x,y\),满足 \(\gcd(a,b)\mid ax+by\),且存在整数 \(x,y\), 使得 \(ax+by=\gcd(a,b)\).

证明

对于第一点

由于 \(\gcd(a,b)\mid a,\gcd(a,b)\mid b\)

所以 \(\gcd(a,b)\mid ax,\gcd(a,b)\mid by\),其中 \(x,y\) 均为整数

因此 \(\gcd(a,b)\mid ax+by\)

对于第二点

在欧几里得辗转相除求 \(\gcd\)的最后一步,即 \(b = 0\) 时:

显然有一对整数 \(x = 1,y=0\),使得 \(a\times 1 + 0\times 0 = \gcd(a,0)\)。

若 \(b > 0\),则 \(\gcd(a,b) = \gcd(b,a\mod b)\)

假设存在一对整数 \(x,y\),满足 \(b\times x + (a\mod b)\times y = \gcd(b,a\mod b)\)

因为 \(bx + (a\mod b)y = bx + (a-b\lfloor a/b \rfloor)y = ay - b(x-\lfloor a/b \rfloor y)\)

所以令 \(x' = y, y' = x -\lfloor a/b \rfloor y\),就得到了\(ax' + by' = \gcd(a,b)\)

对上述过程用数学归纳法,得证。

扩展欧几里得算法

由上述证明可以推出如何求 \(x,y\)。

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

定义变量 \(d,x_0,y_0\),调用 d = exgcd(b, a % b, x, y);。注意在上述代码中,\(x_0,y_0\) 是以引用方式传递的。上述程序求出方程 \(ax + by = \gcd(a,b)\) 的一组特解 \(x_0,y_0\),并返回 \(a,b\) 的最大公约数 \(d\)。

对于更为一般的方程 \(ax + by = c\),它有解当且仅当 \(d|c\)。我们可以先求出 \(ax + by = d\) 的一组特解 \(x_0,y_0\),然后令 \(x_0,y_0\) 同时乘上 \(c/d\),就得到了 \(ax + by = c\) 的一组特解 \((c/d)x_0,(c/d)y_0\)。

事实上,方程 \(ax + by = c\) 的通解可以表示为:

\[x = \frac c d x_0 + k\frac b d,y = \frac c d y_0 - k\frac a d (k\in \Z) \]

其中 \(k\) 取遍整数集合,\(d = \gcd(a,b)\),\(x_0,y_0\) 是 \(ax + by = \gcd(a,b)\) 的一组特解。

乘法逆元

若整数 \(b,m\) 互质,并且 \(b\mid a\),则存在一个整数 \(x\),使得 \(a\div b \equiv a\times x\mod m\)。称 \(x\) 为 \(b\) 的模 \(m\) 乘法逆元,记为 \(b^{-1}\mod m\)

因为

\[a\div b\equiv a\times b^{-1}\equiv a\div b\times b\times b^{-1}\mod m \]

所以

\[b\times b^{-1} \equiv 1\mod m \]

如果 \(m\) 是质数(此时用符号 \(p\) 代替 \(m\))并且 \(b < p\),根据费马小定理,\(b^{p -1}\equiv 1\mod p\),即 \(b\times b^{p - 2}\equiv 1\mod p\)。

因此,当模数 \(p\) 为质数时,\(b^{p - 2}\) 即为 \(b\) 的乘法逆元。

如果只是保证 \(b,m\) 互质,那么乘法逆元可通过求解同余方程 \(b\times x \equiv 1\mod m\) 得到。

这里先按照推出的结论,给出用快速幂求逆元

int qpow(long long a, int b) {
      int ans = 1;
      a = (a % p + p) % p;
      for (; b; b >>= 1) 
      {
            if (b & 1) ans = (a * ans) % p;
            a = (a * a) % p;
      }
      return ans;
}

标签:gcd,int,欧几里得,扩展,times,算法,ax,equiv,mod
From: https://www.cnblogs.com/kdlyh/p/17877850.html

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (150)-- 算法导论12.2 6题
    六、用go语言,考虑一棵二叉搜索树T,其关键字互不相同。证明:如果T中一个结点x的右子树为空,且x有一个后继y,那么y一定是x的最底层祖先,并且其左孩子也是x的祖先。(注意到,每个结点都是它自己的祖先。)文心一言,代码正常运行:灵捷3.5。为了证明上述命题,我们需要定义几个......
  • 文心一言 VS 讯飞星火 VS chatgpt (150)-- 算法导论12.2 6题
    六、用go语言,考虑一棵二叉搜索树T,其关键字互不相同。证明:如果T中一个结点x的右子树为空,且x有一个后继y,那么y一定是x的最底层祖先,并且其左孩子也是x的祖先。(注意到,每个结点都是它自己的祖先。)文心一言,代码正常运行:灵捷3.5。为了证明上述命题,我们需要定义几个辅助......
  • 算法入门经典 刘汝佳 4.2 地址与指针
    4.2 地址和指针4.1节介绍的数学函数的特点是:做计算,然后返回一个值。有时候,我们要做的事情 并不是“计算”——如交换两个变量;而有时候,我们需要返回两个甚至更多的值——如解一个二元一次方程组。4.2.1 变量交换程序4-4 用函数交换变量(错误)#include<stdio.h>void swap(in......
  • java基于权重的抽奖算法
    最近需要写一个抽奖的功能(附带权重),根据这位博主https://blog.51cto.com/u_16213431/7116970,的算法理解了一下,记录下来importjava.util.ArrayList;importjava.util.List;importjava.util.Random;publicclassHelloWorld{publicstaticvoidmain(String[]args){......
  • 不平衡少样本数据集的算法方案
    在图像实际的细分场景中,经常会遇到数据集不均衡以及数据集数量有限等问题,如何有效利用数据集,提升自己的算法效果,这里大刀基于自己的实际项目经验,分享在实际图像分类领域遇到问题,以及解决的方案,供参考。前言大家好,我是张大刀。之前有个智慧工地的项目,其中一个需求是监控工地......
  • 基于PLE结合卡尔曼滤波的RSSI定位算法matlab仿真
    1.算法运行效果图预览     2.算法运行软件版本MATLAB2022a 3.算法理论概述        基于PLE(Power-LawEqualizer)结合卡尔曼滤波的RSSI(ReceivedSignalStrengthIndicator)定位算法是一种利用无线信号强度进行位置估计的方法。该方法通过PLE算法对RSSI......
  • 算法~布隆过滤器
    布隆过滤器(BloomFilter)是一种高效的概率数据结构,用于判断一个元素是否存在于集合中。它基于位数组和多个哈希函数,并具有以下特点:BloomFilter是一个基于概率的数据结构:它只能告诉我们一个元素绝对不在集合内或可能在集合内快速查询:布隆过滤器具有快速查询的特性。它使用多......
  • AES java加密与MySql加密算法一致
    1.背景数据库加密与java程序加密算法保持一致,统一采用AES加密算法。2.java代码加密1packagecom.pacific.permission.test;23importjavax.crypto.Cipher;4importjavax.crypto.spec.SecretKeySpec;5importjava.util.Base64;67/**8*@authorluzhi......
  • 【组成原理-指令】扩展操作码的树形解法
    仿照哈夫曼树(或前缀编码,Prefix-free)的解法,目前先不解释具体怎么画了,直接放例题,大家自己慢慢品味吧。【例1】某指令系统指令长16位,操作码字段为4位,地址码字段为4位,采用扩展操作码技术,形成三地址指令15条、二地址指令15条、一地址指令15条、零地址指令16条。【解......
  • 发现一个很好用的excel的php扩展
    废话不多,直接给文档地址:xlswrite导出时不容易超出内存,号称最大使用内存为最后一行数据大小。导出速度也很6.  插入内容:使用 Spreadsheet时,可以切换使用存储方式,默认是内存,如果切换了其他的比如文件,可以减少内存压力。Settings::setCache需要传入实现接口CacheInte......