淺談二次剩餘——求解二次同餘方程

1.二次同餘式

二次同餘式是關於未知數的二次多項式的同餘方程。即:是一個二次同餘方程。
此外,稱爲最簡二次同餘式,或稱最簡二次同餘方程。
通常的,經過配方,能夠把一個通常的二次同餘方程轉化爲一個最簡二次同餘式
接下來只須要討論最簡二次同餘式。ios

2二次剩餘

2.1 前置概念、定理即證實:

若無特殊說明,下面的模運算都是在模p的意義下算法

1.有正整數n,奇質數p,且\(p\nmid n\),若存在一個正整數x,使得\(x^2\equiv n(\bmod p)\)則稱n爲p的二次剩餘。ui

2.勒讓德符號 \(\begin{pmatrix}\dfrac{n}{p}\end{pmatrix}\),若n爲p的二次剩餘,則該值爲1,若不是則該值爲-1,若\(p\mid n\),則該值爲0spa

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

證實:
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\)code

​ 證畢blog

威爾遜定理證實:ci

​咱們知道\(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)\))且必定與本身不相等,且每個數與他的逆元一 一對應。get

​ 若是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洛穀日報

相關文章
相關標籤/搜索