(ACM数论)求乘法逆元的各种姿势~

原创 2016年08月29日 16:55:34

首先,通过下面的式子来看看什么是乘法逆元~

x * n % P = 1,其中x和P为已知且互素,n未知(比如在 2 * n % 7 = 1 这个式子里,n就是乘法逆元)

弄懂什么是乘法逆元,来看看有什么姿势可以把它求出来吧~

姿势1.暴力(此姿势不要求P为素数)

没有什么问题是一个暴力解决不了的,如果有,那就两个(手动滑稽)

代码如下:

int n;
for(int i = 1 ;i <= P ;i++)
{
    if(x * i % P == 1)
    {
        n = i;
        break;
    }
}

虽然暴力简单粗暴,但是它的时间复杂度为O(P),只能在P较小的情况使用,局限性有点大。

姿势2.快速幂(此姿势要求P为素数)

这个姿势是由费马巨巨的费马小定理(x^(P-1) ≡ 1 mod P)得来的:

x^(P-1) ≡ 1 mod P 即 x^(P-1) % P = 1

已知 x * n % P = 1

所以有 x * n % P = x^(P-1) % P 即 n % P = x^(P-2) % P

到这里可以看出,逆元有无数个:n,n+P,n+2*P,…

一般情况下我们只要求那个最小的正整数,这样问题就转化为求 x^(P-2) % P

代码就不贴了,在网上找个有求模快速幂的模版,把x,P-2,P代进去就可以了

这个姿势的时间复杂度为O(log P),是个不错的姿势(手动滑稽)

姿势3.扩展欧几里德算法(此姿势不要求P为素数)

首先,我们将式子变形一下~

x * n % P = 1 等价于 n * x + k * P = 1,其中k为整数

因为 x 和 P 互素,所以 gcd (x ,P) = 1(最大公约数为1)

所以有 n * x + k * P = gcd (x ,P)

这样问题就转化为,求二元一次方程 n * x + k * P = gcd (x ,P) 的解

代码同样不贴了, 在网上找个扩展欧几里德的模版,把 x , P 代进去。

不过要注意,算出来的n有可能是负数,也有可能不是最小的。若需要得到最小的正整数,加上如下代码即可:

n = n % P;//处理不是最小的情况
while(n < 0)//处理负数的情况
{
    n =( n + P ) % P;
}

到这里可以得出结论:逆元的集合为{…,n - 2 * P,n - P,n , n + P,n + 2 * P,… }

这个姿势的时间复杂度为O(log P),是个不错的姿势(手动滑稽)

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

2016ACM/ICPC亚洲区大连站 1006 Detachment 1004 A Simple Math Problem(求逆元)(数论)

这次差不多有6道是我现在可以做的,还有一道博弈论加大数的以后再补吧,还是要多积累啊。 现在先补充两个题目的吧

fireworks----乘法逆元求组合数(2017山东ACM-ICPC省赛)

Problem DescriptionHmz likes to play fireworks, especially when they are put regularly. Now he puts...

HDU 5894 hannnnah_j’s Biologica(lucas定理求组合数+乘法逆元)——2016 ACM/ICPC Asia Regional Shenyang Online

HDU 5894 hannnnah_j’s Biologica(lucas定理求组合数+乘法逆元)——2016 ACM/ICPC Asia Regional Shenyang Online

hdu 1454 Happy 2004(数论,分解因子,乘法逆元,快速幂取模)

Happy 2004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total...

hdu 1452 Happy 2004(数论(模P乘法逆元+快速幂取模))

2004=2^2*3*167。 f[1]=2^2,f[2]=3,f[3]=167三者两两互质。2004所有因子的情况:(1+2+2^2)*(1+3)*(1+167)。所以2004的因子个数和就是3*2...

浅谈数论(四)扩展欧几里得算法与乘法逆元

扩展欧几里德算法 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。 证明:设 a>b。   1...

关于数论乘法逆元及相关知识点

在求解a/b%m时,可以转化为(a%(b*m))/b,转化过程如下 令k = (a/b)/m(向下取整), x = (a/b)%m; a/b = k*m + x (x a = k*b*m + b*x...
  • yo_bc
  • yo_bc
  • 2017-05-10 20:57
  • 489

[数论]HDU 1452 Happy 2004 素因子分解+快速幂模+乘法逆元

传送门:Happy 2004 Happy 2004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

数论知识总结(乘法逆元,欧拉函数,线性筛,快速幂,快速乘等)

数论总结 内容:欧拉函数,欧拉定理,费马小定理,中国剩余定理,欧几里得定理,扩展欧几里得定理,逆元,线性筛、卡特兰数、快速幂、快速乘、矩阵乘法。欧拉函数:A={ x | 1 < =x < n...

HDU 5895 Mathematician QSC(逆元应用+矩阵快速幂+数论知识)——2016 ACM/ICPC Asia Regional Shenyang Online

传送门 Mathematician QSCTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)