首页 > 编程语言 >乘法逆元 + 扩展欧几里得定理/算法

乘法逆元 + 扩展欧几里得定理/算法

时间:2024-08-26 22:03:57浏览次数:6  
标签:frac gcd 欧几里得 逆元 ax 乘法 mod

数学之乘法逆元

Part1 : 逆元是什么

一个东西 的逆元,就是指在一种运算/操作下能够抵消这个东西所带来影响的东东

举个例子 4 的加法逆元 就是 -4

​ 2 在普通乘法中的逆元就是 \(2^{-1}\)

而乘法逆元指的是在 模意义 下的乘法逆元

设原式为

​ \(1*a \equiv a \mod p\)

那么 \(a\) 的乘法逆元乘上去之后的效果就是

这里的 \(a^{-1}\) 指的是 \(a\) 的乘法逆元

​ \(1*a*a^{-1} \equiv 1 \mod p\)

即:

​ \(a*a^{-1} \equiv 1 \mod p\)

ps:知道了这些,以下的所有内容中的 \(xxx^{-1}\) 表示 \(xxx\) 的乘法逆元

Part2 :有什么用

举个例子 要求出 $ \frac{a}{b} mod \ p$ 的值 , 那该怎么算呢?

我们要知道的是,在模意义下,除以一个数等于乘以一个数的逆元

所以 \(\frac{a}{b} \bmod \ p =a*b^{-1} \bmod \ p\)

Part3 : 该怎么求

所以乘法逆元到底要怎么求呢?

有两种求法

Part3.1: 费马小定理

​ 当 \(p\) 是质数

​ \(a^{p-1} \equiv 1 \mod p\)

​ 所以

​ \(a*a^{p-2} \equiv 1 \mod p\)

​ 那么

​ \(a^{p-2}\)就是 \(a\) 的乘法逆元

​ 这个可以用快速幂实现

Part3.2:扩展欧几里得算法

​ 当 \(p\) 不是质数时,就要用到扩展欧几里得算法了

​ 我太菜了,不会扩欧

​ 那么要学会扩欧,先要学会 欧几里得定理 这个东西

​ 至于为什么吗,因为要用到

欧几里得定理(辗转相除法)

​ \(gcd(a,b)=gcd(b,a\%b)\)

扩展欧几里得定理

​ 我们有 \(a\) , \(b\)

​ 现在要求出满足 \(ax + by =gcd(a,b)\) 的最小的 \(x\) 和其对应的 \(y\)

假如我们之前求出来了一组数 \(x_2,y_2\) 使得 \(bx_2 + (a \bmod b)y_2 = gcd(a,b)\)

​ 那么 \(ax + by =bx_2 + (a \bmod b)y_2\) (3)

​ 那当这个假如成立时怎么求呢?

​ 取模运算的本质其实是 \(a \bmod b = a - b×\left \lfloor \frac{a}{b} \right \rfloor\)

​ 所以 \(3\) 式本质上是

​ \(ax + by =bx_2 + (a - b×\left \lfloor \frac{a}{b} \right \rfloor)*y_2\) 继续推

​ \(ax + by =ay_2+bx_2 - b*\left \lfloor \frac{a}{b} \right \rfloor*y_2\)

​ \(ax + by =ay_2+b(x_2 - \left \lfloor \frac{a}{b} \right \rfloor*y_2)\)

​ 那么,\(x,y\) 必然有一组解为 \(x=y_2,y=(x_2 - \left \lfloor \frac{a}{b} \right \rfloor*y_2)\)

​ 所以,我们只用求出 \(x_2,y_2\) 就可以得出 \(x,y\) 了

​ 那么,\(x_2,y_2\) 该怎么求b呢?

​ 我们手上的要求的式子变为了

​ \(bx_2 + (a\bmod b)y_2 = gcd(a,b)\)

​ 然后不断重复上面的求解过程,解出 \(x_2,y_2\),但又要解出 \(x_3,y_3\)

​ 这个过程中 \(x,y\) 的系数 \(s_x,s_y\) 不断被替换为 \(s_y,s_x\%s_y\)

​ 直到最后,一定会出现 \(s_n=gcd(a,b),s_n=0\)

​ 这个时候

​ 方程长这样 \(s_xx_n+s_yy_n=gcd(a,b)\)

​ 很明显的,当 \(x_n=1\) 时上式一定成立,这个时候 \(y_n\) 取任意值都可以,但建议取 0 免得神奇错误

​ 然后不断回溯

​ 好,你知道了这个,那么就可以继续了(我不会证

​ 我们先令 \(x=a^{-1}\)

​ 所以

​ \(ax \equiv 1 \mod b\)

​ 对于这个同余方程,我们将其变一下形式

​ \(ax + by = 1\)

​ 其中 \(y\) 为一负数

标签:frac,gcd,欧几里得,逆元,ax,乘法,mod
From: https://www.cnblogs.com/sea-and-sky/p/18381672

相关文章

  • 打印99乘法表
    我们的核心思想是以小化大1.先写出1的所有乘法2.设置一个变量,使得不止有1乘n3.将1的乘法放入变量中,使得1再次被循环包起来4.解决重复乘法图片中出现了两次1*4,说明刚才的表达式会有重复相乘出现重复的原因:a有1~9的数字而i也会有1~9,a*i就必然会有重复,我们需要让一个......
  • 【Python系列】 Python打印99乘法表
    ......
  • 九九乘法表
    先定义一个变量intn=0;遍历九次,当开始进入for循环的时候先递增,因为n++,i++,所以i=n,得到第一行:1x1,2x2~~~9x9接着再进入第二个for循环嵌套for循环的原理是:外层循环一次,内层全部循环publicstaticvoidEx18(){intn=0;//遍历9......
  • 高精度运算——大数加法与乘法
    要点:加法直接传递进位,乘法先保留进位,后统一处理使用int数组存储,空间浪费,处理方便建立bigNum结构(或类),处理清晰方便代码:基础定义#include<bits/stdc++.h>usingnamespacestd;charnum1[10000];charnum2[10000];structbigNum{ intnum[1000]={}; intlen;};vo......
  • 掌握 PyTorch 张量乘法:八个关键函数与应用场景对比解析
    PyTorch提供了几种张量乘法的方法,每种方法都是不同的,并且有不同的应用。我们来详细介绍每个方法,并且详细解释这些函数有什么区别:1、torch.matmultorch.matmul是PyTorch中用于矩阵乘法的函数。它能够处理各种不同维度的张量,并根据张量的维度自动调整其操作方式。torch......
  • P5431 【模板】模意义下的乘法逆元 2
    看到5e6的数据,500ms的时限,\(O(NlogN)\)快速幂直接跑肯定会T掉,那我们就要考虑优化一下式子。我们令\(s=\prod_{1}^{n}{a[i]}\),那我们给第i个式子通分,就为$\frac{k^i*s/a[i]}{s}$\(s/a[i]\)就相当于$\prod^{i-1}_{1}{a[i]}*\prod_{i+1}^{n}{a[i]}$因此我们只需要预......
  • 逆元
    逆元用于求$\frac{a}{b}(mod\p)$的结果第一种方法:拓展欧几里得利用拓欧求解同余方程:\(a*x≡c\(mod\b)\)的\(c=1\)的情况就可以转化成求解\(a*x+b*y=1\)这个方程voidexgcd(lla,llb,ll&x,ll&y)//解ax+by=gcd(a,b)的一组整数解{ if(b==0) { ......
  • 快速计算多个树的逆元
    设\(n\)个数分别为\(a_1\dotsa_n\),令\(s_i\)为\(a_i\)的前缀积,那么对于\(1\lei<n\)有\(s_i^{-1}=s_{i+1}^{-1}*a_{i+1}\),那么\(a_i^{-1}=s_i^{-1}*s_{i-1}\),可以\(\Theta(n+\logp)\)的求出\(n\)个数的逆元例题:LOJ161乘法逆元2#include<cstdio>typedeflonglongll;c......
  • 最小二乘法原理推导+代码实现[Python]
    0.前言本文主要介绍了最小二乘法公式推导,并且使用Python语言实现线性拟合。读者需要具备高等数学、线性代数、Python编程知识。请读者按照文章顺序阅读。绘图软件为:geogebra5。1.原理推导1.1应用最小二乘法在购房中的应用通常涉及房价预测和房屋定价方面。这种统计方法通......
  • 多项式乘法
    FFT主要用于快速求多项式的乘积。多项式的乘积就叫做卷积对\(F\)和\(G\)来说,显然暴力算法的复杂度是\(O(nm)\),而FFT的时间复杂度为\(O(nlogn)\)多项式的性质:用任意\(n+1\)个横坐标不同的点,可以唯一确定一个\(n\)次多项式。这个性质叫做多项式的点表示法证明:设这个多项式\(f=a_n......