浅谈二次剩余

二次剩余是数论基本概念之一,它是初等数论中非常重要的结果。
什么是二次剩余呢?简单来说就是如果存在一个整数 x x x,使得 x 2 ≡ n ( m o d   p ) x^2≡n(mod\ p) x2n(mod p),那么则称 n n n是模 p p p的二次剩余。
有一种很巧妙的办法,可以得出一个数是否是模 p p p的二次剩余。这个办法是勒让德符号 ( n p ) (\frac{n}{p}) (pn)

如果 n n n是模 p p p的二次剩余,那么 ( n p ) = 1 (\frac{n}{p})=1 (pn)=1
如果 n n n不是模 p p p的二次剩余,那么 ( n p ) = − 1 (\frac{n}{p})=-1 (pn)=1
如果 p ∣ n p|n pn,则 ( n p ) = 0 (\frac{n}{p})=0 (pn)=0

这里有一个结论: ( n p ) = n p − 1 2 (\frac{n}{p})=n^{\frac{p-1}{2}} (pn)=n2p1 (前提是 p p p是奇质数)

证明:(不看也无所谓)
①如果 n n n是模 p p p的二次剩余,那么 n \sqrt n n p p p互质,那么根据费马小定理 ( n ) p − 1 ≡ 1 ( m o d   p ) (\sqrt n)^{p-1}≡1(mod\ p) (n )p11(mod p)
②如果 n n n不是模 p p p的二次剩余,那么因为 p p p是奇质数,所以根据扩欧可知对于 i ∈ [ 1 , p − 1 ] i∈[1,p-1] i[1,p1],都有一个 j ∈ [ 1 , p − 1 ] j∈[1,p-1] j[1,p1]使其满足 i j ≡ n ( m o d   p ) ij≡n(mod\ p) ijn(mod p)。所以我们可以把 1 , 2 … … p − 1 1,2……p-1 1,2p1分成 p − 1 2 \frac{p-1}{2} 2p1对,每对的乘积在模 p p p下都是 n n n,那么 ( p − 1 ) ! ≡ n p − 1 2 ( m o d   p ) (p-1)!≡n^{\frac{p-1}{2}}(mod\ p) (p1)!n2p1(mod p),根据威尔逊定理有 ( p − 1 ) ! ≡ − 1 ( m o d   p ) (p-1)!≡-1(mod\ p) (p1)!1(mod p),所以 n p − 1 2 ≡ − 1 ( m o d   p ) n^{\frac{p-1}{2}}≡-1(mod\ p) n2p11(mod p)
③如果 p ∣ n p|n pn,那么显然 n p − 1 2 ≡ 0 ( m o d   p ) n^{\frac{p-1}{2}}≡0(mod\ p) n2p10(mod p)

定理:对于方程 x 2 ≡ n ( m o d   p ) x^2≡n(mod\ p) x2n(mod p),有 p − 1 2 \frac{p-1}{2} 2p1个不同的 n n n,使得该方程有解。

证明:若有两个数 u u u v v v均满足它们的平方在 p p p时同余,那么必然有 p ∣ ( u + v ) ( u − v ) p|(u+v)(u−v) p(u+v)(uv)。由于 p p p不可能整除 u − v u−v uv,那么可以得出 p p p整除 u + v u+v u+v。这个结论反过来也是成立的,因此共有 p − 1 2 \frac{p-1}{2} 2p1种不同的平方。且每一个 p p p的二次剩余恰好有两个解。

那么怎么求一个二次剩余呢?我们可以按照下面的方法:

[ 0 , p − 1 ] [0,p-1] [0,p1]随机挑选一个数,称其为 a a a,定义 w = a 2 − n w=a^2-n w=a2n,若 ( w p ) = − 1 (\frac{w}{p})=-1 (pw)=1,那么 ( a + w ) p + 1 2 (a+\sqrt w)^{\frac{p+1}{2}} (a+w )2p+1就是一组二次剩余。

证明: ( a + w ) p = ∑ i = 0 p ( C p i a p − i ) ( C p p − i ( w ) i ) (a+\sqrt w)^{p}=\sum_{i=0}^{p}(C_{p}^{i}a^{p-i})(C_{p}^{p-i}(\sqrt w)^{i}) (a+w )p=i=0p(Cpiapi)(Cppi(w )i),由于 p p p是质数,所以除了 C p 0 C^{0}_{p} Cp0 C p p C_{p}^{p} Cpp 1 1 1外,所有的 C p i ( i ∈ [ 1 , p − 1 ] ) C_{p}^{i}(i∈[1,p-1]) Cpi(i[1,p1]) p p p等于 0 0 0,所以 ( a + w ) p ≡ a p + w p   ( m o d   p ) (a+\sqrt w)^{p}≡a^p+\sqrt w^p\ (mod\ p) (a+w )pap+w p (mod p)
由费马小定理可得 a p ≡ a ( m o d   p ) a^p≡a(mod\ p) apa(mod p),又因为 ( w p ) = − 1 (\frac{w}{p})=-1 (pw)=1 w p − 1 2 = − 1 w^{\frac{p-1}{2}}=-1 w2p1=1,所以 w p = − w \sqrt w^{p}=-\sqrt w w p=w
所以 ( a + w ) p ≡ a p + w p   ( m o d   p ) ≡ a − w ( m o d   p ) (a+\sqrt w)^{p}≡a^p+\sqrt w^p\ (mod\ p)≡a-\sqrt w(mod\ p) (a+w )pap+w p (mod p)aw (mod p)
所以 ( a + w ) p + 1 ≡ ( a + w ) p ( a + w ) ≡ ( a − w ) ( a + w ) ≡ a 2 − w ≡ n (a+\sqrt w)^{p+1}≡(a+\sqrt w)^{p}(a+\sqrt w)≡(a-\sqrt w)(a+\sqrt w)≡a^2-w≡n (a+w )p+1(a+w )p(a+w )(aw )(a+w )a2wn

有了最后一个定理,我们就可以通过随机选择a的值来找到一个满足条件的解。可以证明找到正解所需的次数的期望只有2(然而我并不是特别会证)。所以随机取a的值可以很快地找到一个解。

部分代码:

struct field{
	int x,y;
	field(int a=0,int b=0){
		x=a;y=b;
	}
};
field operator*(field a,field b){return field(a.x*b.x%p+a.y*b.y%p*w%p,a.x*b.y%p+a.y*b.x%p);}

int ran(){
	static int seed=23333;
	return seed=((((((ll)seed^20030927)%p+330802)%p*9410)%p-19750115+p)%p^730903)%p;
}

int pows(int a,int b){
	int base=1;
	while(b){
		if(b&1) base=base*a%p;
		a=a*a%p;b/=2;
	}
	return base;
}

field powfield(field a,int b){
	field base=field(1,0);
	while(b){
		if(b&1) base=base*a;
		a=a*a;b/=2;
	}
	return base;
}

int legander(int x){
	int a=pows(x,(p-1)/2);
	if(a+1==p) return -1;
	return a;
}

int surplus(int x){
	int a;
	if(legander(x)==-1) return 0;
	while(1){
		a=ran()%p;
		w=((a*a-x)%p+p)%p;
		if(legander(w)==-1) break;
	}
	field b=field(a,1);
	b=powfield(b,(p+1)/2);
	return b.x;
}

你可能感兴趣的:(----------数论,二次剩余)