《初等数论及其应用》第三章 素数和最大公因子
大纲
要点:素数无穷,素数分布(素数定理),唯一分解定理,最大公因子,欧几里得算法,整数分解,费马数,丢番图方程。
尽管数学家做了几百年的努力,仍有关于素数的许多问题未被解决。
- 我们将选取讨论其中的一些,包括最著名的两个:孪生素数猜想 和 哥德巴赫(Goldbach)猜想。
在数论中常常研究具有特殊形式的数。本章中,我们将介绍 费马数 ,即形如 2n+12^n+12n+1 的整数。(费马猜想它们都是素数,但是这被证明是不对的)。
最后,我们将介绍 丢番图方程,它是只考虑整数解的方程。
我们将证明如何用最大公因子来帮助求解 线性丢番图方程。
与其他丢番图方程不同,线性丢番图方程能够容易地系统解决。
3.1 素数
定义:素数是大于 111 的正整数,并且除了 111 和它本身外不能被其他正整数所整除。
定义:大于 111 的不是素数的正整数称为合数。
本节将讨论 给定正整数集中素数的分布 并 证明该分布的一些基础性质 。同时还将讨论关于素数分布的一些更强的结论。
在我们将要介绍的定理中包含了数论中一些最著名的结论。
「素数的无限性」:我们从证明有无穷多个素数开始,为此需要下面的引理。
我们将在本章的后面介绍一些证明素数无穷性的其他方法。(见这一节末尾的习题8以及3.3、3.5和3.6节的习题)。
引理 3.1-每个大于 1 的正整数都有一个素因子
引理3.1:每个大于 111 的正整数都有一个素因子。
证明:反证法。假设存在一个大于 1 的正整数没有素因子,那么大于 1 且没有素因子的正整数构成的集合非空,由良序性知集合中存在一个大于 1 且没有素因子的最小正整数 nnn 。由于 nnn 能被 nnn 整除且 nnn 没有素因子,因此 nnn 不是素数。于是 nnn 可以写成 n=a×bn=a\times bn=a×b ,其中 1<a<n1<a<n1<a<n ,1<b<n1<b<n1<b<n 。因为 a<na<na<n ,所以 aaa 一定有素因子。由定理 1.8,aaa 的任何因子也是 nnn 的因子,因此 nnn 必有素因子。与假设矛盾。所以我们就得到结论:任何一个大于 111 的正整数至少有一个素因子。
定理 3.1-素数无限性
定理3.1:存在无穷多个素数。
证明:假设只有有限个素数 p1,p2,⋯,pnp_1,p_2,\cdots,p_np1,p2,⋯,pn ,其中 nnn 是正整数,考虑整数 Qn=p1p2⋯pn+1Q_n=p_1p_2\cdots p_n+1Qn=p1p2⋯pn+1 。由引理 3.1, QnQ_nQn 至少有一个素因子,设为 qqq 。如果 q=pjq=p_jq=pj ,其中 jjj 为某个整数且 1≤j≤n1\le j\le n1≤j≤n 。由于 Qn−p1p2⋯pn=1Q_n-p_1p_2\cdots p_n=1Qn−p1p2⋯pn=1 ,且 qqq 可以整除 QnQ_nQn,p1p2⋯pnp_1p_2\cdots p_np1p2⋯pn ,因此由定理 1.9, q∣1q\mid 1q∣1 。这显然是不可能的,因为 1 不能被任何素数整除。于是 qqq 不是 pjp_jpj 的任何一个。这与假设矛盾。
证毕。■\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\blacksquare■
定理 3.1 的证明过程不是构造性的,因为我们在证明中构造的整数 QnQ_nQn(由前 nnn 个素数的积加 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:如果 nnn 是一个合数,那么 nnn 一定有一个不超过 n\sqrt{n}n 的素因子。
证明:既然 nnn 是合数,那么 nnn 可以写成 n=a×bn=a\times bn=a×b,其中 a, b 为整数且 1<a≤b<n1<a≤b<n1<a≤b<n 。
我们一定有 a≤na\le \sqrt{n}a≤n ,否则若 b≥a>nb\ge a>\sqrt{n}b≥a>n,那么有 a×b>n×n=na\times b>\sqrt{n}\times\sqrt{n}=na×b>n×n=n 。由引理3.1,aaa 至少有一个素因子,再由定理1.8,aaa 的因子一定也是 nnn 的因子,显然这个因子小于等于 n\sqrt{n}n 。
证毕。 ■\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\blacksquare■
给定一个正整数 nnn ,使用定理 3.2 可以找到所有小于等于 nnn 的素数。这种方法就是「埃拉托色尼斯筛法」。
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;}
}
对于一个特定的整数 nnn ,我们将在后面给出一个更好的方法来判断一个整数是否是素数,即定理 6.11。
定理 3.3 狄利克雷
定理3.3(狄利克雷关于「等差数列中素数的定理」):假设 a,ba,ba,b 是互素的整数,那么等差数列 an+b(n=1,2,3,⋯)an+b\ (n=1,2,3,\cdots)an+b (n=1,2,3,⋯) 包含了无穷多的素数。
- 目前为止狄利克雷定理没有简单的证法。(狄利克雷的原始证明使用了复变量。后来爱尔迪希(Erdos)和塞尔伯格(Selberg)在 20世纪 50年代给出了一个初等但较复杂的证明)。
- 但是狄利克雷定理的一些特例很容易证。我们将通过在 3.5 节中证明有无穷多个 4n+34n+34n+3 型的素数来说明这一点。
已知的最大素数:在近千百年的历史中,数学家和一些数学爱好者们总是试图找到一个比已知的最大素数更大的素数。一个人会因为找到这样的素数而至少在当时一举成名,并且他或她的名字也将被载入史册。因为有无穷多的素数,因而总有素数比当时的已知最大素数要大。寻找新素数也有一些系统化的方法。人们并不是随机挑选一些数来检验其是否为素数,而是选取一些特殊形式的数。例如,我们将在第7章中讨论具有 2p−12^p-12p−1 形式的素数,其中是 ppp 素数;这种数被称为 梅森素数(Mersenne primes)。我们将看到用一种特殊的测试可以检验出 2p−12^p-12p−1 是否为素数,而不需要用试除法。过去几百年中多数时间里最大的素数一直是梅森素数。目前已知的最大素数的世界纪录是 243112609−12^{43\ 112\ 609}-1243 112 609−1 。
素数公式
- 是否有一个公式只产生素数呢?
- 关于一个变元的多项式没有这种性质,习题23证明了这一点。同样,关于 nnn 个变元的多项式不能只产生素数,其中 nnn 是一个正整数(这个结论超出了本书的范围)。
- 有一些可以只产生素数的公式但是不实用。例如,米尔斯(Mills)证明了存在一个常数 Θ\varThetaΘ 使得函数 f(n)=[Θ3n]f(n)=[\varTheta^{3^n}]f(n)=[Θ3n] 只生成素数,我们只知道 Θ\varThetaΘ 的近似值 Θ≈1.3064\varTheta\approx1.3064Θ≈1.3064 。
如果没有一个实用的公式可以产生大素数,那么怎么才能生成它们呢?在第6章中将介绍如何用概率素性检验法来生成大素数。
素性证明
在 广义黎曼猜想 成立的条件下,米勒(G. L. Miller)于1975年给出了一个可用 O((logn)5)O((\log{n})^5)O((logn)5) 次位运算来证明一个整数是素数的算法。但可惜的是,广义黎曼猜想到现在尚未被证明。
★\bigstar★ 由于广义黎曼猜想并没有被证明,其后由Michael O. Rabin教授作出修改,提出了不依赖于该假设的 随机化算法。
在1983年,Leonard Adleman、Carl Pomerance和Robert Rumely建立了一个计算复杂度为 (logn)clogloglogn(\log n)^{c\ \log\log\log{n}}(logn)c logloglogn 的算法,其中 ccc 是常数。
虽然他们的算法不是 多项式时间 ,但是它已经接近多项式时间了,因为 logloglogn\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) 表示不超过 xxx 的素数的个数,其中 xxx 是正实数。
定理3.4(素数定理):随着 xxx 的无限增长,π(x)\pi(x)π(x) 和 xlnx\dfrac{x}{\ln{x}}lnxx 的比趋于 111。
如果用极限的语言来表述,我们有 limx→∞π(x)(x/lnx)=1\lim\limits_{x \to \infty} \dfrac{\pi(x)}{(x/\ln x)}=1x→∞lim(x/lnx)π(x)=1。
用一个简单的方法来表述素数定理是写成 π(x)∽xlnx\pi(x)\backsim\dfrac{x}{\ln{x}}π(x)∽lnxx。这里符号 ∽\backsim∽ 表示渐进于。
推论 3.4.1 第 n 个素数的大小
推论3.4.1:令 pnp_npn 是第 nnn 个素数,其中 nnn 是正整数,那么 pn∽nlognp_n\backsim n\log npn∽nlogn ,即第 nnn 个素数渐进于 logn\log{n}logn 。
随机选到素数的概率
如果随机地选择一个正整数,那么它是素数的概率有多大呢?
定理 3.5
定理3.5:对于任意的正整数 nnn,存在至少 nnn 个连续的正合数。
证明:
关于素数的猜想
- 伯兰特猜想;
- 「孪生素数猜想」;
- 「哥德巴赫猜想」:每个大于 222 的正偶数可以写成两个素数的和。
- 素数等差数列的「厄尔多斯猜想」:对任意的正整数 n≥3n\ge 3n≥3,有一个由素数组成的长度为 nnn 的等差数列。
- 2006年Ben Green和陶哲轩取得了突破性进展从而证明了该猜想。
- n2+1n^2+1n2+1 猜想:存在无穷多个形如 n2+1n^2+1n2+1 的素数,其中 nnn 是正整数。
- 勒让德猜想
3.3 最大公因子及其性质
定理 3.6
定理3.6 :a,ba,ba,b 是整数,且 (a,b)=d(a,b)=d(a,b)=d ,那么 (ad,bd)=1(\dfrac{a}{d},\dfrac{b}{d})=1(da,db)=1 。(换言之,a/da/da/d 与 b/db/db/d 互素)。
证明:假设还有其他正整数 eee 使得 e∣(a/d)e\mid (a/d)e∣(a/d) 且 e∣(b/d)e\mid (b/d)e∣(b/d) ,那么存在整数 kkk 和 lll 使得 a/d=kea/d=kea/d=ke ,b/d=leb/d=leb/d=le ,于是 a=dkea=dkea=dke ,b=dleb=dleb=dle 。因此 dedede 是 a,ba,ba,b 的公因子。因为 ddd 是 a,ba,ba,b 的最大公因子,故 de⩽dde\leqslant dde⩽d ,于是 e=1e=1e=1 。因此 (ad,bd)=1(\dfrac{a}{d},\dfrac{b}{d})=1(da,db)=1 。
推论 3.6.1
如果 (p,q)=1(p\ ,q)=1(p ,q)=1 ,则分数 p/qp/qp/q 被称为既约分数。
下面的推论告诉我们每一个分数都与另一个既约分数相等。
推论3.6.1:如果 a,ba,ba,b 为整数,且 b≠0b\neq 0b=0 ,则 ab=pq\dfrac{a}{b}=\dfrac{p}{q}ba=qp ,其中 p,qp,qp,q 为整数,且 (p,q)=1,q≠0(p,q)=1,q\neq 0(p,q)=1,q=0 。
证明:假设 a,ba,ba,b 为整数且 b≠0b\ne 0b=0 ,令 p=a/dp=a/dp=a/d ,q=b/dq=b/dq=b/d ,其中 d=(a,b)d=(a,b)d=(a,b) ,则 p/q=(a/d)/(b/d)p/q=(a/d)/(b/d)p/q=(a/d)/(b/d) 。由定理 3.6 可知 (p,q)=1(p,q)=1(p,q)=1 。
定理 3.7 (a,b)=(a+cb,b)
定理3.7:令 a,b,ca,b,ca,b,c 是整数,那么 (a,b)=(a+cb,b)(a,b)=(a+cb,b)(a,b)=(a+cb,b) 。
证明:令 eee 是 a,ba,ba,b 的公因子,由定理 1.9 可知 e∣a+cbe\mid a+cbe∣a+cb ,所以 eee 是 a+cba+cba+cb 和 bbb 的公因子。如果 fff 是 a+cba+cba+cb 和 bbb 的公因子,那么由定理 1.9 可知 fff 整除 (a+cb)−cb=a(a+cb)-cb=a(a+cb)−cb=a ,所以 fff 是 a,ba,ba,b 的公因子。即 a,ba,ba,b 的公因子与 a+cb,ba+cb,ba+cb,b 的公因子相同。因此 (a+cb,b)=(a,b)(a+cb,b)=(a,b)(a+cb,b)=(a,b) 。
定理 3.8 gcd与线性组合
定义:如果 a,ba,ba,b 是整数,那么它们的 线性组合 具有形式 ma+nbma+nbma+nb ,其中 m,nm,nm,n 都是整数。
定理3.8:两个不全为零的整数 a,ba,ba,b 的最大公因子是 a,ba,ba,b 的线性组合中 最小 的正整数。
证明: 令 ddd 是 a,ba,ba,b 的线性组合中最小的正整数。(因为当 a≠0a\neq 0a=0 时,两个线性组合 1×a+0×b1\times a+0\times b1×a+0×b 和 0×a+1×b0\times a+1\times b0×a+1×b 中必有一个为正,因此根据良序性,存在最小的正整数)。
我们有 d=ma+nbd=ma+nbd=ma+nb ,其中 m,nm,nm,n 是整数 。\qquad\qquad (1)
我们先证明 d∣ad\mid ad∣a , d∣bd\mid bd∣b 。
由带余除法,得到 a=dq+ra=dq+ra=dq+r,0≤r<d0\le r<d0≤r<d 。由这个方程和(1)可以得到 r=a−dq=a−q(ma+nb)=(1−mq)a−qnbr=a-dq=a-q(ma+nb)=(1-mq)a-qnbr=a−dq=a−q(ma+nb)=(1−mq)a−qnb 。这就证明了整数 rrr 是 a,ba,ba,b 的线性组合。因为 0≤r<d0\le r<d0≤r<d 且 ddd 是 a,ba,ba,b 的线性组合中最小的正整数,于是我们得到 r=0r=0r=0,因此 d∣ad\mid ad∣a 。同理可得 d∣bd\mid bd∣b 。接下来证明它是 a,ba,ba,b 的最大公因子。为此只需证明 a,ba,ba,b 所有的公因子 ccc 都可整除 ddd 。
由于 d=ma+nbd=ma+nbd=ma+nb ,因此如果 c∣ac\mid ac∣a 且 c∣bc\mid bc∣b ,那么由定理 1.9 有 c∣dc\mid dc∣d ,因此 d≥cd\ge cd≥c 。
证毕。■\qquad \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\blacksquare■
推论 3.8.1 贝祖定理
推论3.8.1(Bezout,贝祖定理):如果 a,ba,ba,b 均为整数,则有整数 m,nm,nm,n ,使得 ma+nb=gcd(a,b)ma+nb=\gcd(a,b)ma+nb=gcd(a,b) 。
虽然该推论被称作是 Bezout 定理,但多年以前 Claude Gaspar Bachet 已经证明了该结果。
方程 ma+nb=(a,b)ma+nb=(a,b)ma+nb=(a,b) 被称为 Bezout 等式,对给定的整数 a,ba,ba,b 满足该等式的整数 m,nm,nm,n 被称为是 a,ba,ba,b 的 Bezout 系数或 Bezout 数。
推论 3.8.2
推论3.8.2:整数 a,ba,ba,b 互素当且仅当存在整数 m,nm,nm,n 使得 ma+nb=1ma+nb=1ma+nb=1 。(充要条件的证明)
证明:若 (a,b)=1(a,b)=1(a,b)=1 。由定理 3.8 可知,1 是 a,ba,ba,b 的线性组合的最小正整数。于是存在整数 m,nm,nm,n 使得 ma+nb=1ma+nb=1ma+nb=1 。反之,如果有整数 m,nm,nm,n 使得 ma+nb=1ma+nb=1ma+nb=1 ,则由定理 3.8 可得 (a,b)=1(a,b)=1(a,b)=1 。这是由于 a,ba,ba,b 不为 0 且 1 显然是 a,ba,ba,b 的线性组合中的最小正整数。
定理 3.9 线性组合与gcd的倍数
定理3.9:如果 a,ba,\ ba, b 是正整数,那么所有 a,ba,\ ba, b 的线性组合构成的集合与所有 (a,b)(a,\ b)(a, b) 的倍数构成的集合相同。
证明: 假设 d=(a,b)d=(a,\ b)d=(a, b) ,
我们首先证明每个 a,ba,ba,b 的线性组合是 ddd 的倍数。
我们现在证明每一个 ddd 的倍数也是 a,ba,ba,b 的线性组合。
证毕。■\qquad \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\blacksquare■
定理 3.10 一种定义gcd的方式
不依赖于整数的有序性定义最大公因子。
定理3.10:如果 a,ba,ba,b 是不全为 000 的整数,那么正整数 ddd 是 a,ba,ba,b 的最大公因子,当且仅当
\qquad\qquad(i) d∣ad\mid ad∣a 且 d∣bd\mid bd∣b;
\qquad\qquad(ii) 如果 ccc 是整数且 c∣ac\mid ac∣a ,c∣bc\mid bc∣b ,那么 c∣dc\mid dc∣d;
证明:\qquad假设 d=(a,b)d=(a,b)d=(a,b) ,
证毕。■\qquad \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\blacksquare■
引理 3.2 多个数的最大公因子
定义:令 a1,a2,a3,…,ana_1,a_2,a_3,\dots,a_na1,a2,a3,…,an 是不全为零的整数。这些整数的公因子中最大的整数就是最大公因子。 a1,a2,a3,…,ana_1,a_2,a_3,\dots,a_na1,a2,a3,…,an 的最大公因子记为 (a1,a2,a3,…,an)(a_1,a_2,a_3,\dots,a_n)(a1,a2,a3,…,an) 。(注意 aia_iai 在这里面出现的顺序不影响结果)
引理3.2:如果 a1,a2,a3,…,ana_1,a_2,a_3,\dots,a_na1,a2,a3,…,an 是不全为零的整数,那么 (a1,a2,a3,…,an)=(a1,a2,a3,…,(an−1,an))(a_1,a_2,a_3,\dots,a_n)=(a_1,a_2,a_3,\dots,(a_{n-1},a_n))(a1,a2,a3,…,an)=(a1,a2,a3,…,(an−1,an)) 。
互素,两两互素
3.4 欧几里得算法
引理 3.3 (a,b) = (b,a % b)
引理3.3:如果 e,de,de,d 是整数且 e=dq+re=dq+re=dq+r ,其中 q,rq,rq,r 是整数,那么 (e,d)=(d,r)(e,d)=(d,r)(e,d)=(d,r) 。
证明:在定理 3.7 中,取 a=ra=ra=r , b=db=db=d , c=qc=qc=q 即得到该引理。
定理 3.11 欧几里得算法
定理3.11(欧几里得算法)
证明:令 r0=ar_0=ar0=a ,r1=br_1=br1=b 是正整数且满足 a⩾ba\geqslant ba⩾b ,那么通过连续运用带余除法,我们求得
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ r_0&=r_1q_1+r_…
可以确定最后一定会有一个余数为零,这是因为余数组成的序列 a=r0⩾r1>r2>r3>⋯⩾0a=r_0\geqslant r_1>r_2>r_3>\cdots\geqslant 0a=r0⩾r1>r2>r3>⋯⩾0 所包含的项的个数不会大于 aaa (因为每个余数都是整数),由引理 3.3,我们得到 (a,b)=(r0,r1)=(r1,r2)=(r2,r3)=⋯=(rn−2,rn−1)=(rn−1,rn)=(rn,0)(a,b)=(r_0,r_1)=(r_1,r_2)=(r_2,r_3)=\cdots=(r_{n-2},r_{n-1})=(r_{n-1},r_{n})=(r_n,0)(a,b)=(r0,r1)=(r1,r2)=(r2,r3)=⋯=(rn−2,rn−1)=(rn−1,rn)=(rn,0) ,因此 (a,b)=rn(a,b)=r_n(a,b)=rn ,这是最后一个非零余数。
int gcd(int a, int b)
{return b ? gcd(b, a % b) : a;
}
欧几里得算法是一种快速地求最大公因子的方法。接下来,当我们用欧几里得算法求两个正整数的最大公因子来估算 除法的最大步数 时会看到这一点。
定理 3.12 斐波那契与欧几里得
用欧几里得算法来求斐波那契序列中连续项的最大公因子的速度很慢,因为除了最后一步,其余的每一步的商都是1 。
下面的定理将告诉我们用欧几里得算法求斐波那契序列中连续两项的最大公因子需要多少步除法。
定理3.12:令 fn+1f_{n+1}fn+1 和 fn+2(n>1)f_{n+2}\ \ (n>1)fn+2 (n>1) 是斐波那契数列中连续的两项,那么用欧几里得算法证明 (fn+1,fn+2)=1(f_{n+1},f_{n+2})=1(fn+1,fn+2)=1 一共需要 nnn 步除法。证明:
证毕。■\qquad \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\blacksquare■
欧几里得算法的计算复杂度
定理 3.13 欧几里得算法的高效性
定理3.13(拉梅定理):用欧几里得算法计算两个正整数的最大公因子时,所需的除法次数不会超过两个整数中较小的那个十进制的位数的 5 倍。
证明:
拉梅定理的推论,它告诉我们 欧几里得算法是非常高效的 。
推论3.13.1:求两个正整数 a,ba,ba,b,a>ba>ba>b 的最大公因子需要 O((log2a)3)O((\log_2a)^3)O((log2a)3) 次的位运算。
证明:
定理 3.14(扩欧)
用线性组合的方式来表示最大公因子
如果已经求得 ,那么因为 ,
我们有
从 到 ,最终
这显示了如何沿着欧几里得算法产生的等式递进最终使得 a,ba,ba,b 的最大公因子 (a,b)(a,b)(a,b) 可以表示为 a,ba,ba,b 的线性组合。
自底向上计算
扩展欧几里得算法 只需用一次欧几里得算法就能计算出 (a,b)(a,b)(a,b) 。
然而写算法时,由于使用递归,倒推回去也可。
若使用以下方法。若输入数据不满足被除数大于除数,答案错误。
扩展欧几里得算法(自顶向下计算)
定理 3.14:令 (a,b)(a,b)(a,b) 是正整数,那么 rn=(a,b)=sna+tnbr_n=(a,b)=s_na+t_nbrn=(a,b)=sna+tnb ,其中 sn,tns_n,t_nsn,tn 是下面定义的递归序列的第 nnn 项:
且 ,
其中 j=2,3,⋯,nj=2,3,\cdots,nj=2,3,⋯,n ,而 qjq_jqj 是欧几里得算法求 (a.b)(a.b)(a.b) 时每一步的商。
证明:我们将证明 , (3.2)
因为 ,一旦等式(3.2)成立,我们就有 。
我们用第二数学归纳原理来证明。
对于 ,有 。因此对 成立。类似地, ,所以对于 成立。
现在假设 ,对于 成立。那么由欧几里得算法的第 步,我们有
由归纳假设,得到
证毕。■\qquad \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\blacksquare■
3.5 算术基本定理
为了证明算术基本定理中分解的唯一性,我们需要先介绍两个引理。
引理 3.4
引理3.4:如果 a,b,ca,b,ca,b,c 是正整数,满足 (a,b)=1(a,b)=1(a,b)=1 且 a∣bca\mid bca∣bc ,则 a∣ca\mid ca∣c 。
证明:由于 (a,b)=1(a,b)=1(a,b)=1 ,存在整数 xxx 使得 ax+by=1ax+by=1ax+by=1 。等式两边同时乘以 ccc ,得 acx+bcy=cacx+bcy=cacx+bcy=c 。根据定理 1.9 得 a∣(acx+bcy)a\mid (acx+bcy)a∣(acx+bcy),这是因为这是 a,bca,bca,bc 的线性组合,而它们都可以被 aaa 整除。因此 a∣ca\mid ca∣c 。
引理 3.5
引理3.5:如果 p∣a1a2⋯anp\mid a_1a_2\cdots a_np∣a1a2⋯an ,其中 ppp 为素数,且 a1,a2,⋯,ana_1,a_2,\cdots,a_na1,a2,⋯,an 是正整数,则存在整数 i,1⩽i⩽ni,\ 1\leqslant i\leqslant ni, 1⩽i⩽n ,使得 p∣aip\mid a_ip∣ai 。
证明:我们通过数学归纳法证明。对任意素数 ppp
\qquad①当 n=1n=1n=1 时,显然成立。
\qquad②假定结果对 nnn 成立。考虑 n+1n+1n+1 个整数的乘积 a1a2⋯an+1a_1a_2\cdots a_{n+1}a1a2⋯an+1 ,它是能够被素数 ppp 整除的。我们知道或者有 (p,a1a2⋯an)=1(p,\ a_1a_2\cdots a_n)=1(p, a1a2⋯an)=1 ,或者有 (p,a1a2⋯an)=p(p,\ a_1a_2\cdots a_n)=p(p, a1a2⋯an)=p 。如果 (p,a1a2⋯an)=1(p,\ a_1a_2\cdots a_n)=1(p, a1a2⋯an)=1 ,则由引理 3.4 ,p∣an+1p\mid a_{n+1}p∣an+1 。另一方面,如果 p∣a1a2⋯anp\mid a_1a_2\cdots a_np∣a1a2⋯an ,由归纳假设,存在整数 i,1⩽i⩽ni,\ 1\leqslant i\leqslant ni, 1⩽i⩽n ,使得 p∣aip\mid a_ip∣ai 。因此,对某个满足 1⩽i⩽n+11\leqslant i\leqslant n+11⩽i⩽n+1 的 iii ,p∣aip\mid a_ip∣ai 。
证毕。
定理 3.15 算术基本定理
定理3.15(算术基本定理):每个大于 111 的正整数都可以被唯一地写成素数的乘积,在乘积中的素因子按照非降序排列。
证明:
①我们采用反证法:证明:每个大于 111 的数必能写成素数的乘积。
假定某正整数不能被写成素数的乘积。设 是这样的整数中最小的(良序性)。如果 是素数,那么它显然是素数的乘积,即一个素数 。所以 一定是合数。设 ,其中 。但是由于 都比 小,因54此它们一定可以写成素数的乘积(良序性)。又由于 ,我们得到 也是素数的乘积。这个矛盾说明每个正整数都可以写成素数的乘积。
②我们现在通过证明这个 分解的唯一性 来完成算术基本定理的证明。
假定整数 有两种不同的素数分解形式: ,其中 和 为素数,且 。
在这两个分解式中约去相同的素数,得到 *。*其中等式左边的素数与右边的不同, 。
然而,这导致了与引理3.5的矛盾。由该引理,一定存在某一个 使得 整除 ,这是不可能的,因为每个 都是与 不同的素数。
因此,正整数 nnn 的素因子分解是唯一的。■\qquad\qquad\qquad\qquad \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\blacksquare■
整数分解中把素因子组合成幂的形式被称为 素幂因子分解(prime-power factorization)。
唯一因子分解在哪里不成立:略。
素因子分解的应用
- 素数 ppp 整除 nnn 当且仅当它出现在 nnn 的素幂因子分解中。
- 一个素数 ppp 能整除 nnn 的最高次幂是 ppp 在 nnn 的素幂因子分解中的幂次。
- 一个整数 ddd 整除 nnn 当且仅当 ddd 的素幂因子分解中出现的所有素数都在 nnn 的素幂因子分解中出现,且其出现的幂次大于等于在 ddd 的素幂因子分解中的幂次。
\qquad用素因子分解来求最大公因子,设 min(a,b)\min(a,\ b)min(a, b) 为 a,ba,\ ba, b 中较小的一个。现在设 a,ba,\ ba, b 的素因子分解为
\qquad\qquad\qquada=p1a1p2a2⋯pnana=p_1^{a_1}p_2^{a_2}\cdots p_n^{a_n}a=p1a1p2a2⋯pnan,b=p1b1p2b2⋯pnbnb=p_1^{b_1}p_2^{b_2}\cdots p_n^{b_n}b=p1b1p2b2⋯pnbn
其中 p1,p2,⋯,pnp_1,\ p_2,\cdots,p_np1, p2,⋯,pn 是出现在 a,ba,\ ba, b 的素幂因子分解中的素数(对某些 iii,有可能有 ai=0a_i=0ai=0 或 bi=0b_i=0bi=0 )
可得 (a,b)=p1min(a1,b1)p2min(a2,b2)⋯pnmin(an,bn)\qquad(a,\ b)=p_1^{\min(a_1,\ b_1)}p_2^{\min(a_2,\ b_2)} \cdots p_n^{\min(a_n,\ b_n)}(a, b)=p1min(a1, b1)p2min(a2, b2)⋯pnmin(an, bn) ,这是因为对每个素数 pip_ipi , a,ba,\ ba, b 恰好共同拥有 min(ai,bi)\min(a_i,\ b_i)min(ai, bi) 个因子 pip_ipi 。
定义:两个非 0 整数 a,ba,\ ba, b 的 最小公倍数(the least common multiple)是能够被 a,ba,\ ba, b 整除的最小正整数。 a,ba,\ ba, b 的最小公倍数记为 [a,b][a,\ b][a, b] ,也可写成 lcm(a,b)\operatorname{lcm}(a,\ b)lcm(a, b) 。
\qquad用素因子分解求最小公倍数:如果 a=p1a1p2a2⋯pnana=p_1^{a_1}p_2^{a_2}\cdots p_n^{a_n}a=p1a1p2a2⋯pnan ,b=p1b1p2b2⋯pnbnb=p_1^{b_1}p_2^{b_2}\cdots p_n^{b_n}b=p1b1p2b2⋯pnbn ,则对一个能够被 a,ba,\ ba, b 同时整除的整数,其素幂因子分解中必须出现 pjp_jpj 且其幂次至少与 aj,bja_j,\ b_jaj, bj 一样大。因此,能够被 a,ba,\ ba, b 同时整除的最小正整数 [a,b][a,\ b][a, b] 为
[a,b]=p1max(a1,b1)p2max(a2,b2)⋯pnmax(an,bn)\qquad\qquad\qquad\qquad [a,\ b]=p_1^{\max(a_1,\ b_1)}p_2^{\max(a_2,\ b_2)} \cdots p_n^{\max(a_n,\ b_n)}[a, b]=p1max(a1, b1)p2max(a2, b2)⋯pnmax(an, bn)
其中 max(x,y)\max(x,\ y)max(x, y) 表示 x,yx,\ yx, y 中较大的。
求大整数的素因子分解比较耗费时间。因此我们想要一种求两个整数的最小公倍数但不使用素因子分解的方法。可以由两个正整数的最大公因子求它们的最小公倍数。为此,我们需要证明下面的引理。
引理 3.6
引理 3.6:如果 x,yx,yx,y 是实数,则 max(x,y)+min(x,y)=x+y\max(x,\ y)+\min(x, y)=x+ymax(x, y)+min(x,y)=x+y 。
证明:如果 x>yx>yx>y ,则
如果 x<yx <yx<y ,
如果 x=yx=yx=y ,
定理 3.16
定理3.16:如果 a,ba,\ ba, b 是正整数,则 [a,b]=ab/(a,b)[a,\ b]=ab/(a,\ b)[a, b]=ab/(a, b) ,其中 [a,b][a,\ b][a, b] 和 (a,b)(a,\ b)(a, b) 分别是 a,ba,\ ba, b 的最小公倍数和最大公因子。
证明:设 a,ba,\ ba, b 的素幂因子分解为 a=p1a1p2a2⋯pnana=p_1^{a_1}p_2^{a_2}\cdots p_n^{a_n}a=p1a1p2a2⋯pnan ,b=p1b1p2b2⋯pnbnb=p_1^{b_1}p_2^{b_2}\cdots p_n^{b_n}b=p1b1p2b2⋯pnbn 。现在设 Mj=max(aj,bj)M_j=\max(a_j,\ b_j)Mj=max(aj, bj) ,mj=min(aj,bj)m_j=\min(a_j,\ b_j)mj=min(aj, bj) 则有
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ [a,\ b](a,\ b)…
这是因为根据引理 3.6 , Mj+mj=max(aj,bj)+min(aj,bj)=aj+bjM_j+m_j=\max(a_j,\ b_j)+\min(a_j,\ b_j)=a_j+b_jMj+mj=max(aj, bj)+min(aj, bj)=aj+bj 。■\qquad\qquad\qquad\qquad\blacksquare■
引理 3.7 算术基本定理的推论
引理 3.7:设 m,nm,\ nm, n 是互素的正整数,那么如果 ddd 是 mnmnmn 的一个正因子,则存在唯一的一对 mmm 的正因子 d1d_1d1 和 nnn 的正因子 d2d_2d2 使得 d=d1d2d=d_1d_2d=d1d2 。反之,如果 d1d_1d1 和 d2d_2d2 分别是 mmm 和 nnn 的正因子,则 d=d1d2d=d_1d_2d=d1d2 是 mnmnmn 的正因子。
证明:
狄利克雷定理中一种特殊情形的证明(略
引理 3.8
定理 3.17
定理 3.17:存在无穷多个形如 4n+34n+34n+3 的素数,其中 nnn 为正整数。
关于无理数的结果
定理 3.18
定理 3.19
算术基本定理可以用来证明下面的结果,它将著名的黎曼 zeta 函数和素数联系起来。
定理 3.19:
证明:
3.6 因子分解法和费马数
因子分解
试除法
vector<PII> primes;
void div(int x)
{for(int i = 2; i * i <= x; i++){if(x % i == 0){int cnt = 0;while(x % i == 0)x /= i, cnt ++;primes.push_back({i, cnt});}if(i * i > x) break;// 任意合数必有一个小于等于sqrt(x)d}if(x > 1) priems.push_back({x, 1});
}
17世纪初,费马给出了一种因子分解的方法,这个方法是基于将一个合数表示成两个平方数的差的形式。这个方法在理论和某些实际应用中是相当重要的,但是它本身并不是一个十分有效的方法。它基于下面的引理。
引理 3.9
引理 3.9:如果 nnn 是一个正的奇数,那么 nnn 分解为两个正整数的积和表示成两个平方数的差是一一对应的。
证明:
费马因子分解在用来分解一个具有两个相似大小的因子的整数时最有效。尽管费马因子分解很少被用来分解大整数,但是它 的基本思想是计算机计算中广泛使用的很多更有效因子分解算法的基础。
费马数
定理 3.20
利用费马数证明素数无穷性:利用费马数证明存在无穷多的素数是有可能的。我们从证明两个不同的费马数是互素的开始。这将会用到下面的引理。
引理 3.10
定理 3.21
费马素数与几何:费马素数在几何学中很重要
定理 3.22
3.7 线性丢番图方程
\qquad考虑下面的问题:一个人想购买 510 美元的旅游支票。支票只有 20 美元和 50 美元两种。那么每一种应该买多少?如果令 x 表示他应该买的 20 美元支票的数量,y 表示 50 美元支票的数量,那么就应满足方程 20x+50y=51020x+50y=51020x+50y=510 。为了解决这一问题,应该求出这个方程的所有解,其中 x,yx,\ yx, y 为非负整数。
\qquad类似的问题出现在当一个妇女想邮寄一个包裹时。邮局的职员测定邮寄这个包裹的费用是 83 美分,但是只有 6 美分和 15 美分的邮票。那么是否有这两种邮票的组合后的面值恰好可以来邮寄这个包裹呢?为了回答这个问题,我们先令 xxx 表示 6 美分邮票的数量,令 yyy 表示 15 美分邮票的数量。那么有 6x+15y=836x+15y=836x+15y=83 ,其中 x,yx,\ yx, y 是非负整数。
\qquad当我们需要求解特定方程的整数解的时候,就得到了一个 丢番图方程。这些方程是根据古希腊数学家丢番图而命名的,他写下了一些方程并将解限定在有理数域上。方程 ax+by=cax+by=cax+by=c (其中 a,b,ca,\ b,\ ca, b, c 是整数)被称为 关于两个变量的线性丢番图方程。
定理 3.23
下面的定理说明什么时候这类方程有解,当有解的时候又如何明确地描述它们。
定理 3.23:设 a,ba,\ ba, b 是整数且 d=(a,b)d=(a,\ b)d=(a, b) 。如果 d∤cd\nmid cd∤c ,那么方程 ax+by=cax+by=cax+by=c 没有整数解。如果 d∣cd\mid cd∣c ,那么存在无穷多个整数解。另外,如果 x=x0x=x_0x=x0 ,y=y0y=y_0y=y0 是方程的一个特解,那么所有的解可以表示为
x=x0+(b/d)ny=y0−(a/d)n\qquad\qquad\qquad\qquad\qquad x=x_0+(b/d)n \qquad y=y_0-(a/d)nx=x0+(b/d)ny=y0−(a/d)n
其中 nnn 是整数。
证明:假设 x,yx,\ yx, y 是整数满足 ax+by=cax+by=cax+by=c 。那么因为 d∣ad\mid ad∣a ,d∣bd\mid bd∣b ,由定理 1.9 同样有 d∣cd\mid cd∣c 。因此如果 d∤cd\nmid cd∤c ,那么这个方程就不存在整数解。
\qquad现在假设 d∣cd\mid cd∣c ,由定理 3.8 ,存在整数 s,ts,\ ts, t 使得
d=as+bt(1)\qquad\qquad\qquad\qquad\qquad\qquad\qquad d=as+bt \qquad\qquad\qquad\qquad (1)d=as+bt(1)
因为 d∣cd\mid cd∣c ,有整数 eee 使得 de=cde=cde=c 。在(1)两边同时乘以 eee ,我们有 c=de=(as+bt)e=a(se)+b(te)c=de=(as+bt)e=a(se)+b(te)c=de=(as+bt)e=a(se)+b(te) 。
因此,x=x0x=x_0x=x0 ,y=y0y=y_0y=y0 ,就是方程的一个解,其中 x0=sex_0=sex0=se ,y0=tey_0=tey0=te 。
\qquad为了证明方程存在无穷多个解,令 x=x0+(b/d)nx=x_0+(b/d)nx=x0+(b/d)n ,y=y0−(a/d)ny=y_0-(a/d)ny=y0−(a/d)n ,其中 nnn 是整数。首先为了证明任何一对整数 (x,y)(x,\ y)(x, y) ,x=x0+(b/d)nx=x_0+(b/d)nx=x0+(b/d)n ,y=y0−(a/d)ny=y_0-(a/d)ny=y0−(a/d)n ,nnn 是整数,它是方程的解。然后再证明方程的任何一个解都具有这种形式。
\qquad易知 (x,y)(x,\ y)(x, y) 是解,这是因为 ax+by=ax0+a(b/d)n+by0−b(a/d)n=ax0+by0=cax+by=ax_0+a(b/d)n+by_0-b(a/d)n=ax_0+by_0=cax+by=ax0+a(b/d)n+by0−b(a/d)n=ax0+by0=c 。
\qquad我们现在证明方程 ax+by=cax+by=cax+by=c 的解都具有定理中所描述的那种形式。假设整数 x,yx,\ yx, y 满足 ax+by=cax+by=cax+by=c 。因为 ax0+by0=cax_0+by_0=cax0+by0=c ,做减法得到 (ax+by)−(ax0+by0)=0(ax+by)-(ax_0+by_0)=0(ax+by)−(ax0+by0)=0 ,这就说明 a(x−x0)+b(y−y0)=0a(x-x_0)+b(y-y_0)=0a(x−x0)+b(y−y0)=0 。因此 a(x−x0)=b(y0−y)a(x-x_0)=b(y_0-y)a(x−x0)=b(y0−y) 。两边同时除以 ddd ,得 (a/d)(x−x0)=(b/d)(y0−y)(a/d)(x-x_0)=(b/d)(y_0-y)(a/d)(x−x0)=(b/d)(y0−y) 。由定理 3.6 , (a/d,b/d)=1(a/d,\ b/d)=1(a/d, b/d)=1 。用引理 3.4 ,有 (a/d)∣(y0−y)(a/d)\mid (y_0-y)(a/d)∣(y0−y) 。因此,存在整数 nnn 使得 (a/d)n=(y0−y)(a/d)n=(y_0-y)(a/d)n=(y0−y) 。这就意味着 y=y0−(a/d)ny=y_0-(a/d)ny=y0−(a/d)n 。现在将这个 yyy 值代入方程 a(x−x0)=b(y0−y)a(x-x_0)=b(y_0-y)a(x−x0)=b(y0−y) ,我们得到 a(x−x0)=b(a/d)na(x-x_0)=b(a/d)na(x−x0)=b(a/d)n 。这就得到了 x=x0+(b/d)nx=x_0+(b/d)nx=x0+(b/d)n 。■\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\blacksquare■
定理 3.24
可以将定理 3.23 推广为多个变量的线性丢番图方程。下面的定理给出了这个推广。
定理 3.24:如果 a1,a2,⋯,ana_1,\ a_2,\cdots,\ a_na1, a2,⋯, an 是非零整数,那么方程 a1x1+a2x2+⋯+anxn=ca_1x_1+a_2x_2+\cdots+a_nx_n=ca1x1+a2x2+⋯+anxn=c 有整数解当且仅当 d=(a1,a2,⋯,an)d=(a_1,a_2,\cdots,a_n)d=(a1,a2,⋯,an) 整除 ccc 。另外当存在一个解的时候,方程有无穷多个解。
证明:如果存在整数 x1,x2,⋯,xnx_1,x_2,\cdots,x_nx1,x2,⋯,xn 满足 a1x1+a2x2+⋯+anxn=ca_1x_1+a_2x_2+\cdots+a_nx_n=ca1x1+a2x2+⋯+anxn=c ,则由于 ddd 整除 ai,i=1,2,⋯,na_i,\ i=1,2,\cdots,nai, i=1,2,⋯,n ,故由定理 1.9 ,ddd 整除 ccc 。因此,如果 d∤cd\nmid cd∤c ,则方程不存在解。
《初等数论及其应用》第三章 素数和最大公因子相关推荐
- 初等数论 课堂笔记 第三章 --同余及其一些有趣的应用
索引 同余性质 定理: ∀a,b∈Z\forall a,b\in \mathbb{Z}∀a,b∈Z,有a≡b(modm)⇔m∣(a−b)⇔∃t∈Z,a=b+mta\equiv b\left( \bmo ...
- 初等数论 课堂笔记 第三章 -- 保密通讯与公开密钥
索引 保密通讯 仿射密码 例子 指数密码 ( Pohlig, Hellman, 1978 ) 例子 RSA公开密钥体制( Rivest, Shamir, Adleman, 1977; 英国情报部门的C ...
- 数据结构思维 第三章 `ArrayList`
第三章 ArrayList 原文:Chapter 3 ArrayList 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本章一举两得:我展示了上一个练习的解法,并展示了一种使用 ...
- 《程序设计技术》第三章例程
<程序设计技术>例程 <程序设计技术>第一章 C语言与程序设计(例程) <程序设计技术>第二章 C语言基础知识(例程) <程序设计技术>第三章 程序控制 ...
- C++算法设计与分析课后习题(第三章)
C++算法设计与分析课后习题[第三章] 前言 一.求2+22+222+2222+...+22...(n个2)...22(精确计算) 变量解释 运行截图 二.编写一个算法,其功能是给一维数组a输入任意6 ...
- 信息安全工程师学习笔记《第三章》
第三章 密码学基本理论 本章讲述了密码学的基本概念以及常见的密码体制.密码算法,分析了杂凑函数.数字签名.国产密码算法.安全协议等的工作原理:本章还分析了密码在网络安全方面的应用场景类型. 3.1密码 ...
- Python程序设计第三章测验总结
第三章 顺序和分支程序应用 3.1 猜数字与二分法 1.如果需要提前结束循环,可以使用: A.break B.continue C.else D.if 解:A 2.语句x=input()执行时,如果从 ...
- SRPG游戏开发(五)第三章 绘制地图 - 二 绘制一张简单地图
返回目录 第三章 绘制地图 一 导入素材 点击进入 二 绘制一张简单地图 这一节我们来看如何绘制一张地图. 1 新建Grid与Tilemap 在Hierarchy面板中,点击Create/2D ...
- 数字图像处理之第三章
第三章 图像增强 1.图像增强的方法有很多种,按增强的目的和效果来划分,图像增强的方法大致可以分为灰度级修正.图像平滑.图像锐化.图像增晰和色彩增晰等. 2.灰度级修正(主要用来提高图像对比度,提高人 ...
- 实现 RSA 算法之改进和优化(第三章)(老物)
第三章 如何改进和优化RSA算法 这章呢,我想谈谈在实际应用出现的问题和理解. 由于近期要开始各种忙了,所以写完这章后我短时间内也不打算出什么资料了=- =(反正平时就没有出资料的习惯.) 在讲第一章 ...
最新文章
- 根据卡号获取银行卡名字
- 【网页设计】框架的高度随框架里面的内容的多少而改变——转
- 西亚斯vs2010敏捷开发分享
- Golang 检查元素在slice中是否存在 模仿Php实现arrary_In
- SpringBoot聚合项目总结
- java 异常 return_Java异常处理中同时有finally和return语句的执行问题
- Google 为什么以 Flutter 作为原生突破口?| 技术头条
- unity 3d换装之 SkinMeshRenderer
- 一种基于flex的可视化多层流量切分界面的实现
- 解决:IDEA2017/2019与Maven3.6.3不兼容的导致的unable to import maven project: see logs for details问题
- STM32H7定时器输入捕获实现电容触摸按键
- 计算机键盘使用大写用什么键,操作方法:如何解决Win10系统键盘的大小写切换键(大写锁定)的问题?...
- QQ空间优化让百度收录你
- MySQL数据库餐厅点菜系统_餐馆点餐管理系统-数据库课程设计-MySQL
- 自动爬取微博热门评论和点赞数并存为EXCEL文件(python2)
- 华东师范计算机科学与技术 导师,钱莹 - 华东师范大学 - 计算机科学与技术学院...
- Video Caption
- codeforces 855-B. Marvolo Gaunt's Ring(背包问题)
- 【ROS入门学习01| ROS命令行工具的使用】
- jsp项目使用jstl(c标签)及jstl.jar和standard.jar