用抛硬币的方式判断质数

你每次打开 https 网站,服务器都在赌一件事:这个几百位的大数「大概率」是质数。它没法证明,只是把赌错的概率压到比中彩票还小。这就是米勒-拉宾素性测试——概率论给整个互联网加密打的地基。

侦探用放大镜检查一个数字
密码学里的概率论

RSA 需要两个几百位的大质数,可你连怎么验证它是质数都做不到

分解一个 600 位的数,用尽全世界的算力也要跑到宇宙热寂。但你的手机造一对这样的质数只要几十毫秒。秘密在于:它根本不去证明,而是找一群随机「证人」投票。一票有罪就当场定罪,全票通过也只说「大概率是质数」。

先从抓一个「伪装成质数的合数」开始

证人投票台:给一个数字定罪

选一个数字,然后一个个召唤随机「证人」(底数 a)。每位证人做一次快速运算:只要有一位喊「有罪」,这个数就铁定是合数,不用再问;如果证人都说「看着像质数」,它是质数的把握就越来越大——但永远差一点点到 100%。

先挑一个数字:
三位证人举手投票 证人只会说「看着像」或「抓到了」——放行靠人数堆概率,定罪只要一票。

为什么不用更简单的费马测试

费马测试更早也更简单,但有个致命死角:卡迈克尔数——一种能骗过费马所有互质证人的合数。561 就是最小的一个。下面用同一批证人,看两种测试谁被骗、谁识破。现场计算

合数 4 戴着写有 PRIME 的面具伪装成质数 卡迈克尔数:披着「质数」面具的合数。
受审:561 = 3 × 11 × 17,货真价实的合数
费马测试
待运行
用与 561 互质的底数测试 a^560 mod 561
米勒-拉宾
待运行
同样的底数,多看了几步平方

造一个大质数:RSA 每天在做的事

生成 RSA 密钥的第一步就是找大质数。做法很暴力:随机摇一个大奇数,用米勒-拉宾测一遍,不是就再摇一个,直到摇中。选个位数,亲眼看它摇了多少次、丢了多少个合数。现场计算

预计平均要摇 ~11 个奇数
已摇候选
0
丢弃的合数
0
状态
待开始

「大概率」到底有多大概率

放行一个数字时,误判概率的上界是 (1/4)k,k 是通过的证人数。拖动滑块,看这条线怎么跌下去,以及它什么时候比「被闪电劈中」「中彩票头奖」还小。

120150
误判概率上界 (1/4)k
≈ 9.1 × 10⁻¹³
换个说法
比连抛 40 次硬币全是正面还罕见
当前设置下,误判一次比下面这些事更不可能(✓ 表示已经超越):

对照概率来源:单年被闪电击中约 1/1,222,000(美国国家气象局 NWS);双色球一等奖 1/17,721,088(红球 C(33,6)×蓝球 16,中国福利彩票官方赔率);可观测宇宙原子总数约 10⁸⁰(常见天体物理估计)。

复制本轮结论

把当前受审数字和证人投票结果复制带走,方便分享。

先在上方给一个数字定罪,这里会显示可复制的结论。

你应该带走的直觉

01

定罪只要一票

只要一个证人揭穿,这个数必定是合数,这个结论 100% 可靠,没有例外。

02

放行靠堆概率

说「是质数」永远差一点点到 100%。但每多一位证人,误判上界就除以 4,很快小到可以忽略。

03

够用就是安全

测几十轮后,误判概率比硬件本身出错还小。密码学要的不是绝对确定,而是「错到不可能发生」。