📜  N为模M的非常大的因数,其中M是任何质数(1)

📅  最后修改于: 2023-12-03 14:44:50.640000             🧑  作者: Mango

求N模M的因数

有时候我们需要求一个数N模M的因数,其中M是任何质数。因为N很大,直接求因数是不现实的,那么我们该怎么做呢?

费马小定理

首先我们可以利用费马小定理来求模M意义下的逆元,也就是求x,使得x乘以N模M的结果等于1。假设N和M互质,那么根据费马小定理:

$$N^{M-1} \equiv 1 \pmod{M}$$

两边同时乘以N的逆元N':

$$N' N^{M-1} \equiv N' \pmod{M}$$

因为N'是N模M的逆元,所以左边等于1:

$$1 \equiv N' \pmod{M}$$

也就是说,N的逆元就是N^(M-2)模M。注意,如果N和M不互质的话,那么N没有逆元,也就是说,N模M的因数不存在。

例子

比如说现在我们需要求999999000001模1000000007的因数,也就是说,我们需要找到一个非常大的因数d,满足:

$$999999000001 \equiv 0 \pmod{d}$$ $$d < 1000000007$$

首先,根据费马小定理,我们可以求出

$$999999000001^{1000000005} \equiv 1 \pmod{1000000007}$$

也就是说,$999999000001^{-1} \equiv 999999000001^{1000000005} \pmod{1000000007}$。把1000000005转化成二进制,得到:

$$1000000005 = 2^{0} + 2^{2} + 2^{3} + 2^{6} + 2^{9} + 2^{12} + 2^{22}$$

所以

$$999999000001^{1000000005} \equiv 999999000001^{2^{0}} \times 999999000001^{2^{2}} \times 999999000001^{2^{3}} \times 999999000001^{2^{6}} \times 999999000001^{2^{9}} \times 999999000001^{2^{12}} \times 999999000001^{2^{22}} \pmod{1000000007}$$

我们可以用快速幂来计算每个项,得到:

$$999999000001^{1000000005} \equiv 225876549 \pmod{1000000007}$$

因此,$999999000001^{-1} \equiv 225876549 \pmod{1000000007}$。现在我们可以用这个逆元来求因数了。

首先,我们可以将999999000001分解质因数,得到:

$$999999000001 = 11 \times 9090909091$$

因为11和9090909091都是质数,所以因数只可能是1、11、9090909091、999999000001。

计算$999999000001^{-1} \pmod{11}$,得到3,因此$999999000001 \equiv 0 \pmod{11}$。

计算$999999000001^{-1} \pmod{9090909091}$,得到6945088641,因此$999999000001 \equiv 0 \pmod{9090909091}$。

因此,我们找到了所有的因数,分别是1、11、9090909091、999999000001。