哪些素数可表成两个平方数之和
定理 设pp是素数,则是两平方数之和的充要条件是p≡1 (mod 4)p≡1 (mod 4) 或p=2p=2
这里有两个断言
- 断言A pp是两平方数之和
- 断言B
显然,要证明充要性,有两方面
1.若pp是两平方数之和,则 ,接着对两边取勒让德符号
于是由二次互反律知,pp模4余1。证毕
2.我们从开始,如果这里M=1M=1则证明完毕。所以我们考虑M≥2M≥2
费马的想法是,我们用现有的A,B,MA,B,M,要是能构造出a2+b2=mp 且 m≤M−1a2+b2=mp 且 m≤M−1
则迭代下去,m=1m=1时就完成了证明。这种方法称为费马降价法。
但是费马没有给出具体构造的方法。
在说具体的构造方法之前,先看一个恒等式
这个式子很好证明。
下面我们考虑怎么构造费马降价法,过程如下:
重复这个过程直到r=1r=1,可以证明每迭代一次,pp的系数至少减半。即迭代次数为次
为了说明上述ProcedureProcedure的正确性,我们要证明5个断言的正确性。
- 找出数A,BA,B使得A2+B2=MpA2+B2=Mp,且M<pM<p 。为此,取同余式x2≡−1 (mod p)x2≡−1 (mod p)的一个解,由二次互反律知,当p%4=1p%4=1时,必定有解xx。所以具有性质p | A2+B2p | A2+B2,而且M=A2+B2p≤(p−1)2+12p<pM=A2+B2p≤(p−1)2+12p<p。
在降阶程序的第二步,我们选取u,vu,v使其满足
于是有
设u2+v2=rMu2+v2=rM,其余四个断言如下:
- r≥1r≥1
- r<Mr<M
- uA+vBuA+vB能被MM整除
- 能被MM整除
这四个断言比较容易证明。这里不再给出。
上面求解过程中关键的一步使求解,可以直接使用二次剩余的板子,也可以使用随机算法。
即随机一个a∈[1,p−1]a∈[1,p−1] ,求解b≡a(p−1)/4 (mod p)b≡a(p−1)/4 (mod p),可知b2≡(ap) (mod p)b2≡(ap) (mod p),即若选取的aa不是的二次剩余(有一半的概率),则求得的bb即为解。
由定理知有两个解x1,x2x1,x2,且x1+x2=px1+x2=p。
//求解x^2 \equiv -1 (mod p)
ll ran(ll n){
//要保证n%4=1
assert(n%4==1);
srand(time(0));
for(;;){
ll a=rand()*rand()%(n-1)+1;
ll b=fast_exp(a,(n-1)/4,n);
if(b*b%n==n-1) return b<=(n-1)/2 ? b:n-b;
}
}