模为素数的二次剩余

Posted qwq-qaq-tat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模为素数的二次剩余相关的知识,希望对你有一定的参考价值。

来自潘承洞、潘承彪《初等数论》,有删改。
由于 \\(p=2\\) 的情况过于显然,所以文中假定 \\(p\\) 是奇素数。


一、引入

假设 \\(p\\not\\mid a\\),二次同余方程的一般形式是 \\(ax^2+bx+c\\equiv 0\\pmod p\\),由于 \\(\\gcd(p,4a)=1\\),所以可以表示为 \\(4a(ax^2+bx+c)\\equiv 0\\pmod p\\),所以知道 \\((2ax+b)^2\\equiv b^2-4ac\\pmod p\\)。然后令 \\(y\\equiv 2ax+b\\pmod p\\),原式变为 \\(y^2\\equiv b^2-4ac\\pmod p\\)。所以我么只需要讨论形如 \\(x^2\\equiv d\\pmod p(1)\\) 的同余方程。

二、定义

定义 1 设素数 \\(p>2\\)\\(d\\) 是整数,\\(p\\not\\mid d\\),如果同余方程 \\((1)\\) 有解,则称 \\(d\\)\\(p\\) 的二次剩余;否则称 \\(d\\)\\(p\\) 的二次非剩余

定理 1 在模 \\(p\\) 的一个既约剩余系中,恰有 \\(\\fracp-12\\) 个模 \\(p\\) 的二次剩余,同余方程 \\((1)\\) 的解数为 2。
证明:我们取 \\(p\\)绝对最小既约剩余系 \\(-\\fracp-12,-\\fracp-32,…,-2,-1,1,2,…,\\fracp-32,\\fracp-12\\) 来讨论。由于 \\(i^2\\equiv (-i)^2\\pmod p\\),所以 \\(d\\) 是模 \\(p\\) 的二次剩余当且仅当 \\(d\\equiv 1^2,2^2,…,(\\fracp-12)^2\\pmod p\\)。同时,对于 \\(\\forall i,j\\in[1,\\fracp-12],i<j\\),容易知道 \\(j^2-i^2\\equiv (j+i)(j-i)\\pmod p\\)。由于 \\(0<j-i<j+i<p\\),所以 \\(i^2\\not\\equiv j^2\\pmod p\\)。所以在模 \\(p\\) 的一个既约剩余系中,模 \\(p\\) 的二次剩余恰好有 \\(\\fracp-12\\) 个。那么,模 \\(p\\) 的二次非剩余也有 \\(\\fracp-12\\) 个。
证毕

定理 2(Euler 判别法) 设素数 \\(p>2\\)\\(p\\not\\mid d\\),那么 \\(d\\) 是模 \\(p\\) 的充分必要条件是 \\(d^\\fracp-12\\equiv 1\\pmod p\\)\\(d\\) 是模 \\(p\\) 的充分必要条件是 \\(d^\\fracp-12\\equiv -1\\pmod p\\)
证明:首先因为 \\(\\gcd(d,p)=1\\)\\(p\\) 为素数,所以由费马小定理知,\\(d^p-1\\equiv 1\\pmod p\\),所以上述两个同余式有且仅有一式成立。
下证 \\(d\\) 是模 \\(p\\) 的二次剩余,的充分必要条件是 \\(d^\\fracp-12\\equiv 1\\pmod p\\)
必要性:如果 \\(d\\) 是模 \\(p\\) 的二次剩余,那么我们知道,一定有满足 \\(\\gcd(x_0,p)=1\\)\\(x_0\\) 使得 \\(x_0^2\\equiv d\\pmod p\\),再次使用费马小定理,得出 \\(d^\\fracp-12\\equiv x_0^p-1\\equiv 1\\pmod p\\)
充分性:如果 \\(d^\\fracp-12\\equiv 1\\pmod p\\),那么由于 \\(\\gcd(d,p)=1\\),所以对于任意的 \\(x\\in[1,p-1]\\),必有唯一的 \\(a_x\\in[1,p-1]\\) 满足 \\(a_xx\\equiv d\\pmod p\\)。如果 \\(d\\) 不是模 \\(p\\) 的二次剩余,那么我们知道所有的 \\(a_x\\ne x\\),所以既约剩余系中的所有 \\(p-1\\) 个数就可以 \\(a_x,x\\) 作为一对,两两分完,分成 \\(\\fracp-12\\) 组。再用上 Wilson 定理,所以知道 \\(d^\\fracp-12\\equiv (p-1)!\\equiv -1\\pmod p\\),矛盾!所以 \\(d\\) 一定是模 \\(p\\) 的二次剩余。
证毕

推论 3 -1 是模 \\(p\\) 的二次剩余的充分必要条件是 \\(p\\equiv 1\\pmod 4\\),当 \\(p\\equiv 1\\pmod 4\\) 时,\\((\\pm(\\fracp-12)!)^2\\equiv -1\\pmod p\\)
证明:由定理 2 知,-1 是模 \\(p\\) 的二次剩余的充要条件是 \\((-1)^\\fracp-12\\equiv 1\\pmod p\\),所以得知 \\(\\fracp-12\\) 是个偶数。所以 \\(p\\equiv 1\\pmod 4\\)。由 Wilson 定理知,\\(-1\\equiv (p-1)!\\equiv (-1)^\\fracp-12((\\fracp-12)!)^2\\pmod p\\),所以得知 \\(p\\equiv 1\\pmod 4\\) 时,\\((\\pm(\\fracp-12)!)^2\\equiv -1\\pmod p\\)
证毕

推论 4 设素数 \\(p>2,p\\not\\mid d_1,p\\not\\mid d_2\\),那么
\\((i)\\)\\(d_1,d_2\\) 均为模 \\(p\\) 的二次剩余,则 \\(d_1d_2\\) 也是模 \\(p\\) 的二次剩余。
\\((ii)\\)\\(d_1,d_2\\) 均为模 \\(p\\) 的二次非剩余,则 \\(d_1d_2\\) 是模 \\(p\\) 的二次剩余。
\\((iii)\\)\\(d_1\\) 是模 \\(p\\) 的二次剩余,\\(d_2\\) 是模 \\(p\\) 的二次非剩余,则 \\(d_1d_2\\)\\(p\\) 的二次剩余。
由 Euler 判别法易知(\\((d_1d_2)^\\fracp-12=d_1^\\fracp-12·d_2^\\fracp-12\\))。

数论ex

数论ex

数学学得太差了补补知识点or复习

Miller-Rabin 和 Pollard Rho

  • Miller-Rabin

    前置知识:

    1. 费马小定理
      \[ a^{p-1}\equiv 1\pmod p,p \ is \ prime \]

    2. 二次探测(mod奇素数下1的二次剩余)
      \[ x^2\equiv 1\pmod p\Rightarrow x=1 \ or \ p-1 \]
      如果不是 \(\bmod\) 奇素数,二次剩余可能是更多的值

    如果把费马小定理反过来用来检测一个数是否是素数,虽然是错的,但是反例比较少,如果配合二次探测进行测试并取多个a,可以把1e18内的所有数是否是质数判断出来。

    具体的,取\(a\)为前\(12\)个质数\((2,3,5,7,11,13,17,19,23,29,31,37)\)

    然后用费马小定理进行测试,如果\(a^{p-1}\equiv 1\pmod p\),就根据二次探测检验是否有\(a^{(p-1)/2}\equiv 1\pmod p\),如果值为\(1\),就递归\((p-1)/4\)处理,如果值为\(p-1\),无法向下递归直接返回true,否则返回false

    Code:

    const int pri[]={2,3,5,7,11,13,17,19,23,29,31,37};
    bool ck(ll a,ll k,ll p)
    {
        ll x=qp(a,k,p);//a^k mod p
        if(x!=1&&x!=p-1) return false;
        if(x==p-1) return true;
        if(k&1) return true;
        return ck(a,k>>1,p);
    }
    bool Miller_Rabin(ll p)
    {
        if(p==1) return false;
        for(int i=0;i<12;i++) if(p%pri[i]==0) return p==pri[i];
        for(int i=0;i<12;i++)
            if(!ck(pri[i],p-1,p))
                return false;
        return true;
    }

    这样做的复杂度是\(12\log^2 n\),其中因子2的个数是一个\(\log\),里面每次还做了一次快速幂,如果里面用了龟速乘就更完蛋了。

    考虑从底向上做,就是说,先求出\(x-1\)除2到不能除的最底层的\(x\),这样每次向上一层直接就是\(x^2\)

    考虑在某一层\(x=1\),那么如果之前的一层的\(x'\not=p-1\)的话,就不合法了,或者在最上面一层\(x\)仍然不为\(1\),也是不合法的

    这样就优化掉了一个\(\log\)

    Code:

    const int pri[]={2,3,5,7,11,13,17,19,23,29,31,37};
    bool Miller_Rabin(ll p)
    {
        if(p==1) return false;
        for(int i=0;i<12;i++) if(p%pri[i]==0) return p==pri[i];
        ll res=p-1;int k=0;
        while(!(res&1)) res>>=1,++k;
        for(int i=0;i<12;i++)
        {
            ll x=qp(pri[i],res,p);
            for(int j=0;j<k&&x>1;j++)
            {
                ll y=(ll)x*x%p;
                if(y==1&&x!=p-1) return false;
                x=y;
            }
            if(x!=1) return false;
        }
        return true;
    }

    洛谷 P3383 【模板】线性筛素数

    完整Code

  • Pollard Rho

    朱老大说的非常好

    我再胡乱说一个自己瞎编的假装是给自己看的,说一下流程把

    首先是不加倍增优化的

    考虑在\(n\)范围内rand两个数\(x,y\),如果\(\gcd(x+n-y\bmod n,n)\not=1,n\),那么\(|x-y|\)就是一个\(n\)的约数。

    现在搞一个近似随机函数\(f\),保证\(f\)\(\bmod n\)近似均匀随机

    \(f_m(x)=f(f_{m-1}(x))\),因为\(f\)取值有限,所以一定会出现循环,考虑在出现循环的时候如果我们还没有找到约数,我们就退出。

    具体的,初始\(x=y=rand()\),然后\(x\)一步一步跳,\(x'=f(x)\)\(y\)两步两步跳\(y'=f(f(y))\),如果\(x\)\(y\)又跳到相等了,就说明找到了环,可以证明这个环最多被走一次就找到了。

    发现\(f(x)=x^2+c\)的时候效果好,\(c\)是随机正整数。

    于是我们每次\(rand()\)一个\(x,y\)\(c\)去找一个约数,然后分解\(n\),递归子问题继续找,知道Miller Rabin检测\(n\)为素数。

    这样的复杂度是\(O(n^{\frac{1}{4}}\log n)\)

    考虑去优化掉\(\log\)

    打雀去了,明天再写

以上是关于模为素数的二次剩余的主要内容,如果未能解决你的问题,请参考以下文章

二次剩余(简单理解)

二次剩余学习小记

数论ex

二次剩余

二次剩余 Cipolla算法

二次剩余定理及Cipolla算法入门到自闭