逆元,又称数论倒数。
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。
完~~~~~~~~~