在数学的发展史上,皮埃尔·德·费马(Pierre de Fermat)是一位特别的人物。他的正式职业是律师,却格外爱好数学。虽然是业余的,费马在数学上的成就不低于同时代的职业数学家。他对于现代微积分、解析几何、概率论和数论都有贡献。尤其是在数论领域,费马最有兴趣也成果最突出。
Logic is the foundation of the certainty of all the knowledge we acquire.
— Leonhard Euler(莱昂哈德·欧拉,瑞士数学家和物理学家,近代数学先驱之一)
作为“业余数学家之王”,费马提出了一些著名的数论上的论断,但却没有给出强有力的证明。最著名的莫过于费马大定理1。尽管费马声称他已找到一个精妙的证明,只是页边没有足够的空位写下来,但实际上历经350多年数学家们的不懈努力,直至1995年才由英国数学家安德鲁·怀尔斯(Andrew John Wiles)和其学生理查·泰勒(Richard Taylor)发布广为认可的证明。
邮票上的费马和费马大定理
与之相区别地,还有一个费马小定理。1640年10月,费马在一封给友人的信中第一次写下了与下面同义的文字:
如果 p 是素数且 a 是任意不可被 p 整除的整数, 那么 ap−1−1 可被 p整除。
同样地,费马也没有在信中给出证明。将近百年后,完整的证明第一次由大数学家欧拉于1736年公开发表。而后来,人们从另一位大数学家莱布尼茨未发表的手稿中,发现他在1683年以前已经得到几乎是相同的证明。
费马小定理是初等数论的一个基本结论。这一定理可以用来生成素数判定法则和相应验证算法。进入20世纪七十年代末,公钥密码学兴起,费马小定理辅助证明了RSA加密算法的正确性。之后,研究者将其与中国余数定理相结合,还发现了一种RSA快速解密方法。以下对这些作一些展开介绍。
费马小定理的完整表述是:设定 pp 为素数,对于任意整数 aa,ap−aap−a 是 pp 的倍数,用模算数等式表示为 ap≡a(modp)ap≡a(modp),如果 aa 不是 pp 的倍数,则有 ap−1≡1(modp)ap−1≡1(modp)。
从 ap−1≡1(modp) 可以推导出 ap−2≡a−1(modp)ap−2≡a−1(modp),这个新的同余等式正好给出了求 a 对同余 p 之模逆元的一种方法。这是费马小定理的一个直接推论。
另一个重要的推论是:如果 aa 不是 pp 的倍数且 n=mmod(p−1)n=mmod(p−1),那么 an≡am(modp)an≡am(modp)。这一推论看起来不是很直观,但其实证明很简单:
有多种方法证明费马小定理,其中基于二项式定理的数学归纳法最为直观。首先,对于 a=1,很显然 1p≡1(modp) 成立。现在假设 ap≡a(modp) 为真,只要在此条件下证明 (a+1)p≡a+1(modp),则命题成立。
根据二项式定理(a+1)p=ap+(p1)ap−1+(p2)ap−2+⋯+(pp−1)a+1其中二项式系数的定义为 (pk)=p!k!(p−k)!。注意到因为 p 为素数,对于 1≤k≤p−1,每个系数 (pk) 都是 p 的倍数。
这样再取模modp,所有的中间项都消失了,只剩下 ap+1,(a+1)p≡ap+1(modp)依据前面的假设 ap≡a(modp),得出 (a+1)p≡a+1(modp),证毕。
竞赛题解
费马小定理为一些看似繁杂的计算问题提供了简明的解法。先看一个简单的例子:如果今天是星期日,问 2100 天以后是星期几?一周有 7 天,根据费马小定理有 27−1≡1mod7,由此可以得到2100=216×6+4≡116×24≡16≡2(mod7)所以答案是星期二。这实际上就是以具体的数字重复了上面第二个推论的证明过程。运用此推论可以极大地加快模幂运算,比如要求计算 49901mod151,由于 901mod(151−1)=1,据此马上可以得出49901≡491≡49(mod151)这当然比将 901 转化为二进制数再应用平方模幂运算快得多。
现在看一道似乎难一点的题:给定等式 1335+1105+845+275=n5,求 n 的数值。
初看起来好像没有头绪,那就从基础的奇偶性检查开始。等式左边两项为奇两项为偶,所以总和为偶数,这也决定了n一定为偶数。再看指数5为一个素数,联想到费马小定理得出 n5≡n(mod5),因此1335+1105+845+275≡n(mod5)3+0+4+2≡4≡n(mod5)继续再对3取模,同样依据费马小定理的推论有 n5≡n5mod(3−1)≡n(mod3),所以1335+1105+845+275≡n(mod3)1+2+0+0≡0≡n(mod3)好了,到此总结一下:
综合得出 n=144 或 n≥174,显然 174 太大了,所以 n 只能是 144。
此题实际上出现在1989年美国数学邀请赛中,这是一项面向中学生的数学竞赛。有趣的是,题目的解答正好反证了欧拉猜想不成立。
素性检测
许多加密算法的应用需要“随机”的大素数,而大素数的生成,常用的方法是随机生成一个整数,然后对其进行素性测试。 由于费马小定理成立的前提条件是 p 为素数,这就提供了一种素数判定法则,称为费马素性检验。检验的算法为:
输入:n - 需要检验的数,n>3;k - 检验重复次数
输出:n是合数,否则可能是素数
重复k次:
在[2,n−2]范围内随机选取 a
如果 an−1≢1(modn),返回合数
返回可能是素数
可以看出,费马素性检验并非确定性的,它利用随机化算法判断一个数是合数还是可能是素数。输出为合数时,结果一定正确;但是那些检验出可能为素数的数,也许实际为合数,这样的数被称为费马伪素数。最小的费马伪素数是341,2340≡1(mod341),而 341=11×31。所以事实上,费马小定理给出的是关于素数判定的必要但不充分条件。只能说检验重复次数越多,则被检验数是素数的概率越大。
还有一类费马伪素数 n,它们本身为合数,但是对于所有跟之互素的整数 x,都满足费马小定理 xn−1≡1(modn)。数论上称它们为卡迈克尔数 (Carmichael number) 或绝对伪素数。最小的卡迈克尔数是 561,等于 3×11×17。卡迈克尔数可能骗过费马素性检验,使得检验变得不可靠。幸好这样的数很稀少,统计表明,在前1012个自然数中只有8241个卡迈克尔数。
加密通讯程序PGP在算法当中使用了费马素性检验。在需要大素数的网络通信应用中,常常先用费马素性检验方法作预测试,而后调用效率更高的米勒-拉宾素性测试 (Miller–Rabin primality test) 以保证高准确度。
证明RSA算法
费马小定理也可以用来证明RSA加密算法的正确性,即解密计算公式可以完整无误地从密文 c 还原出明文 m:cd=(me)d≡m(modpq)这里 p 和 q 为不同的素数,e 和 d 是满足 ed≡1(modλ(pq)) 的正整数,而 λ(pq)=lcm(p−1,q−1),lcm 为最小公倍数函数。
在证明开始前,先介绍一个中国余数定理的推论:如果整数 n1,n2,...,nkn1,n2,...,nk 两两互素,并且 n=n1n2...nkn=n1n2...nk,那么对于任意整数 xx 和 yy,当且仅当 x≡y(modni)x≡y(modni) 对每个 i=1,2,...ki=1,2,...k 都成立时,有 x≡y(modn)x≡y(modn)。这个推论的证明不难,可留待读者思考解答2。依据此推论,如果 med≡m(modp) 和 med≡m(modq) 都为真,则一定有 med≡m(modpq)。
现在看证明的第一步,从 e 和 d 的关系得到 ed−1 可以被 p−1 和 q−1 整除,即存在非负整数 h 和 k 满足等式:ed−1=h(p−1)=k(q−1)
第二步目标 med≡m(modp),考虑两种情况:
第三步目标 med≡m(modq),和上一步的推导过程相似,一样可得出
既然 med≡m(modp) 和 med≡m(modq) 都被证实,med≡m(modpq) 成立,证毕!
加速RSA解密
费马小定理和中国余数定理相结合,不仅可以验证RSA加密算法的正确性,还能推演出一种加速解密的方法。
RSA加密算法里模数N是两个素数p和q的乘积,所以对于小于N的任何数m,设定 m1=mmodp 和 m2=mmodq,则m由(m1,m2)唯一确定。根据中国余数定理,我们可以使用通解公式从(m1,m2)推算出m。因为p和q各自的比特数只有N的一半,模运算将比直接计算cd≡m(modN)快得多。而在计算(m1,m2)的过程中,应用费马小定理的推论得到:m1=mmodp=(cdmodN)modp(1)=cdmodp=cdmod(p−1)modpm2=mmodq=(cdmodN)modq(2)=cdmodq=cdmod(q−1)modq很明显,在上面(1)和(2)式里,指数从d分别降阶到 dP=dmod(p−1) 和 dQ=dmod(q−1),这进一步加快运算。最后,计算m的步骤再运用加纳算法3(Garner Algorithm)优化:qinv=q−1(modp)h=qinv(m1−m2)(modp)(3)m=m2+hq(modpq)注意到给定(p,q,d),就确定了(dP,dQ,qinv)的数值,所以可以预先算出它们保存好,解密时只要计算(m1,m2,h)代入到以上的(3)式就行了。
这其实正是RSA密码技术规程 RFC 8017 (PKCS #1 v2.2) 所指定的解密算法,该规程定义的ASN.1格式的密钥数据序列与上面描述的完全对应 (dP - exponent1,dQ - exponent2,qinv - coefficient):
1 2 3 4 5 6 7 8 9 10 11 12 |
RSAPrivateKey ::= SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- p prime2 INTEGER, -- q exponent1 INTEGER, -- d mod (p-1) exponent2 INTEGER, -- d mod (q-1) coefficient INTEGER, -- (inverse of q) mod p otherPrimeInfos OtherPrimeInfos OPTIONAL } |
广泛应用的开源软件库包OpenSSL实现了这种高效实用的解密算法。如下所示,用OpenSSL命令行工具产生的密钥数据与PKCS #1标准一致:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# Generate 512-bit RSA keys saved in PEM format file. # For demo only, DON'T USE 512-bit KEYS IN PRODUCTION! $ openssl genrsa -out private-key.pem 512 Generating RSA private key, 512 bit long modulus .++++++++++++ ......................++++++++++++ e is 65537 (0x10001) # Inspect RSA keys saved in a PEM format file. $ openssl pkey -in private-key.pem -text -----BEGIN PRIVATE KEY----- MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEA7HwgswSjqvDRPWj3 vVIxMZDAtXJCa7Qx+2jFv7e7GXB8+fa3MTBL36YjIcAgLeCHAyIzWkPndxvTJE2l WvYzRQIDAQABAkBCUp2pF0f/jQJhwqqYQhDh4cLqIF1Yb3UFGWE8X37tpwCifAqg t8NEpaXWkct5M+YxqjKfdOKYy0TVcJRlyS+RAiEA9xujHmh+bOvl0xWDFoARDAHw v94qRCpeRNveHFpNvPsCIQD0/qFpeSjRWj/4vjCkIOv1RbbhDHVsgsF9HRJNW2Rc vwIgaGIAUcQKQ7CScMxRh5upl8zqCeKrMAhFsgi+lnN/CykCIDMdAL4Jmht7ccdK nslPWQs1/T6co878xLN+ojfjbl/vAiEAhmp4YDX1g8kFh6cVtTIDT5AGtzqwB2Jw cCq+IoKDYBc= -----END PRIVATE KEY----- Private-Key: (512 bit) modulus: 00:ec:7c:20:b3:04:a3:aa:f0:d1:3d:68:f7:bd:52: 31:31:90:c0:b5:72:42:6b:b4:31:fb:68:c5:bf:b7: bb:19:70:7c:f9:f6:b7:31:30:4b:df:a6:23:21:c0: 20:2d:e0:87:03:22:33:5a:43:e7:77:1b:d3:24:4d: a5:5a:f6:33:45 publicExponent: 65537 (0x10001) privateExponent: 42:52:9d:a9:17:47:ff:8d:02:61:c2:aa:98:42:10: e1:e1:c2:ea:20:5d:58:6f:75:05:19:61:3c:5f:7e: ed:a7:00:a2:7c:0a:a0:b7:c3:44:a5:a5:d6:91:cb: 79:33:e6:31:aa:32:9f:74:e2:98:cb:44:d5:70:94: 65:c9:2f:91 prime1: 00:f7:1b:a3:1e:68:7e:6c:eb:e5:d3:15:83:16:80: 11:0c:01:f0:bf:de:2a:44:2a:5e:44:db:de:1c:5a: 4d:bc:fb prime2: 00:f4:fe:a1:69:79:28:d1:5a:3f:f8:be:30:a4:20: eb:f5:45:b6:e1:0c:75:6c:82:c1:7d:1d:12:4d:5b: 64:5c:bf exponent1: 68:62:00:51:c4:0a:43:b0:92:70:cc:51:87:9b:a9: 97:cc:ea:09:e2:ab:30:08:45:b2:08:be:96:73:7f: 0b:29 exponent2: 33:1d:00:be:09:9a:1b:7b:71:c7:4a:9e:c9:4f:59: 0b:35:fd:3e:9c:a3:ce:fc:c4:b3:7e:a2:37:e3:6e: 5f:ef coefficient: 00:86:6a:78:60:35:f5:83:c9:05:87:a7:15:b5:32: 03:4f:90:06:b7:3a:b0:07:62:70:70:2a:be:22:82: 83:60:17 |
转载:费马小定理的归纳法证明和应用 | 网络热度 (packetmania.net)