Loading

浅谈二次剩余——求解二次同余方程

1.二次同余式

二次同余式是关于未知数的二次多项式的同余方程。即:是一个二次同余方程。
此外,称为最简二次同余式,或称最简二次同余方程。
一般的,通过配方,可以把一个一般的二次同余方程转化为一个最简二次同余式
接下来只需要讨论最简二次同余式。

2二次剩余

2.1 前置概念、定理即证明:

若无特殊说明,下面的模运算都是在模p的意义下

1.有正整数n,奇质数p,且\(p\nmid n\),若存在一个正整数x,使得\(x^2\equiv n(\bmod p)\)则称n为p的二次剩余。

2.勒让德符号 \(\begin{pmatrix}\dfrac{n}{p}\end{pmatrix}\),若n为p的二次剩余,则该值为1,若不是则该值为-1,若\(p\mid n\),则该值为0

定理1:\(\begin{pmatrix}\dfrac{n}{p}\end{pmatrix}\equiv n^{\frac{p-1}{2}}\)

证明:
1.若p能整除n,那右边明显模p与0同余,故成立。
2.若n是p的二次剩余,则根据费马小定理(\(n^{p-1}\equiv1(\bmod p)\)其中,p为质数),有\(n^{\frac{p-1}{2}} = {\sqrt{n}^{p-1}}\equiv 1\),故成立
3.若n不是p的二次剩余,则根据扩展欧几里得算法,对于\(i\in[1,p-1]\)都有唯一的\(j\in[1,p-1],i\neq j且ij\equiv n\)这样的数一共有\(\frac{p-1}{2}\)个,因此\(\frac{p-1}{2}\equiv (p-1)!\)根据威尔逊定理)(:当且仅当p为素数时有:\(( p -1 )! \equiv -1 ( \bmod p )\)),就有\(\frac{p-1}{2}\equiv -1\)

​ 证毕

威尔逊定理证明:

​我们知道\(1\times1\equiv 1(mod p)\)\(,( − 1 ) \times ( − 1 )\equiv (mod p)\),且仅有这两组的逆元与本身相等。如果\(x^2\equiv 1(\bmod p)\)那么通过移项再因式分解可以得到\(x=-1\)\(x=1\),除了1,-1这两个数之外,2至p-2中的每一个数都一定有一个对应的逆元(注明:\(-1\equiv p-1(\bmod p)\))且一定与自己不相等,且每一个数与他的逆元一 一对应。

​ 如果p是2,那威尔逊定理显然成立,如果\(p>2\) ,那么p一定是一个奇数,从2到p-2一共有偶数个数,且他们两两相乘mod p都是1,在乘上1(mod p为1)和p-1(mod p为-1)两个数,就有\((p-1)!\equiv -1(\bmod p)\) 需要注意的是,一个数有逆元的充分必要条件是这个数与p互素,上述证明的前提是1到p-1都有逆元,即1到p-1都与p互素,自然,p是一个质数。

上面的证明并不严谨,但能看出,只有质数才能满足威尔逊定理,满足威尔逊定理的也只有是质数,所以,威尔逊定理是质数的充要条件。

​ 证毕

​ 定理1推论:若方程最简二次同余式有解的充要条件是\(n^{\frac{p-1}{2}}\equiv 1(\bmod p)\)

定理2.\([1,p-1]\)中有\(\frac{p-1}{2}\)个二次剩余。

证明:
\(x,y\in [1,p-1],x\neq y,x^2\equiv y^2\),则\((x-y)(x+y)\equiv 0\) 由于有\(0<|x-y|<p\),所以必定是\(x+y\equiv 0\) ,满足左边这个式子的数对共有\(\frac{p-1}{2}\)个,每两个不同的数对,它们之间的平方相互不同余,简单证明可以发现,如果两个不同平方数\(x^2\)\(y^2\)mod质数p同余(满足\(x,y\in [1,p-1]\)),当且仅当它们互为相反数,证明就和上面的推理过程一样,移项分解因式即可。与此同时,每个数对内部的数的平方mod p同余。这样,在mod p意义下,定理得证。

​ 证毕

​ 这同时还说明,如果a是p的一个二次剩余,p-a也是p的一个二次剩余。

2.2求解最简二次同余式&二次剩余

方法:在\([0,p-1]\)中随机生成一个数a,另\(w=a^2-n\),若\(\begin{pmatrix}\dfrac{w}{p}\end{pmatrix}=-1\) ,那么\((a+\sqrt{w})^{\frac{p-1}{2}}\)是x的一个解。

证明:

​ 显然有\(\tbinom{p}{x}\equiv 0 (\bmod p)\),(这是二项式系数,不要和勒让德符号弄混),因此,\((a+\sqrt{w})^p=\sum_{i=0}^p \tbinom{p}{i}a^i(\sqrt{w})^{p-i}\equiv a^p+(\sqrt{w})^p\)(注明:以上是二项式定理),根据费马小定理,有\(a^{p-1}\equiv 1(\bmod p)\)所以有\(a^p\equiv a (\bmod p)\) (注意,费马小定理强调a是整数,所以对\((\sqrt{w})^p\)并不能使用费马小定理)根据定理1,\((\sqrt{w})^p=\sqrt{w}\times w^{\frac{p-1}{2}}=-\sqrt{w}\) ,因此有\((a+\sqrt{w})^{p-1}=(a+\sqrt{w})\times(a+\sqrt{w})^p\equiv (a+\sqrt{w})(a^p+(\sqrt{w})^p)\)

\((a+\sqrt{w})(a^p+(\sqrt{w})^p)\equiv (a+\sqrt{w})(a-\sqrt{w})=a^2-w=n\)

故有\((a+\sqrt{w})^{p-1}\equiv n\),所以\((a+\sqrt{w})^{\frac{p-1}{2}}\)为原方程的一个解。

​ 证毕

可能大家会有疑惑,不是正整数吗?这个根号下w无论怎么看那都是一个实数啊,其实不然,n是p的二次剩余,并且该解满足条件,那么该解在mod p意义下一定是一个整数,但是实数怎么参与取模运算呢?我们利用扩域的思想,数学家在从实数想复数扩域时,定义了一个\(a+bi\)这里我们同样可以借鉴,定义一个\(a+b\sqrt{w}\),记录时只记录a和b,然后利用\((a_1+b_1\sqrt{w})(a_2+b_2\sqrt{w})=(a_1a_2+b_1b_2w)+(a_1b_2+a_2b_1)\sqrt{w}\)去定义这个域上的乘法运算(别忘取余),可以实现快速幂。

由于\([1,p-1]\)一中有一般的数都是二次剩余,所以我们随机的期望次数为2

同时,如果\(x_1\)满足方程,那么在mod p意义下它的相反数也满足方程,即\(p-x_1\)

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<deque>
#include<cstdlib>
#include<ctime>
#define dd double
#define ll long long
#define ld long double
#define ull unsigned long long
#define N number
#define M number
using namespace std;

ll n,p,w;
int t;

inline ll ksm(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1) res=(res*a)%p;
		a=(a*a)%p;
		b>>=1;
	}
	return (res%p+p)%p;
}

inline ll lrd(ll x){
	return ksm(x,(p-1)>>1);
}

struct rode{
	ll x,y;
	inline void intt(ll x_,ll y_){
		x=x_;y=y_;
	}
};

inline rode operator * (const rode &a,const rode &b){
	rode c;c.intt(((a.x*b.x)%p+a.y*b.y%p*w%p)%p,(a.x*b.y%p+a.y*b.x%p)%p);
	return c;
}

inline rode operator ^ (rode a,ll b){
	rode c;c.intt(1,0);
	while(b){
		if(b&1) c=c*a;
		a=a*a;
		b>>=1;
	}
	return c;
}

inline void solve(ll x){
	int if_=lrd(x);
	if(if_==p-1) printf("Hola!\n");
	else if(if_==0) printf("0\n");
	else{
		ll q=rand()%p;w=(((q*q)%p-n)%p+p)%p;
		while(lrd(w)<=1) q=rand()%p,w=(((q*q)%p-n)%p+p)%p;
		rode a;a.intt(q,1);
		a=a^((p+1)>>1);
		ll ans1=a.x,ans2=p-ans1;
		if(ans1>ans2) ans1^=ans2,ans2^=ans1,ans1^=ans2;
		printf("%lld %lld\n",ans1,ans2);
	}
}

int main(){
	srand(time(0));
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld",&n,&p);
		solve(n);
	}
	return 0;
}

还记得“每两个不同的数对,它们之间相互不同余”吗?这也说明,对于一个二次剩余\(y^2(\bmod p)\)来说,它有且只有两个解,\(x\)\(p-x\)

参考资料

1.https://blog.csdn.net/dmt38421/article/details/102018271?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control威尔逊定理证明

2<https://baike.baidu.com/item/%E4%BA%8C%E6%AC%A1%E5%90%8C%E4%BD%99%E5%BC%8F>百度百科二次同余式

3.https://www.luogu.com.cn/blog/ILikeDuck/gao-si-zheng-shuo-yu-er-ci-sheng-yu洛谷日报

posted @ 2021-02-06 19:55  hyl天梦  阅读(4861)  评论(0编辑  收藏  举报