【C/C++】乘法逆元与线性同余方程

前置知识

  • 拓展欧几里得算法

乘法逆元

  • 给定整数b,m互质,且有b|a,则存在一个整数x,使得a/b  ax(mod m)a/b\ ☰\ a*x(mod\ m)成立。此时,x便是b模m的乘法逆元,记为b1(mod m)b^{-1}(mod\ m)

因为a/baxa/bbb1(mod m)a/b☰a*x☰a/b*b*b^{-1}(mod\ m),所以bb11(mod m)b*b^{-1}☰1(mod\ m)

特殊的,当m为质数时,由费马小定理可知,bm11(mod m)b^{m-1}☰1(mod\ m),所以此时b1(mod m)b^{-1}(mod\ m) = bm2b^{m-2}

若m不为质数,则需要求解线性同余方程bx1(mod m)b*x☰1(mod\ m),来算出x。

线性同余方程

  • 给定整数a,b,m。求满足方程axb(mod m)a*x☰b(mod\ m)的 x,或给出无解。

求解过程如下:【C/C++】乘法逆元与线性同余方程
当然,这个是特解,通解表示如下:
x=((xob/g)%(m/g)+(m/g))%(m/g) x = ((x_o*b/g)\%(m/g)+(m/g))\%(m/g)

其意义是,所以模(m/g)与(x*b/g)同余的整数。

具体推导过程有ACwing的聚聚AC_Jobim已经给出,点这里