乘法逆元及求法

在开始之前我们先介绍3个定理:

1.乘法逆元(在维基百科中也叫倒数,当然是 mod p后的,其实就是倒数不是吗?):

如果ax≡1 (mod p),且gcd(a,p)=1(a与p互质),则称a关于模p的乘法逆元为x。

2.费马小定理(定义来自维基百科):

假如a是一个整数p是一个质数,那么是p的倍数,可以表示为

如果a不是p的倍数,这个定理也可以写成

3.

扩展欧几里得

(定义来自维基百科):

已知整数a、b,扩展欧几里得算法可以在求得a、b的最大公约数的同时,能找到整数x、y(其中一个很可能是负数),使它们满足贝祖等式

好了,在明白上面的定理后我们开始分析乘法逆元:ax≡1 (mod p) 这个等式用中文描述就是 a乘一个数x并模p等于1,即 a%p*x%p=res,res%p=1;看上去就是同余定理的一个简单等式- -。那么问题来了。

为什么可以用费马小定理来求逆元呢?

由费马小定理 ap-1≡1 两边同时乘 ap-1 得 ap-2ap-1 ,两边同时除 ap-1 得 ap-2/ ap-1≡1, 变形得 a*ap-2≡1(mod p),答案已经很明显了:若a,p互质,因为a*ap-2≡1(mod p)且a*x≡1(mod p),则x=ap-2(mod p),用快速幂可快速求之。

为什么可以用扩展欧几里得求得逆元?

我们都知道模就是余数,比如12%3=12-12/3=1,18%2=18-18/5=3。(/是程序运算中的除)

那么ax≡1 (mod p)即ax-yp=1.把y写成+的形式就是ax+py=1,为方便理解下面我们把p写成b就是ax+by=1。就表示x是a的模b乘法逆元,y是b的模a乘法逆元。然后就可以用扩展欧几里得求了。

知道逆元怎么算之后,那么乘法逆元有什么用呢?

做题时如果结果过大一般都会让你模一个数,确保结果不是很大,而这个数一般是1e9+7,而且这个数又是个素数,加减乘与模运算的顺序交换不会影响结果,但是除法不行。有的题目要求结果mod一个大质数,如果原本的结果中有除法,比如除以a,那就可以乘以a的逆元替代。(除一个数等于乘它的倒数,虽然这里的逆元不完全是倒数,但可以这么理解,毕竟乘法逆元就是倒数的扩展)。

扩展欧几里得求逆元代码:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

void exgcd(ll a,ll b,ll& d,ll& x,ll& y)
{
    if(!b) { d = a; x = 1; y = 0; }
    else{ exgcd(b, a%b, d, y, x); y -= x*(a/b); }
}

ll inv(ll a, ll p)
{
    ll d, x, y;
    exgcd(a, p, d, x, y);
    return d == 1 ? (x+p)%p : -1;
}

int main()
{
    ll a,p;
    while(1)
    {
        scanf("%lld %lld",&a,&p);
        printf("%lld\n",inv(a,p));
    }
}
时间: 2024-11-12 01:33:49

乘法逆元及求法的相关文章

乘法逆元的求法(5种)

若a*b≡1(mod p) 即a,b互为mod p意义下的逆元 即(x/a)%p应为x*b%p 一.扩展欧几里得求逆元 根据a*b+p*k=1 板子O(logN): 1 #include<bits/stdc++.h> 2 typedef long long ll; 3 ll exgcd(ll a,ll b,ll &x,ll &y) { 4 if(!b) { 5 x=1,y=0; 6 return a; 7 } 8 ll res=exgcd(b,a%b,y,x); 9 y-=a/

乘法逆元

定义:当(a,p)=1时,存在ax≡1(mod p),则x叫作a在模p意义下的乘法逆元. 求法: 1.当p为质数时,由费马小定理,得ap-1≡1(mod p),即(a·ap-2)≡1(mod p),则a在模p意义下的乘法逆元是ap-2,直接用快速幂可求得. 2.当p不为质数时,用扩展欧几里得算法求a的逆元. 代码: 1 int exgcd(int a,int b,int &x, int &y) 2 { 3 int d=a; 4 if(b!=0){ 5 d=exgcd(b,a%b,y,x);

浅谈模质数意义下的乘法逆元

原文链接(更好的阅读体验) 参考文章www.luogu.org/blog/zyxxs/post-xiao-yi-jiang-tan-qian-tan-sheng-fa-ni-yuan 什么是乘法逆元 若整数\(b,m\)互质,并且\(b|a\),若存在一个整数\(x\),使得\(a / b \equiv a \ast x (mod \text{ } m)\),称\(x\)为 \(b\)的模\(m\)乘法逆元. 乘法逆元的用处 有时候,我们需要求\(a/b \text{ } mod \text{

乘法逆元求法

原创建时间:2018-08-05 08:24:19 数论中的重要内容 注意:本文只讨论模数为质数的情况,因为当模数为合数时,不一定所有数都有逆元 定义 在\(\bmod\ p\)的意义下,我们把\(x\)的乘法逆元写作\(x^{-1}\).乘法逆元有这样一条性质: \[x \times x^{-1} \equiv 1\ (\bmod\ p)\] 乘法逆元有什么用呢? 模意义下的除法运算! 除法运算对于模运算来说并不是「封闭」的,所以我们可以把除法转化成乘法 费马小定理求法 前置知识:「快速幂」

HDU 1576 -- A/B (总结乘法逆元的几种求法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7264    Accepted Submission(s): 5774 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%99

Codeforces 543D Road Improvement(树形DP+乘法逆元)

题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和HDU2196是一种类型的树形DP,因为它们都要分别求各个点的答案.然后解法也不难想: dp0[u]表示只考虑以u结点为根的子树的方案数 dp1[u]表示u结点往上走,倒过来,以它父亲为根那部分的方案数 有了这两部分的结果,对于各个点u的答案就是dp0[u]*(dp1[u]+1).这两部分求法如下,画

求乘法逆元的几种方法

(数学渣,下面的文字可能有误,欢迎指教)乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减乘与模运算的顺序交换不会影响结果,但是除法不行.有的题目要求结果mod一个大质数,如果原本的结果中有除法,比如除以a,那就可以乘以a的逆元替代. 在mod p的运算中,a存在乘法逆元当且仅当a与p互质.一般题目给的是一个大质数,所以只要a不是p的倍数,就以求乘法逆元. 目前了解到的求法有三种:1.扩展

BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1004 共n个卡片,染成r,b,g三种颜色,每种颜色的个数有规定.给出一些置换,可以由置换得到的染色方案视为等价的,求等价类计数. 分析 给出置换求等价类计数,用Burnside引理:等价类计数=(每一个置换不动点的和)/置换数.(不知道的建议去看白书) 其中不动点是指一个染色方案经过置换以后染色与之前完全相同. 1.求不动点个数. 不动点的话同一个循环内的每一个点的颜色必须相同(否则不同颜色

关于乘法逆元的世界

引子 经过几天的努力,终于将逆元这个大难题给攻克了--心情激动的一时无法平复.下面就简单介绍一下关于逆元的知识,来记录自己的成果,也希望能够帮助到别人.某些地方可能理解的不够深入,还请多多包涵. 定义 逆元,又称数论倒数,如果a*x≡1 (mod p),且gcd(a,p)=1(a与p互质),则称a关于模p的乘法逆元为x.(来自维基百科) 怎么说呢,逆元其实就是一个相当于倒数的东西,只不过是多模了一个p而已.要说它有什么用,那么请回忆一下倒数有什么用吧.没错,在上小学时,老师就教导过我们,除以一个