数论中乘法逆元的几种求法

逆元

在离散数学中的概念 自行查找资料吧

百度简单介绍一句   

逆元 一般指逆元素 逆元素是指一个可以取消另一给定元素运算的元素,在数学里,逆元素广义化了加法中的加法逆元和乘法中的倒数。

 

先来引入取模(取余,两者差别不大)概念

 

(a +  b) % p = (a%p +  b%p) %p  (对)

(a  -  b) % p = (a%p  -  b%p) %p  (对)

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

(a  /  b) % p = (a%p  /  b%p) %p  (错)

 

为什么除法错的

证明是对的难,证明错的只要举一个反例

(100/50)%20 = 2       ≠      (100%20) / (50%20) %20 = 0

 

对于一些题目,我们必须在中间过程中进行求余,否则数字太大,电脑存不下,那如果这个算式中出现除法,我们是不是对这个算式就无法计算了呢?

答案当然是 NO (>o<)

这时就需要逆元了

a*x  = 1 (mod p)   满足a乘以x对p取模等于1  此时  称 x为a对p的逆元

只有a与p互质才有逆元   互质 公约数只有1  最大公约数为1


 

 

费马小定理

                                       a^(p-1) ≡1 (mod p)

     变形                          a*a^(p-2) ≡1 (mod p)

     此时                          a^(p-2)就是a对p的逆元

 

 1 LL pow_mod(LL a, LL b, LL p)   //用到快速幂的知识,函数返回a的b次方对p取模
 2 { 
 3     LL ret = 1;
 4     while(b)
 5     {
 6         if(b & 1) 
 7             ret = (ret * a) % p;
 8         a = (a * a) % p;
 9         b >>= 1;
10     }
11     return ret;
12 }
13 LL Fermat(LL a, LL p)          //返回a对p的逆元
14 { 
15         return pow_mod(a, p-2, p);
16 }

 

 


 

 

扩展欧几里得

                                        ax+by=gcd(a,b)

把b看做p   a与b互质 所以  gcd(a,b)=1,即ax+by=1

这个解的x就是a关于b的逆元,y就是b关于a的逆元

证明  两边同对b取模

                                            a*x % b + b*y % b = 1 % b

                                                     a*x % b = 1 % b

                                                      a*x = 1 (mod b)

所以x是a关于b的逆元    反之可证明y

 

 1 void exgcd(LL a, LL b, LL &x, LL &y, LL &d)  //欧几里得函数
 2 {
 3     if (!b) 
 4         {d = a, x = 1, y = 0;}
 5     else
 6     {
 7         exgcd(b, a % b, y, x, d);
 8         y -= x * (a / b);
 9     }
10 }
11 LL inv(LL t, LL p)                    //返回t对p的逆元
12 {
13     LL d, x, y;
14     exgcd(t, p, x, y, d);
15     return (x % p + p) % p;        //x可能为负,也可能过大
16 }

 

 


 

 

 

递推方法

 

1 LL inv(LL t, LL p) //求t关于p的逆元,注意:t要小于p,最好传参前先把t%p一下
2 {
3     return t == 1 ? 1 : (p - p / t) * inv(p % t, p) % p;
4 }

 

 


 

 

推荐博客 值得看    http://www.cnblogs.com/linyujun/p/5194184.html

                              https://oi.men.ci/mul-inverse/

 

菜鸡一枚  欢迎大佬纠错

转载于:https://www.cnblogs.com/stranger-/p/7277591.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值