• 原根算法与剩余定理


    原根

    (g)为模数(p)的一个原根,
    那么(g^x,g^{x+1}...g^{x+p-2})(连续(p-1)项)在模(p)意义下分别对应([1,p-1])中的每一项。
    质数一定有原根,考虑求原根。
    首先由费马小定理,有(g^{p-1} equiv 1(mod p))
    我们暴力枚举(g),然后枚举(p-1)的一个质因子(delta),若(g^{frac{p-1}{delta}} equiv 1(mod p)),则(g)不是原根。
    否则这个(g)就是(p)的原根。
    很好理解,如果(g^{frac{p-1}{delta}} equiv 1(mod p)),则说明(g^xequiv 1(mod p))的解多于一个,与原根定义矛盾。
    一般来说,原根都很小,所以暴力枚举(g)是没有问题的(我见过的最大的原根为(g=221))。
    原根的常见作用:乘法转加法。
    在模(p)意义下,
    求出原根(g)后建立映射关系:(g^t tin [0 , p-2] o t),那么有(g^a*g^b = g^{(a+b)\% (p-1)})

    N次剩余

    (x^N equiv n(mod p))的所有解(x),其中(p)为一个素数。
    (n = 0),显然(x = 0)为唯一解,下面讨论(x eq 0)的解法:
    首先求得(p)的原根(g)
    然后利用(BSGS)求出(g^t equiv n(mod p))
    那么现在问题变为:(g^{Nx\%(p-1)} equiv g^t (mod p))
    所以有:(Nxequiv t(mod p-1)),直接使用扩展欧几里得得解,复杂度(O(sqrt{p}))
    有解性同 (BSGS)和扩欧算法 的有解性。

    二次剩余

    (x^2 equiv n(mod p))的一个解(x)其中(p)为一个奇素数
    (n = 0),显然(x = 0)为唯一解,下面讨论(x eq 0)的解法:

    引理1:(n)有二次剩余的条件为(n^{frac{p-1}{2}} equiv 1(mod p))

    根据费马小定理,我们有(n^{p-1} equiv 1(mod p))
    那么显然(n^{frac{p-1}{2}} equiv pm 1(mod p))
    假设可以找到一个(x_0),满足(x_0^2 equiv n(mod p)),由于(x_0^{p-1} equiv 1(mod p))
    ((x_0)^{(p-1)} equiv (n^{frac{1}{2}})^{p-1}),所以有(n^{frac{p-1}{2}} equiv 1(mod p))

    引理2:找到(p)的原根(g),其中(g^a equiv n(mod p)),那么(g^{frac{a}{2}})(n)在模(p)意义下的二次剩余。

    (g^a equiv n(mod p)),结合引理1:((g^a)^{frac{p-1}{2}} equiv g^{frac{a}{2}(p-1)} equiv 1(mod p))
    根据原根的定义,我们有(g^{p-1} equiv 1(mod p)),且(x=p-1)为唯一解。
    所以((p-1) | (frac{a}{2}(p-1))),消去(p-1)后有(1|frac{a}{2})
    所以(a)一定为偶数。
    显然(x_0 = sqrt{g^a} = g^{frac{a}{2}})(n)在模(p)意义下的二次剩余。

    我们可以归纳出一个(O(sqrt{p}))的算法:
    (1) 首先求出(p)的原根(g)
    (2) 快速幂判断(n)在模(p)意义下是否有二次剩余。
    (3) 使用(BSGS)求出(g^aequiv n(mod p))的解(a)(a)一定为偶数。
    (4) (x_0 = g^{frac{a}{2}})即为(n)在模(p)意义下的二次剩余。

    继续来看。
    所以我们先随机(rand)一个数(a)满足(a^2 - n)没有二次剩余,期望次数为(2)
    定义(delta = sqrt{a^2 - n})
    类似复数,我们定义一个新的数域,即所有数可以表示为(x + ydelta),((x,yleq p-1))。

    引理3:(delta^{p-1} equiv -1(mod p))

    由于(a^2 - n)没有二次剩余,所以((a^2 - n)^{frac{p-1}{2}} eq 1(mod p))
    ((a^2-n)^{p-1} equiv 1(mod p)),所以((a^2 - n)^{frac{p-1}{2}} equiv - 1(mod p))
    我们有(delta^2 = a^2 - n)
    所以(delta^{p-1} = (delta^{2})^{frac{p-1}{2}} = (a^2 - n)^{frac{p-1}{2}} equiv -1(mod p))

    引理4:((a + delta)^{p+1} = n (mod p)),即((a+delta)^{frac{p+1}{2}})(n)在模(p)意义下的二次剩余。

    ((a+delta )^{p} = sum_{i=0}^p inom{p}{i} a^i delta^{p-i} (mod p))
    除了第(0)、第(p)项,(inom{p}{i})的分子包含(p),这个(p)肯定不会被分母消掉,所以一定被(p)整除。
    所以((a+delta)^p = a^p + delta^p)
    我们有(a^{p-1} equiv 1(mod p))(delta^{p-1} equiv -1(mod p))
    所以((a+delta)^{p} = a - delta)
    所以((a+delta)^{p+1} = (a-delta)(a+delta) = a^2 - delta^2 = a^2 -(a^2 - n) = n)
    (p)为一个奇素数,所以(x_0 = (a+delta)^{frac{p+1}{2}})(n)在模(p)意义下的二次剩余。

    引理5:((a + delta)^{frac{p+1}{2}} equiv (x+ydelta) (mod p)),则(y = 0)

    根据代数基本定理,(n = (x + ydelta)^2)至多只会有两个解。
    我们如果能够证明这两个解一定满足(y = 0),那么原命题自然成立。
    ((x+ydelta)^2 = x^2 + 2xydelta + y^2delta^2 = x^2 + y^2(a^2-n)+ 2xydelta equiv n(mod p))
    注意到同余式的右边不存在(delta)
    所以有(2xyequiv 0(mod p))
    我们使用反证法,设(x = 0),那么((x+ydelta)^2 = y^2(a^2-n) equiv n(mod p))
    我们已知(a^2 -n)没有二次剩余,且(y^2)显然有二次剩余。所以(y^2(a^2-n))没有二次剩余。
    所以同余式左边(y^2(a^2-n))不存在二次剩余,而右边(n)存在二次剩余。
    所以矛盾,假设不成立。
    所以(y = 0)
    ((a+delta)^{frac{p+1}{2}} = x_0)是一个整数解,即我们所求。

    根据上述,可以得到一个(O(logp))求二次剩余的算法:
    (1) 判断(n)在模(p)意义下是否存在二次剩余。
    (2) 随机得到一个(a),满足(a^2-n)不存在二次剩余。
    (3) 重载运算((x_1+y_1delta)(x_2+y_2delta) = (x_1x_2 + (a^2-n)y_1y_2) + (x_1y_2+x_2y_1) delta)
    (4) 快速幂得到((a+delta)^{frac{p+1}{2}} equiv (x + ydelta) (mod p))
    (5) (x_0 = x)(n)在模(p)意义下的二次剩余。

    至此问题解决,虽然上面的这些东西实际中并没有什么用(QwQ)......

  • 相关阅读:
    Linux五种IO模型性能分析
    并发容器之CopyOnWriteArrayList(转载)
    Web.XML配置详解
    Servlet,过滤器,监听器,拦截器的区别
    JAVA反射机制详解
    Jdk1.6 JUC源码解析(13)-LinkedBlockingQueue
    Jdk1.6 JUC源码解析(12)-ArrayBlockingQueue
    Jdk1.6 JUC源码解析(6)-locks-AbstractQueuedSynchronizer
    Jdk1.6 JUC源码解析(7)-locks-ReentrantLock
    hibernate 其中七种关联关系
  • 原文地址:https://www.cnblogs.com/GuessYCB/p/10139050.html
Copyright © 2020-2023  润新知