浅谈二次剩余

本文深入探讨了数论中的二次剩余概念及其在模p条件下的性质,介绍了勒让德符号的应用,以及如何判断一个数是否为模p的二次剩余。通过费马小定理和威尔逊定理,证明了勒让德符号的计算公式,并提供了一种求解二次剩余的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

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

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

证明:(a+w)p=∑i=0p(Cpiap−i)(Cpp−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),由于ppp是质数,所以除了Cp0C^{0}_{p}Cp0CppC_{p}^{p}Cpp111外,所有的Cpi(i∈[1,p−1])C_{p}^{i}(i∈[1,p-1])Cpi(i[1,p1])ppp等于000,所以(a+w)p≡ap+wp (mod p)(a+\sqrt w)^{p}≡a^p+\sqrt w^p\ (mod\ p)(a+w)pap+wp (mod p)
由费马小定理可得ap≡a(mod p)a^p≡a(mod\ p)apa(mod p),又因为(wp)=−1(\frac{w}{p})=-1(pw)=1wp−12=−1w^{\frac{p-1}{2}}=-1w2p1=1,所以wp=−w\sqrt w^{p}=-\sqrt wwp=w
所以(a+w)p≡ap+wp (mod p)≡a−w(mod p)(a+\sqrt w)^{p}≡a^p+\sqrt w^p\ (mod\ p)≡a-\sqrt w(mod\ p)(a+w)pap+wp (mod p)aw(mod p)
所以(a+w)p+1≡(a+w)p(a+w)≡(a−w)(a+w)≡a2−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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值