问题描述

如果ab1(modn)a*b \equiv 1 \pmod n\equiv符号表示ab%n=1a*b \% n=1%\%表示模运算,模运算就是取余,x%y=xxyyx\%y=x-\lfloor\frac{x}{y}\rfloor*y,例如5%3=25\%3=2

a,ba,b在模nn情况下互为模逆元,模逆元可以记为a1a^{-1},即a1b(modn),b1a(modn)a^{-1} \equiv b \pmod n,b^{-1} \equiv a \pmod n

aa在模nn的情况下,存在模逆元的充要条件是gcd(a,n)=1gcd(a,n)=1gcd(a,n)gcd(a,n)表示aann的最大公约数,即aann互素。

简单描述一下,非正式的证明:

  • 必要条件证明:如果aann不互素,设gcd(a,n)=d>1gcd(a,n)=d \gt 1,对于任意的整数bbab(modn)abkn(modn)a*b \pmod n \equiv a*b - k*n \pmod n,其中0abkn<n0 \le a*b - k*n \lt n,由于aadd的倍数,nn也是dd的倍数,因此abkna*b - k*n也是dd的倍数,即对任意的bbab(modn)a*b \pmod n整除d,d>1d,d>1,与存在模拟元的前提矛盾,所以若存在ab1(modn)a*b \equiv 1 \pmod n,则a,na,n必须互素

  • 充分条件证明:如果aann互素,我们首先证明aka*k1kn11 \le k \le n-1时,任意两个不同的kk乘以aann必定不相等,且不为00

    • 首先若要ak0(modn)a*k \equiv 0\pmod n,则aka*knn的倍数,由于gcd(a,n)=1gcd(a,n)=1,则kk必须是nn的倍数,与1kn11 \le k \le n-1矛盾,因此ak0(modn)a*k \ne 0\pmod n
    • 其次证明对于任意两个k1,k2k_1,k_2ak1ak2(modn)a*k_1 \ne a*k_2 \pmod n:假设ak1ak2(modn)a*k_1 \equiv a*k_2 \pmod n,则意味着ak1ak2=a(k1k2)0(modn)a*k_1 - a*k_2 = a*(k_1-k_2) \equiv 0 \pmod n,而1k1,k2n11 \le k_1,k_2 \le n-1,所以1k1k2<n11 \le |k_1-k_2| \lt n-1,根据上面的证明,在1kn11 \le k \le n-1时,ak0(modn)a*k \ne 0\pmod n,与假设矛盾,得证

    由上可知aka*knn1kn11 \le k \le n-1时,结果集合为{1,2,3,...,n1}\{1,2,3,...,n-1\},因此必定存在某个kk,使得ak1(modn)a*k \equiv 1 \pmod n

求解模拟元的方法

方法1-欧拉定理

a1=aϕ(n)1a^{-1}=a^{\phi(n)-1}ϕ(n)\phi(n)表示小于nn且与nn互素的数的个数

证明:
{a1,a2,...,aϕ(n)}\{a_1,a_2,...,a_{\phi(n)}\}为所有与nn互素的数,由上面模逆元存在性的证明可知:

aaiaaj(modn)(1i,jϕ(n),ij)a*a_i \ne a*a_j \pmod n (1\le i,j\le \phi(n), i \ne j)

因此:{aa1,aa2,...,aaϕ(n)}(modn)\{a*a_1,a*a_2,...,a*a_{\phi(n)}\} \pmod n 每个都不相等,且与nn互素

即:两个集合在模nn的情况下完全相等,{aa1,aa2,...,aaϕ(n)}={a1,a2,...,aϕ(n)}(modn)\{a*a_1,a*a_2,...,a*a_{\phi(n)}\} = \{a_1,a_2,...,a_{\phi(n)}\} \pmod n

可以得出:aa1aa2...aaϕ(n)a1a2...aϕ(n)(modn)a*a_1*a*a_2*...*a*a_{\phi(n)} \equiv a_1*a_2*...*a_{\phi(n)} \pmod n

aϕ(n)a1a2...aϕ(n)a1a2...aϕ(n)(modn)a^{\phi(n)}*a_1*a_2*...*a_{\phi(n)} \equiv a_1*a_2*...*a_{\phi(n)} \pmod n

aϕ(n)a1a2...aϕ(n)a1a2...aϕ(n)0(modn)a^{\phi(n)}*a_1*a_2*...*a_{\phi(n)} - a_1*a_2*...*a_{\phi(n)} \equiv 0 \pmod n

(aϕ(n)1)a1a2...aϕ(n)0(modn)(a^{\phi(n)}-1) * a_1*a_2*...*a_{\phi(n)} \equiv 0 \pmod n

由于(aϕ(n)1)<n(a^{\phi(n)}-1) \lt naia_inn互素,因此(aϕ(n)1)=0(a^{\phi(n)}-1)=0,即aϕ(n)=1=aaϕ(n)1a^{\phi(n)}=1=a*a^{\phi(n)-1},所以aϕ(n)1a^{\phi(n)-1}aa的模逆元,如果nn是素数,则aϕ(n)1=an2a^{\phi(n)-1}=a^{n-2}

方法2-扩展欧几里得算法

关于扩展欧几里得算法的详细介绍,可以参考这篇文章:最大公约数:扩展欧几里得算法

通过扩展欧几里得算法,可以求得ax+ny=gcd(a,n)=1,ax+nyax1(modn)ax+ny=gcd(a,n)=1, ax+ny \equiv ax \equiv 1 \pmod n,求得的xx即为aa的模拟元