乘法逆元

乘法逆元的应用

蹲街弑〆低调 提交于 2020-02-28 11:24:39
这个博客讲的很好,直接拉过来了。 http://blog.sina.com.cn/s/blog_7c4c33190100s48a.html 网络上讲的也很少,这个算是最清楚的了。 定义: 满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元。 为什么要有乘法逆元呢? 当我们要求(a/b) mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元。 我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k) mod p。其结果与(a/b) mod p等价。 证: 根据b*k≡1 (mod p)有b*k=p*x+1。 k=(p*x+1)/b。 把k代入(a*k) mod p,得: (a*(p*x+1)/b) mod p =((a*p*x)/b+a/b) mod p =[((a*p*x)/b) mod p +(a/b)] mod p =[(p*(a*x)/b) mod p +(a/b)] mod p //p*[(a*x)/b] mod p=0 所以原式等于:(a/b) mod p 更简单的证明: a/b mod p = a* (b*b^(-1) ) /b =a*b^(-1); 至于怎么求解二元不定方程,参见扩展欧几里得算法。(extended-gcd) http://blog.sina.com.cn/s/blog_7c4c33190100s4a8.html

乘法逆元

风格不统一 提交于 2020-02-28 11:23:50
1.使用情况:     用法1. 在求解除法取模问题 ( a / b ) % m 时,我们可以转化为 ( a % ( b ∗ m ) ) / b ,   但是如果b很大,则会出现爆精度问题,所以我们避免使用除法直接计算。    用法2. 当我们要求(a/b) mod m的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元。   我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k) mod m。其结果与(a/b) mod m等价。   遇到上面的情况, 我们可以使用逆元将除法转换为乘法:   假设b存在乘法逆元,即与m互质(充要条件)。设c是b的逆元,即 b ∗ c ≡ 1 ( m o d m ) ,   那么有 a / b = ( a / b ) ∗ 1 = ( a / b ) ∗ b ∗ c = a ∗ c ( m o d m )   即,除以一个数取模等于乘以这个数的逆元取模。 2.方法: 逆元求解一般利用扩欧。 当 m 为质数的时候直接使用费马小定理,m非质数使用欧拉函数。 当 m 为质数的时候,神奇的线性方法。 3.代码: #include<cstdio> #include <math.h> using namespace std; typedef long long ll; const int p = 1e9 + 7; const int N =

数论初步

泪湿孤枕 提交于 2020-02-09 12:39:08
PS:以下部分定理没有证明,如果有读者想要了解定理的具体证明,请自行百度,本文限于篇幅 (只是因为笔者自己不会) ,对部分定理的证明不作讨论。 本文讲啥 本文主要讲的是ACM中的数论基础内容 (以后可能会再写一篇ACM的数论进阶内容) ,侧重应用,证明都是瞎证的,严谨的证明请观众姥爷自行百度 线性筛筛素数 埃氏筛 埃氏筛用每个素数来筛掉它的倍数,剩下的就是素数,时间复杂度是 \(O(nloglogn)\) 为啥能正确地筛? 每一个合数,都可以被质因数分解,且根据 唯一分解定理 ,这个分解是唯一的,所以只要拿每个素数把它的倍数都筛掉,就能所有合数筛掉 板子 bool check[maxn]; std::vector<ll> prime; for (ll i = 2; i <= n; ++i) if (!check[i]) { prime.push_back(i); for (ll j = i * i; j <= n; j += i) check[j] = 1; } 为啥 \(j\) 从 \(i^2\) 开始? 上面的板子中第二层循环就是用素数筛掉它的倍数的过程, \(j\) 从 \(2i\) 开始循环,那为什么板子里是从 \(i^2\) 开始呢?实际上,这是一个小小的优化,因为在用素数 \(i\) 来筛它的倍数时,区间 \([2, i-1]\) 中的所有素数已经将它的倍数都筛过了

乘法逆元(模板)

≡放荡痞女 提交于 2020-02-05 11:35:15
乘法逆元定义: b存在乘法逆元的充要条件是b与模数m互质 原因:b * x ≡ 1 (mod m) 如果b和m不互质,则 b * x肯定是m的倍数,b * x%m=0 所以b%m==0 ,b不存在乘法逆元 1.当n为质数时,可以用快速幂求逆元:   a / b(整除) ≡ a * x (mod m)   两边同乘b可得 a ≡ a * b * x (mod m) -> 1 ≡ b * x (mod m)   同 b * x ≡ 1 (mod m)    由费马小定理可知,当m为质数时: b ^ (m - 1) ≡ 1 (mod m) 拆一个b出来可得 b * b ^ (m - 2) ≡ 1 (mod m)   所以当n为质数时,b的乘法逆元 x = b ^ (m - 2)%m 求a的乘法逆元: import java.util.*; public class Main{ static long quick_pow(long a,long b,long c){ long res=1; while(b>0){ if((b&1)==1) res=res*a%c; a=a*a%c; b>>=1; } return res; } public static void main(String[] args) { Scanner scan=new Scanner(System.in); int

乘法逆元

微笑、不失礼 提交于 2020-01-22 21:23:06
普通求逆元 \[ax≡1\ (mod\ p)\] 其中 \(x\) 就是 \(a\) 在模 \(p\) 意义下的乘法逆元 \((inv)\) \(gcd(a,p)=1\) 时存在,即 \(a\) 在模 \(p\) 意义下有逆元的充要条件是 \(a,\ p\) 互质 计算等价于解方程 \(ax+bp=1\) 定义了剩余系中的除法 \(\frac{a}{b}≡a × inv_p(b)\ (mod\ p)\) 费马小定理也求乘法逆元 费马小定理:若 \(p\) 为质数,且 \(gcd(a,p)=1\) ( \(a,\ p\) 互质),那么 \(a^{p-1}≡1(mod\ p)\) 两侧同除 \(a\) ,即得到 \(a\) 的逆元: \(inv_p(a)≡a^{p-2}(mod\ p)\) ,用快速幂计算即可 线性求逆元 设 \(p=ka+b(1<a<b<p)\) ,得 \[ka+b≡0\ (mod\ p)\] 等式两边同除 \(ab\) ,得 \[inv(a)≡-k×inv(b)\ (mod\ p)\] \[inv(a)≡-\lfloor\frac{p}{a} \rfloor×inv(p\ mod\ a)\ (mod\ p)\] \(code:\) for(int i=2;i<=n;++i) inv[i]=(p-p/i)*inv[p%i]%p; /*inv[i]=-p/i*inv[p

浅谈欧拉定理及乘法逆元

帅比萌擦擦* 提交于 2019-12-09 20:40:10
浅谈欧拉定理及乘法逆元 本篇随笔简单讲解一下信息学奥林匹克竞赛数论部分 欧拉定理及乘法逆元 这一知识点。介绍的内容大致分为这么几个部分: “同余的基本概念、费马小定理、欧拉定理及其推论、乘法逆元” 。 同余的基本概念 同余的概念啊非常简单啦:如果两个整数 \(a,b\) 除以一个数 \(m\) 的余数相等的话,那么就叫做 \(a,b\) 在模 \(m\) 的意义上同余。 记作: \[ a\equiv b\,\,\,(mod\,\,m) \] 那么根据同余的这个定义,我们很容易能推导出一个性质:如果两个数 \(a,b\) 在模 \(m\) 的意义下同余,那么 \(a-b\) 就是 \(m\) 的倍数,这是显然的。 以及,如果 \(a\%m=1\) ,那么就可以被改写成这样的式子: \[ a\equiv 1\,\,\,(mod\,\,m) \] 这个转化的正确性也是显然的。 费马小定理 费马小定理也非常简单啦!用语言描述就是,如果一个数 \(p\) 是质数,那么对于一个不为 \(p\) 的倍数的整数 \(a\) ,有 \(a^{p-1}\equiv 1\,\,\,(mod\,\,p)\) 。那么把这个结论两边同时乘上一个 \(a\) ,即可得出:对于任意的整数 \(a\) , \(a\) 的 \(p\) 次幂与 \(a\) 在模 \(p\) 的意义上同余。 即: \[ a^p

数学笔记本

[亡魂溺海] 提交于 2019-12-06 06:38:50
由于蒟蒻数学不好,特将所有关于数学(主要是组合数学)的小笔记扔在这里 著名的快速幂 int a,b,m; scanf("%lld%lld%lld",&a,&b,&m); int ans=1,base=a; while(b!=0) { if(b & 1 != 0) { ans*=base; ans=ans%m; } base*=base; base%=m; b>>=1; } 乘法逆元 a在mod p意义下的乘法逆元是a^(p-2) 无根树 一个无根树有n^(n-2)个形态 Cayley 公式 来源: https://www.cnblogs.com/lzy-blog/p/11965883.html

乘法逆元、逆元应用、求逆元(费马小定理,扩展欧几里得)

匿名 (未验证) 提交于 2019-12-03 00:21:02
乘法逆元 对于缩系中的元素,每个数a均有唯一的与之对应的乘法逆元x,使得ax≡1(mod n) 逆元的含义:模n意义下,1个数a如果有逆元x,那么除以a相当于乘以x。 逆元的应用 当求解公式:(a/b)%m 时,因b可能会过大,会出现爆精度的情况,所以需变除法为乘法: 设c是b的逆元,则有b*c≡1(mod m); 则(a/b)%m = (a/b)*1%m = (a/b)*b*c%m = a*c(mod m); 即a/b的模等于a* b的逆元 的模; 逆元就是这样应用的; 求逆元的方法 (1)费马小定理 (p-1) const int mod = 1000000007; long long quickpow(long long a, long long b) { if (b < 0) return 0; long long ret = 1; a %= mod; while(b) { if (b & 1) ret = (ret * a) % mod; b >>= 1; a = (a * a) % mod; } return ret; } long long inv(long long a) { return quickpow(a, mod - 2); } (2)拓展欧几里德 我们都知道模就是余数,比如12%5=12-5*2=2,18%4=18-4*4=2。(/是程序运算中的除)

求乘法逆元的几种方法

寵の児 提交于 2019-12-02 16:42:54
目录 方法1 方法2 方法3(线性批量求逆元) 求模意义下一个数的乘法逆元有多种方法. 方法1 利用裴蜀定理(扩展欧几里得算法)。 直接解线性方程 \(ax+bp=1\) , 可知 \(a^{-1}=x\) . 方法2 利用费马小定理。 对任意素数 \(p\) , 若 \(a<p\) , 则 \(a^{p-1}\equiv 1(\mod p)\) 推至 \(a^{p-2}\equiv a^{-1}(\mod p)\) 所以使用快速幂算法求得模意义下的 \(a^{p-2}\) 就可以得到 \(a\) 的乘法逆元 方法3(线性批量求逆元) 使用了一个巧妙的递推构造. 首先我们知道 \(p=aq+r, 0 \le r < a\) , 其中 \(q=\lfloor \frac p a\rfloor\) 由此 \(aq+r\equiv 0 (\mod p)\) 由此 \(aa^{-1}r^{-1}q + ra^{-1}r^{-1} \equiv 0 (\mod p )\) 由此 \(-r^{-1}q\equiv a^{-1}(\mod p)\) 上式中 \(r < a\) , 所以, 对于一个数, 我们总可以利用比其小的数的逆元推出它的逆元. 又有 \(1^{-1} =1\) 由此我们建立了一个线性递推方法. 下面会给出这种方法的程序实现. /* Problem : [Luogu]P3811

乘法逆元

試著忘記壹切 提交于 2019-12-02 14:23:19
\[\text{乘法逆元}\] 学习博客 定义: 这是来自大佬博客的: 对于缩系中的元素,每个数 \(a\) 均有唯一的与之对应的乘法逆元 \(x\) ,使得 \(ax \equiv 1 (mod \ n)\) ,一个数有逆元的充分必要条件是 \(gcd(a,n)=1\) ,此时逆元唯一存在 求逆元的几种方法 1.扩展欧几里得算法 设 \(a\) 的逆元是 \(x\) , \(x\) 满足 \(ax\equiv1\) (这是上边定义里已经说了的),因为除法的实质是减法所以,方程也可以写为 \(ax-my=1\) ,求得一组解之后判断 \(gcd(x,y)\) 是否是一,如果不是则说明不是,因为我们用 \(exgcd\) 求得就是一组最小解了。如果是,则需调整 \(x\) 到相应范围 \((0到m-1)\) Code: int exgcd(int a, int b, int & x, int & y) { if(!b) {x = 1, y = 0; return;} int d = exgcd(b, a % b, y, x); y -= a / b * x; return d; } int inv(int a, int n) { int x, y; int d = exgcd(a, n, x, y); return d == 1 ? (x + n) % n : -1; } 费马小定理