「二次剩余」Tonelli - Shank's algorithm
传统的 cipolla 算法很精巧 但是我背不到 但是不好拓展到模任意数的情况。
事实上我现在都还不清楚,对于 \(k > 1\),环 \(R(Z_{p^k},+,\times)\) 到底有什么特殊性质。
首先它不是整环,然而就我所看的抽代教材中只讨论了整环的特殊性。。。
由 crt,模任意数等价于考虑模 \(p^k\) 的情况。
分三步:模奇素数 \(p\)、模奇素数幂 \(p^k(k>1)\) 以及模 \(2^k\)。
模奇素数 p
设 \(n\) 是二次剩余,求解方程 \(x^2 = n\bmod p\)。
记 \(\varphi(p) = 2^t\times s\),其中 \(s\) 为奇数。由 \(n\) 是二次剩余,可得 \(n^{2^{t-1}\times s}=1\bmod p\),变形可得 \((\frac{n^{s+1}}{n})^{2^{t-1}} = 1\bmod p\)。
记 \(x_{t-1} = n^{\frac{s+1}{2}}\),则有 \((\frac{x_{t-1}^2}{n})^{2^{t-1}} = 1\bmod p\),其中 \(x_0\) 即是答案。
现考虑 \(x_{i}\to x_{i - 1}\)。计算 \(A = (\frac{x_i^2}{n})^{2^{i-1}} \bmod 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\times s}{\gcd(2^t\times 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\)。
注意 \(a\equiv b\bmod p^{k+1}\) 的必要条件是 \(a\equiv b\bmod p^k\),因此考虑 \(2^{k}\to 2^{k+1}\)。
归纳证明:当且仅当 \(n\bmod 8 = 1\) 时有解,且恰好 4 个解。
由于 \(x^2 = (x+2^{k-1})^2\bmod 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\) 在 \(\bmod 2^{k+1}\) 时对应 \(n\) 与 \(n + 2^k\)(不一定分别对应),即 \(\bmod 2^{k+1}\) 的一组解。
由此得证。
证明其实也给出了构造方法。
高次剩余?
基本思路一样,主要是 \(\lambda\) 的求解,我还没有看懂怎么来的。