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