逆元求法(转)

转自:  http://hi.baidu.com/pty123/item/06730a080b8523354bc4a356

逆元的几种求法

  定义 a * x = 1(mod p), 求x

1、扩展欧几里德:

   令ax + py = 1

Gcd的本质就是进行迭代,不断缩小范围。

不详细讲。。参考:http://baike.baidu.com/view/1478219.htm

 

2、根据费马小定理:若(a,p)互质,且p为质数:

         则 a ^ (p – 1)= 1 (% p)

         所以x = a ^ (p- 2) (% p)

         快速幂求之,查询log(n),常数比扩展欧几里德稍大

 

3、O(n)预处理-O(1)询问

         预处理1-n关于p的逆元:(n < p)

         假设已经预处理了1-i-1的逆元,j的逆元设为F[j]

         令p = x * i –y ( 0 < y < i)

         X* i = y (mod p)

         X* F[y] * i = y * F[y] = 1(mod p)

         所以i的逆元是F[i] = X* F[y]

         这样就可以O(n)的时间预处理了。

 

4、还有一种方法:

逆元函数是完全积性的。。所以求所有质数的逆元即可,预处理复杂度是O(n / logn * logn) = O(n)。。。

 

 参考贾志鹏WC论文

posted @ 2013-10-03 20:28  heaventouch  阅读(355)  评论(0编辑  收藏  举报