• 「二次剩余」Tonelli



    传统的 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) 的求解,我还没有看懂怎么来的。

  • 相关阅读:
    空类型指针实践
    参数作用域实践
    内联函数实践:有疑惑未解决
    可变参数实践
    默认参数实践
    函数指针实践
    Windows下开发环境搭建
    Test
    C++ 左值与右值
    如何打包成多个资源文件
  • 原文地址:https://www.cnblogs.com/Tiw-Air-OAO/p/14361048.html
Copyright © 2020-2023  润新知