大纲
-
要点:素数无穷,素数分布(素数定理),唯一分解定理,最大公因子,欧几里得算法,整数分解,费马数,丢番图方程。
-
尽管数学家做了几百年的努力,仍有关于素数的许多问题未被解决。
- 我们将选取讨论其中的一些,包括最著名的两个:孪生素数猜想 和 哥德巴赫(Goldbach)猜想。
-
在数论中常常研究具有特殊形式的数。本章中,我们将介绍 费马数 ,即形如 2 n + 1 2^n+1 2n+1 的整数。(费马猜想它们都是素数,但是这被证明是不对的)。
-
最后,我们将介绍 丢番图方程,它是只考虑整数解的方程。
-
我们将证明如何用最大公因子来帮助求解 线性丢番图方程。
-
与其他丢番图方程不同,线性丢番图方程能够容易地系统解决。
-
3.1 素数
定义:素数是大于 1 1 1 的正整数,并且除了 1 1 1 和它本身外不能被其他正整数所整除。
定义:大于 1 1 1 的不是素数的正整数称为合数。
本节将讨论 给定正整数集中素数的分布 并 证明该分布的一些基础性质 。同时还将讨论关于素数分布的一些更强的结论。
在我们将要介绍的定理中包含了数论中一些最著名的结论。
「素数的无限性」:我们从证明有无穷多个素数开始,为此需要下面的引理。
我们将在本章的后面介绍一些证明素数无穷性的其他方法。(见这一节末尾的习题8以及3.3、3.5和3.6节的习题)。
引理 3.1-每个大于 1 的正整数都有一个素因子
引理3.1:每个大于 1 1 1 的正整数都有一个素因子。
证明:反证法。假设存在一个大于 1 的正整数没有素因子,那么大于 1 且没有素因子的正整数构成的集合非空,由良序性知集合中存在一个大于 1 且没有素因子的最小正整数 n n n 。由于 n n n 能被 n n n 整除且 n n n 没有素因子,因此 n n n 不是素数。于是 n n n 可以写成 n = a × b n=a\times b n=a×b ,其中 1 < a < n 1<a<n 1<a<n , 1 < b < n 1<b<n 1<b<n 。因为 a < n a<n a<n ,所以 a a a 一定有素因子。由定理 1.8, a a a 的任何因子也是 n n n 的因子,因此 n n n 必有素因子。与假设矛盾。所以我们就得到结论:任何一个大于 1 1 1 的正整数至少有一个素因子。
定理 3.1-素数无限性
定理3.1:存在无穷多个素数。
证明:假设只有有限个素数 p 1 , p 2 , ⋯ , p n p_1,p_2,\cdots,p_n p1,p2,⋯,pn ,其中 n n n 是正整数,考虑整数 Q n = p 1 p 2 ⋯ p n + 1 Q_n=p_1p_2\cdots p_n+1 Qn=p1p2⋯pn+1 。由引理 3.1, Q n Q_n Qn 至少有一个素因子,设为 q q q 。如果 q = p j q=p_j q=pj ,其中 j j j 为某个整数且 1 ≤ j ≤ n 1\le j\le n 1≤j≤n 。由于 Q n − p 1 p 2 ⋯ p n = 1 Q_n-p_1p_2\cdots p_n=1 Qn−p1p2⋯pn=1 ,且 q q q 可以整除 Q n Q_n Qn, p 1 p 2 ⋯ p n p_1p_2\cdots p_n p1p2⋯pn ,因此由定理 1.9, q ∣ 1 q\mid 1 q∣1 。这显然是不可能的,因为 1 不能被任何素数整除。于是 q q q 不是 p j p_j pj 的任何一个。这与假设矛盾。
证毕。 ■ \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\blacksquare ■
定理 3.1 的证明过程不是构造性的,因为我们在证明中构造的整数 Q n Q_n Qn(由前 n n n 个素数的积加 1 得到)可以是素数也可以不是(见习题11)。因此,在证明过程中我们只是知道存在一个新的素数但是并没有求得它。
求素数:在下面的章节中,我们将把兴趣放在 如何求大素数 和 使用大素数 上。
定理 3.2 合数必有一个不超过 sqrt(n) 的素因子
将素数和合数加以区分的测试是至关重要的,这种测试叫做 素性检验。最基本的素性检验是「试除法」。
bool is_prime()
{
for(int i = 2; i <= sqrt(n); i++) {
if(n % i == 0)
return false;
}
return true;
}
定理3.2:如果 n n n 是一个合数,那么 n n n 一定有一个不超过 n \sqrt{n} n 的素因子。
证明:既然 n n n 是合数,那么 n n n 可以写成 n = a × b n=a\times b n=a×b,其中 a, b 为整数且 1 < a ≤ b < n 1<a≤b<n 1<a≤b<n 。
我们一定有 a ≤ n a\le \sqrt{n} a≤n ,否则若 b ≥ a > n b\ge a>\sqrt{n} b≥a>n,那么有 a × b > n × n = n a\times b>\sqrt{n}\times\sqrt{n}=n a×b>n×n=n 。由引理3.1, a a a 至少有一个素因子,再由定理1.8, a a a 的因子一定也是 n n n 的因子,显然这个因子小于等于 n \sqrt{n} n 。
证毕。 ■ \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\blacksquare ■
给定一个正整数 n n n ,使用定理 3.2 可以找到所有小于等于 n n n 的素数。这种方法就是「埃拉托色尼斯筛法」。
int primes[1000], cnt;
bool is_prime[1000];
for(int i = 2; i <= n; i++)
{
if(is_primes[i]) continue;
primes[++cnt] = i;
if(i <= sqrt(n))
{
// 使用小于等于sqrt(n)的所有质数即可
for(int j = i * i; j <= n; j += i)
is_primes[j] = true;
}
}
对于一个特定的整数 n n n ,我们将在后面给出一个更好的方法来判断一个整数是否是素数,即定理 6.11。
定理 3.3 狄利克雷
定理3.3(狄利克雷关于「等差数列中素数的定理」):假设 a , b a,b a,b 是互素的整数,那么等差数列 a n + b ( n = 1 , 2 , 3 , ⋯ ) an+b\ (n=1,2,3,\cdots) an+b (n=1,2,3,⋯) 包含了无穷多的素数。
- 目前为止狄利克雷定理没有简单的证法。(狄利克雷的原始证明使用了复变量。后来爱尔迪希(Erdos)和塞尔伯格(Selberg)在 20世纪 50年代给出了一个初等但较复杂的证明)。
- 但是狄利克雷定理的一些特例很容易证。我们将通过在 3.5 节中证明有无穷多个 4 n + 3 4n+3 4n+3 型的素数来说明这一点。
已知的最大素数:在近千百年的历史中,数学家和一些数学爱好者们总是试图找到一个比已知的最大素数更大的素数。一个人会因为找到这样的素数而至少在当时一举成名,并且他或她的名字也将被载入史册。因为有无穷多的素数,因而总有素数比当时的已知最大素数要大。寻找新素数也有一些系统化的方法。人们并不是随机挑选一些数来检验其是否为素数,而是选取一些特殊形式的数。例如,我们将在第7章中讨论具有 2 p − 1 2^p-1 2p−1 形式的素数,其中是 p p p 素数;这种数被称为 梅森素数(Mersenne primes)。我们将看到用一种特殊的测试可以检验出 2 p − 1 2^p-1 2p−1 是否为素数,而不需要用试除法。过去几百年中多数时间里最大的素数一直是梅森素数。目前已知的最大素数的世界纪录是 2 43 112 609 − 1 2^{43\ 112\ 609}-1 243 112 609−1 。
素数公式
- 是否有一个公式只产生素数呢?
- 关于一个变元的多项式没有这种性质,习题23证明了这一点。同样,关于 n n n 个变元的多项式不能只产生素数,其中 n n n 是一个正整数(这个结论超出了本书的范围)。
- 有一些可以只产生素数的公式但是不实用。例如,米尔斯(Mills)证明了存在一个常数 Θ \varTheta Θ 使得函数 f ( n ) = [ Θ 3 n ] f(n)=[\varTheta^{3^n}] f(n)=[Θ3n] 只生成素数,我们只知道 Θ \varTheta Θ 的近似值 Θ ≈ 1.3064 \varTheta\approx1.3064 Θ≈1.3064 。
如果没有一个实用的公式可以产生大素数,那么怎么才能生成它们呢?在第6章中将介绍如何用概率素性检验法来生成大素数。
素性证明
-
在 广义黎曼猜想 成立的条件下,米勒(G. L. Miller)于1975年给出了一个可用 O ( ( log n ) 5 ) O((\log{n})^5) O((logn)5) 次位运算来证明一个整数是素数的算法。但可惜的是,广义黎曼猜想到现在尚未被证明。
-
★ \bigstar ★ 由于广义黎曼猜想并没有被证明,其后由Michael O. Rabin教授作出修改,提出了不依赖于该假设的 随机化算法。
-
在1983年,Leonard Adleman、Carl Pomerance和Robert Rumely建立了一个计算复杂度为 ( log n ) c log log log n (\log n)^{c\ \log\log\log{n}} (logn)c logloglogn 的算法,其中 c c c 是常数。
-
虽然他们的算法不是 多项式时间 ,但是它已经接近多项式时间了,因为 log log log n \log\log\log{n} logloglogn 增长得非常慢。
-
使用他们的算法结合现在的计算机确定一个100位的整数是否为素数只需几毫秒,确定一个400位的整数是否为素数用时不超过 1 秒,而确定一个1000位的整数是否为素数用时少于一个小时。
-
-
素性验证的多项式时间算法
- 2002年,一位印度计算机教授
- 我们现在只是讨论了素性检验中的「确定性算法」(deterministic algorithms),即用来确定一个整数是否为素数的算法。
- 在第6章中我们将讨论 概率素性检验法,即 米勒-拉宾算法,定理6.11 。这个测试将告诉我们一个整数有很高的可能性是素数,但并不确定其为素数。
3.2 素数的分布
在18世纪后期,数学家们通过手算建立了素数表。通过这些数值,他们开始寻找函数来估计 π ( x ) \pi(x) π(x) 。
定理 3.4-素数定理
定义:函数 π ( x ) \pi(x) π(x) 表示不超过 x x x 的素数的个数,其中 x x x 是正实数。
定理3.4(素数定理):随着 x x x 的无限增长, π ( x ) \pi(x) π(x) 和 x ln x \dfrac{x}{\ln{x}} lnxx 的比趋于 1 1 1。
如果用极限的语言来表述,我们有 lim x → ∞ π ( x ) ( x / ln x ) = 1 \lim\limits_{x \to \infty} \dfrac{\pi(x)}{(x/\ln x)}=1 x→∞lim(x/lnx)π(x)=1。
用一个简单的方法来表述素数定理是写成 π ( x ) ∽ x ln x \pi(x)\backsim\dfrac{x}{\ln{x}} π(x)∽lnxx。这里符号 ∽ \backsim ∽ 表示渐进于。
推论 3.4.1 第 n 个素数的大小
推论3.4.1:令 p n p_n pn 是第 n n n 个素数,其中 n n n 是正整数,那么 p n ∽ n log n p_n\backsim n\log n pn∽nlogn ,即第 n n n 个素数渐进于 log n \log{n} logn 。
随机选到素数的概率
如果随机地选择一个正整数,那么它是素数的概率有多大呢?
定理 3.5
定理3.5:对于任意的正整数 n n n,存在至少 n n n 个连续的正合数。
证明:
关于素数的猜想
- 伯兰特猜想;
- 「孪生素数猜想」;
- 「哥德巴赫猜想」:每个大于 2 2 2 的正偶数可以写成两个素数的和。
- 素数等差数列的「厄尔多斯猜想」:对任意的正整数 n ≥ 3 n\ge 3 n≥3,有一个由素数组成的长度为 n n n 的等差数列。
- 2006年Ben Green和陶哲轩取得了突破性进展从而证明了该猜想。
- n 2 + 1 n^2+1 n2+1 猜想:存在无穷多个形如 n 2 + 1 n^2+1 n2+1 的素数,其中 n n n 是正整数。
- 勒让德猜想
3.3 最大公因子及其性质
定理 3.6
定理3.6 : a , b a,b a,b 是整数,且 ( a , b ) = d (a,b)=d (a,b)=d ,那么 ( a d , b d ) = 1 (\dfrac{a}{d},\dfrac{b}{d})=1 (da,db)=1 。(换言之, a / d a/d a/d 与 b / d b/d b/d 互素)。
证明:假设还有其他正整数 e e e 使得 e ∣ ( a / d ) e\mid (a/d) e∣(a/d) 且 e ∣ ( b / d ) e\mid (b/d) e∣(b/d) ,那么存在整数 k k k 和 l l l 使得 a / d = k e a/d=ke a/d=ke , b / d = l e b/d=le b/d=le ,于是 a = d k e a=dke a=dke , b = d l e b=dle b=dle 。因此 d e de de 是 a , b a,b a,b 的公因子。因为 d d d 是 a , b a,b a,b 的最大公因子,故 d e ⩽ d de\leqslant d de⩽d ,于是 e = 1 e=1 e=1 。因此 ( a d , b d ) = 1 (\dfrac{a}{d},\dfrac{b}{d})=1