zoukankan      html  css  js  c++  java
  • 逆元相关知识

    逆元,又称数论倒数。

    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。

    完~~~~~~~~~

    转载请注明出处.
  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/Miroerwf/p/7771115.html
Copyright © 2011-2022 走看看