模为素数的二次剩余
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
前置知识:
费马小定理
\[ a^{p-1}\equiv 1\pmod p,p \ is \ prime \]二次探测(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; }
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\)
打雀去了,明天再写
以上是关于模为素数的二次剩余的主要内容,如果未能解决你的问题,请参考以下文章