任意模数 n 次剩余

(n) 次剩余

你需要解方程 (x^nequiv kpmod m),其中 (xin [0,m-1])

保证解数不超过 (C=10^6)

(1le n,m,kle 10^9)

(k<m)

Sol

(1)(m) 是奇质数

此时 (m) 有原根,两边取对数得 (nyequiv b pmod {m-1}),使用 ( ext{exgcd}) 可以求出 (y)([0,m-1]) 的解。

(2)(m=p^e) , (p) 是奇质数。

(k\%m ightarrow k) 然后分三种情况讨论如下

1、(k=0)

显然当且仅当 (p^{lceil frac e n ceil}) 时等式能成立,故直接枚举 (p^{lceil frac e n ceil}) 的倍数即可。

2、((k,p^e)=1)

取对数得 (nyequiv b pmod{varphi(p^e)})

这样的方程有解必须有 (gcd(n,varphi(p^e)) mid b)

然后依然可以使用 ( ext{exgcd}) 求解,然后再用指标算出 (x=g^y)

3、((k,p^e)> 1)

我们设 (k=c imes p^j ((c,p)=1))

这样的方程有解必须有 (n mid j)

然后我们除去 (p^j)(displaystyle left(frac{x}{p^{frac{j}{n}}} ight)^nequiv cpmod{p^{e-j}})

换元 (u=frac{x}{p^{frac{j}{n}}})(u^nequiv c pmod{p^{e-j}}),此时和第 2 种情况一模一样,我们套用之前方法求解。

此处有重大坑点,先跳过。

(3)(m=2^d)

因为要输出所有解,解的个数不多,可以倍增,那么它在模 (2^{k-1}) 情况下的所有解 (x),如果还要在 (2^k) 成立,必定是 (x)(x+2^{k-1})
我们对于每一个 (x) 检查一下就好了,然后可以 bfs 出所有解。

最终求解

综上,我们对于一个任意正整数 (m),只要对其的唯一分解形式 (m=p_1^{q_1}p_2^{q_2}dots) 的每个质数进行求解即可,

最后跑一遍 DFS 枚举模每个 (p^q) 意义下的值,用 CRT(中国剩余定理)合并即可。

许多坑点

1、对 (p^k) 求原根,check 的时候要用 (varphi(p^k)) 而不是直接 (p^k-1)

2、在原式中 (x) 的取值范围是 ([0,p^e)),那么 (y=frac{x}{p^{frac{j}{n}}}) 的取值范围就是 ([0,p^{e-frac{j}{n}}))

可是在后一个式子中 (y) 的取值范围变成了 ([0,p^{e−j}))!!

因此我们最后的解的个数需要扩大 (p^{j−j/n}) 倍,我们枚举 ([0,p^{e−j})) 中的解向后不断扩展即可。

3、你需要一个正确的 BSGS 板子

4、正确的写法对于任何一个解的 vector 都不需要 unique 的,如果求出大量重复的解可能会被卡掉。

原文地址:https://www.cnblogs.com/bestwyj/p/11765641.html