本博客部分摘自   hwim

定义

乘法逆元的定义:若存在正整数a,b,p, 满足ab = 1(mod p), 则称a 是b 的乘法逆元, 或称b 是a 的乘法逆元。b ≡ a-1 (mod p),a ≡ b-1 (mod p)

比如说, 在模7 意义下,3 的乘法逆元是5, 也可以说模7 意义下5的乘法逆元是3。模13意义下5的逆元是8

存在性

和同余方程很相似,在同余方程中

ab ≡ 1(mod p)

若a 与p 互质, 则一定存在一个正整数解b, 满足b < p,若a 与p 不互质, 则一定不存在正整数解b.

所以逆元要求a与p互质

求法

求逆元有三种求法,

1、扩展欧几里得

扩展欧几里得可以用来求这样的一组解的:ax+by = gcd(a,b),求x和y

逆元,求这样的一个解:ax ≡ 1 (mod b),

我们变一下式子

ax+by = gcd(a,b),变成 ax+by = c 求一个数等于c

ax ≡ 1 (mod b),变成 ax-by = 1 如果将y看成负的,ax+by = 1

那么,就可以用exgcd求了。

code:

#include<cstdio>

int exgcd(int a,int b,int &x,int &y)
{
if (b==)
{
x = ;
y = ;
return a;
}
int r = exgcd(b,a%b,x,y);
int tmp = x;
x = y;
y = tmp-a/b*y;
return r;
} int main()
{
//gcd(a,p)==1
int a,p,r,x,y;
while (scanf("%d%d",&a,&p)!=EOF)
{
r = exgcd(a,p,x,y);
printf("%d",(x%p+p)%p);
}
return ;
} 扩展欧几里得求逆元

exgcd

2、线性求逆元

ab = 1(mod p),求b

p%a = p-(p/a)*a;c++向下取整

那么(p/a)*a = p-(p%a);

(p/a)*a = -(p%a);在模p意义下p可以约掉

a = -(p%a)/(p/a);换一下位置

a-1 = -(p%a)-1*(p/a);

a-1可以用(p%a)-1推出,所以就可以用递推式来推出1到a的所有数的逆元。

code

求一个数的逆元

int INV(int a)//线性求a的逆元
{
if(a==) return ;
return ((-(p/a)*INV(p%a))%p);
}

求1-n的逆元

int inv[MAXN];
void INV(int a,int p)
{
inv[] = ;
for (int i=; i<=a; ++i)
inv[i] = (-(p/i))*inv[p%i]%p;
}

线性求逆元1

3、欧拉函数求逆元

欧拉定理:aφ(p) ≡ 1(mod p)(不会证,逃

对于任意互质的a,p 恒成立。

欧拉定理用来求逆元用的是欧拉定理的一个推论
a*aφ(p)-1 ≡ 1(mod p)

仔细观察,a*b ≡ 1(mod p),在这里的b不就是上面的aφ(p)-1吗?,所以求出aφ(p)-1就好了。

所以我们用快速幂就可以求出乘法逆元了。

这个方法它需要多算一个欧拉函数,代码这里不再给出。

这里给出求欧拉函数O(根n)的做法

不懂欧拉的戳这里11101001

int getphi(int x){
int ret=;
for(int i=;prime[i]*prime[i]<=x;i++){
if(x%prime[i]==)
{
ret*=prime[i]-;
x/=prime[i];
while(x%prime[i]==)
x/=prime[i],ret*=prime[i];
}
}
if(x>) ret*=x-;
return ret;
}

V欧拉

应用

我们知道(a+b)%p = (a%p+b%p)%p

    (a*b)%p = (a%p)*(b%p)%p

求(a/b)%p时,可能会因为a是一个很大的数,不能直接算出来,也无法像上面一样分解。

我们可以通过求b关于p的乘法逆元k,k ≡ b-1 (mod p) ,将a乘上k再模p,即(a*k) mod p。其结果与(a/b) mod p等价。

然后这就成了求a*k%p,然后就可以用那两个公式了。

 

about乘法逆元的更多相关文章

  1. Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)

    题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...

  2. 51nod1256(乘法逆元)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 题意:中文题诶~ 思路: M, N 互质, 求满足 K ...

  3. 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数

    1.gcd int gcd(int a,int b){ return b?gcd(b,a%b):a; } 2.扩展gcd )extend great common divisor ll exgcd(l ...

  4. HDU 5651 计算回文串个数问题(有重复的全排列、乘法逆元、费马小定理)

    原题: http://acm.hdu.edu.cn/showproblem.php?pid=5651 很容易看出来的是,如果一个字符串中,多于一个字母出现奇数次,则该字符串无法形成回文串,因为不能删减 ...

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

    题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...

  6. HDU 1452 (约数和+乘法逆元)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个 ...

  7. HDU 1576 (乘法逆元)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目大意:求(A/B)mod 9973.但是给出的A是mod形式n,n=A%9973. 解题思 ...

  8. 51Nod 1256 乘法逆元 Label:exgcd

    1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K ...

  9. hdu 2669 Romantic (乘法逆元)

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  10. HDU3037 Saving Beans(Lucas定理+乘法逆元)

    题目大概问小于等于m个的物品放到n个地方有几种方法. 即解这个n元一次方程的非负整数解的个数$x_1+x_2+x_3+\dots+x_n=y$,其中0<=y<=m. 这个方程的非负整数解个 ...

随机推荐

  1. 基于IAR6或者IAR7建立STM32开发工程(通过实际测试,使用IAR6.30.4)

    IAR和keil两个开发平台都是arm开发当中比较流行的平台,keil4的版本之间,可以兼容,但是版本4和版本5还是不兼容的,但是IAR的兼容性更加差,好像6.30.x之间是能够兼容的吧,没有实测过, ...

  2. 官网下载MySQL

    1)首先我们访问MySQL官网https://dev.mysql.com/,然后如下 2)我们向下拉取滚动条,来到如下界面,选择Source Code 3)向下拉取滚动条,来到如下界面,操作如下: 4 ...

  3. Hadoop4.2HDFS测试报告之六

    测试结论 第一组数据作表格作图: 第二组数据作表格作图: 根据以上图分析得出以下结论: 1. 本地存储的读写速率基本保持23M左右,说明本地存储比较稳定. 2. HDFS存储两个数据节点的读写速率性能 ...

  4. WPF使用异步+绑定的方式处理大数据量

    WPF的优势在于界面处理,即使是这样,在面对大数据量的时候也免不了界面假死,同一个线程里处理界面跟大数据量,这是不可避免的.解决办法还是有的,可以使用分页加载,虚拟加载,动态加载,增加条件限制... ...

  5. SPOJ QTREE4 - Query on a tree IV 树分治

    题意: 给出一棵边带权的树,初始树上所有节点都是白色. 有两种操作: C x,改变节点x的颜色,即白变黑,黑变白 A,询问树中最远的两个白色节点的距离,这两个白色节点可以重合(此时距离为0). 分析: ...

  6. 如何理解redo和undo的作用

    目录 如何理解redo和undo的作用 redo undo UNDO和REDO的区别 如何理解redo和undo的作用 redo 重做日志(redo)包含所有数据产生的历史改变记录,是oracle在线 ...

  7. day01_14.遍历数组

    <?php $a = array('a','b','c'); print_r($a); ?> 输出结果:Array ( [0] => a [1] => b [2] => ...

  8. javascript 获取键盘上的按键代码KeyCode

    Enter键的keyCode为13 Alt + Enter 的keyCode为10 $(document).on( 'keypress', function ( e ) { console.log( ...

  9. 理解 PHP output buffer

    在需要使用输出缓存区的时候,一般会在代码中加上ob_start()这个函数. 这是因为php.ini中output_buffering设置为off时,则缓存区处于关闭状态,需要用ob_start()打 ...

  10. Use of @OneToMany or @ManyToMany targeting an unmapped class:hibernate映射错误

    hibernate映射异常:Use of @OneToMany or @ManyToMany targeting an unmapped class 新建了PO以后,要把PO所在的目录加入到Hiber ...