逆元相关知识

逆元,又称数论倒数。

1):逆元的定义:

定义一个正整数p为模,a为任意正整数(a和m必须互质),如果存在a',使得同余式 a*a' ≡ 1(mod p)成立,即a乘a'对p取模后的结果为1,那么a'就是a对于p的逆元,用inv[a]来表示。

举个例子:a=2,p=3,则存在inv[a]=2,使的a*inv[a]=2*2=4,(a*inv[a])%p=4%3=1;

一件尴尬的事(我们在推导inv[a]时,是将inv[a]当作a的倒数来处理的,但实际上inv[a]并不一定是a的倒数,这个我也有点迷(滑稽),等我找到了原因再更新博客吧~~~~~~~~)。

2).求余方法:

(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.

对于一些题目,由于数据过大,计算机存不下,就需要在中间过程进行取余。但是如果有除法运算是不是就无法取余了呢?答案肯定是否。这时就需要用逆元将除法转变为乘法。

转换:(a  /  b) % p = (a * inv(b) ) % p(a 除 b 等于 a 乘 b 的倒数,即inv[b]),然后(a * inv(b) ) % p= (a % p * inv(a) % p) % p;

3).逆元的求法

①,利用费马小定理。

费马小定理:a^(p-1) ≡1 (mod p)(当p是质数时)。

变形:两边都除以 a,得到 a^(p-2) ≡1/a (mod p),也就是 a^(p-2) ≡ inv(a) (mod p),移项得 inv(a) = (a^(p-2)) %p。

这个求的时候可以用快速幂:传送门

②.利用扩展欧几里得算法:

扩展欧几里得:a*x + b*y = 1,如果 a 和 b 互质,则有解,即存在x,y。

x就是a关于b的逆元,y 就是b关于a的逆元,为什么呢?

变形:两边同时对 b 取余得到:a*x % b + b*y % b = 1 % b ,即  a*x % b = 1 % b,由于1%b=1,所以 a*x % b = 1,所以 a*x≡1(mod b),所以 x 是 a 对于 b 的逆元 。y的证明同理。

扩展欧几里得: 传送门

③. 当p是个质数的时候有 : inv(a) = (p - p / a) * inv(p % a) % p。

证明: 设 x = p % a,y = p / a; 于是有  x + y * a = p,两边都%p得:(x + y * a) % p = 0; 展开并移项得 x % p = (-y) * a % p; 两边同时乘inv[a],a*inv[a]是等于1的,所以:x * inv(a) % p = (-y) % p;

再两边都乘inv[x]得:inv(a) = (p - y) * inv(x) % p; 在右边乘以p%p,合并得 inv(a) = (p - y) * inv(x) % p,换掉 x 和 y 得:  inv(a) = (p - p / a) * inv(p % a) % p

运算:一直递归到1为止,因为1的逆元就是1。

完~~~~~~~~~

转载请注明出处.
原文地址:https://www.cnblogs.com/Miroerwf/p/7771115.html