传统的 cipolla 算法很精巧 但是我背不到 但是不好拓展到模任意数的情况。
事实上我现在都还不清楚,对于 (k > 1),环 (R(Z_{p^k},+, imes)) 到底有什么特殊性质。
首先它不是整环,然而就我所看的抽代教材中只讨论了整环的特殊性。。。
由 crt,模任意数等价于考虑模 (p^k) 的情况。
分三步:模奇素数 (p)、模奇素数幂 (p^k(k>1)) 以及模 (2^k)。
模奇素数 p
设 (n) 是二次剩余,求解方程 (x^2 = nmod p)。
记 (varphi(p) = 2^t imes s),其中 (s) 为奇数。由 (n) 是二次剩余,可得 (n^{2^{t-1} imes s}=1mod p),变形可得 ((frac{n^{s+1}}{n})^{2^{t-1}} = 1mod p)。
记 (x_{t-1} = n^{frac{s+1}{2}}),则有 ((frac{x_{t-1}^2}{n})^{2^{t-1}} = 1mod p),其中 (x_0) 即是答案。
现考虑 (x_{i} o x_{i - 1})。计算 (A = (frac{x_i^2}{n})^{2^{i-1}} mod p),当 (A = 1) 时取 (x_{i-1} = x_i);否则取 (x_{i-1} = lambda x_i),其中 (lambda^{2^i} = -1)。
等价于需要找到 (lambda) 满足 (ord(lambda) = 2^{i+1})。当然可以通过原根找,也可以考虑如下的方法:
随机二次非剩余 (a),则 (a = g^u),其中 (u) 为奇数。则 (ord(a^s)=frac{2^t imes s}{gcd(2^t imes s,us)}=2^t),即可构造出 (lambda)。
这个方法在 https://hly1204.blog.uoj.ac/blog/6422 中也被提到。
模奇素数幂 p^k(k>1)
https://www.luogu.com.cn/problem/solution/P6091 :证明原根在模 (2,4,p^k,2p^k) 下存在的充要性。
既然原根是存在的,那么方法和上面几乎一样。
只是注意 (n) 可能含有 (p) 因子,需要预先处理。
模 2^k
在 (k = 1,2) 时是平凡的。
在 (k = 3) 时,仅 (n = 1) 时有解 (x = 1, 3, 5, 7)。
注意 (aequiv bmod p^{k+1}) 的必要条件是 (aequiv bmod p^k),因此考虑 (2^{k} o 2^{k+1})。
归纳证明:当且仅当 (nmod 8 = 1) 时有解,且恰好 4 个解。
由于 (x^2 = (x+2^{k-1})^2mod 2^k),可以将 4 个解分成两组 ((x_1,x_1+2^{k-1})) 与 ((x_2, x_2 + 2^{k-1}))。
发现 (x_1^2) 与 ((x_1+2^{k-1})^2) 在 (mod 2^{k+1}) 时对应 (n) 与 (n + 2^k)(不一定分别对应),即 (mod 2^{k+1}) 的一组解。
由此得证。
证明其实也给出了构造方法。
高次剩余?
基本思路一样,主要是 (lambda) 的求解,我还没有看懂怎么来的。