try ai
科普
编辑
分享
反馈
  • Solovay-Strassen 测试

Solovay-Strassen 测试

SciencePedia玻尔百科
核心要点
  • Solovay-Strassen 测试通过检查一个数是否满足欧拉准则的一个推广形式来判断其是否可能为素数,该推广形式使用了可高效计算的雅可比符号。
  • 它是一种概率性算法,在单次迭代中至少有 50% 的概率正确识别出合数,从而可以通过重复测试获得高置信度。
  • 通过使用雅可比符号,该测试无需知道待测数的素因子即可执行,这使其效率远高于因式分解。
  • 尽管在对抗像卡迈克尔数这样的合数方面,它比旧的费马测试更为稳健,但它已在很大程度上被功能更强大的 Miller-Rabin 测试所取代。

引言

在数字时代,对素数的默默探寻已成为我们全球安全的基石。这些算术的基本构件对现代密码学至关重要,但识别它们——尤其是当它们有数百位数字时——却是一个巨大的挑战。对大数进行因式分解在计算上是不可行的,这就产生了一个关键的知识鸿沟:我们如何在不先找出其因子的情况下,自信地判断一个数是否为素数?本文探讨了这一问题的里程碑式解决方案:Solovay-Strassen 素性测试。

我们将踏上一段旅程,穿越优雅的数论世界,去理解这种强大的概率性方法。首先,在“原理与机制”一章中,我们将深入探讨素数的美妙性质,如欧拉准则,并了解雅可比符号的巧妙推广如何让我们构建一个有效的测试。随后,在“应用与跨学科联系”一章中,我们将审视该测试对计算机科学和密码学的现实影响,将其与 Miller-Rabin 测试等其他方法进行比较,并领会抽象数学与实用技术之间的深刻联系。我们的探索始于赋予该测试力量的基础思想:只有素数才拥有的独一无二的指纹。

原理与机制

要真正领会 Solovay-Strassen 测试的天才之处,我们必须像构想出它的数学家一样,踏上一段旅程。我们不从测试本身开始,而是从素数一个美妙、近乎神奇的性质入手。我们如何才能找到一种只有素数才拥有的独一无二的“指纹”呢?

欧拉的神圣指纹

想象一下,数字世界不是一条直线,而是一组时钟的集合,每个时钟都有不同的小时数。在一个7小时制的时钟世界里(称为模7算術),数字9就是2,15就是1。在这个奇怪的世界里,拥有平方根意味着什么?我们可以像往常一样对数字进行平方:12≡11^2 \equiv 112≡1, 22≡42^2 \equiv 422≡4, 32≡9≡23^2 \equiv 9 \equiv 232≡9≡2。注意,42≡16≡24^2 \equiv 16 \equiv 242≡16≡2, 52≡25≡45^2 \equiv 25 \equiv 452≡25≡4, 以及 62≡36≡16^2 \equiv 36 \equiv 162≡36≡1。那些以平方形式出现的数——在这里是1、2和4——被称为​​二次剩余​​。其余的数(3、5和6)则是二次非剩余。

这是一个简单的想法,但它将数字(除零外)分成了两个截然不同的阵营。伟大的 Leonhard Euler 发现了一种极为优雅的方法,可以在不尝试寻找平方根的情况下,判断一个数属于哪个阵营。他给我们带来了​​勒让德符号​​,记作 (ap)\left(\frac{a}{p}\right)(pa​),这是一个简单的记法:如果 aaa 是模素数 ppp 的二次剩余,则其值为 +1+1+1;如果是非剩余,则为 −1-1−1。然后,他揭示了他的杰作:​​欧拉准则​​。

欧拉准则规定,对于任何奇素数 ppp 和任何 ppp 不能整除的整数 aaa:

ap−12≡(ap)(modp)a^{\frac{p-1}{2}} \equiv \left(\frac{a}{p}\right) \pmod pa2p−1​≡(pa​)(modp)

这确实非同凡响。它告诉我们,如果我们取任意数 aaa,在我们的素数时钟世界里将其升至 (p−1)/2(p-1)/2(p−1)/2 次幂,结果将不是某个随机数。结果要么是 111,要么是 −1-1−1(在钟面上即为 p−1p-1p−1),从而精确地告诉我们 aaa 在这个世界里是否有平方根。这不仅仅是一个奇特的事实;它是一种深刻的结构性质,是素性留下的指纹。对于任何奇素数,ppp 不能整除的每个数 aaa 都必须遵守这一定律。

针对未知的巧妙推广

在这里我们遇到了第一个逻辑障碍。欧拉准则是一个检验“素数俱乐部”成员资格的测试,但你必须身在俱乐部内部才能使用它(模 ppp 必须是素数)。这是一个经典的“第22条军规”式困境。我们站在外面,拿着一个数字 nnn,想知道它是否是素数。我们该如何继续?

这正是数学魄力登场的地方。让我们不管三七二十一,试试这个公式,看看会发生什么!我们将测试我们的数字 nnn 是否表现得像一个素数。但我们立刻面临一个问题:勒让德符号 (ap)\left(\frac{a}{p}\right)(pa​) 仅在模 ppp 为素数时才有定义。

为了解决这个问题,我们引入​​雅可比符号​​,这是一个绝妙的推广 [@problemid:3090950]。如果我们的数字 nnn 拥有(未知的)素因子分解 n=p1e1p2e2⋯pkekn = p_1^{e_1} p_2^{e_2} \cdots p_k^{e_k}n=p1e1​​p2e2​​⋯pkek​​,雅可比符号 (an)\left(\frac{a}{n}\right)(na​) 就是相应勒让德符号的乘积:

(an)=(ap1)e1(ap2)e2⋯(apk)ek\left(\frac{a}{n}\right) = \left(\frac{a}{p_1}\right)^{e_1} \left(\frac{a}{p_2}\right)^{e_2} \cdots \left(\frac{a}{p_k}\right)^{e_k}(na​)=(p1​a​)e1​(p2​a​)e2​⋯(pk​a​)ek​

你可能会哭喊:“但这毫无用处!它需要 nnn 的素因子分解,而这正是我们不知道的!” 然而,神来之笔就在此处,这是一种被称为​​二次互反律​​的数学魔法。该定律及其附带规则提供了一套法则,使我们能够以惊人的效率计算雅可比符号 (an)\left(\frac{a}{n}\right)(na​),其翻转和化简数字的方式让人联想到用于求最大公约数的欧几里得算法,而这一切都完全无需知道 nnn 的因子。

然而,我们必须谨慎。雅可比符号是一个聪明的冒名顶替者。虽然它模仿了勒让德符号,但失去了一个关键性质。如果 (an)=−1\left(\frac{a}{n}\right) = -1(na​)=−1,我们可以确信 aaa 不是模 nnn 的平方。但是,如果 (an)=1\left(\frac{a}{n}\right) = 1(na​)=1,当 nnn 是合数时,这并不保证 aaa 是模 nnn 的平方。这是因为两个 −1-1−1 的乘积是 111,所以对于两个不同的素因子而言的非剩余,可能导致雅可比符号为 111。这个看似的缺陷,矛盾的是,正是该测试力量的源泉。

设下陷阱:见证者与骗子

现在我们拥有了为合数设下陷阱的所有组件。​​Solovay-Strassen 测试​​的计划如下:

  1. 取你想要测试的奇数 nnn。
  2. 在 111 和 n−1n-1n−1 之間隨機選擇一個整數 aaa。這個 aaa 將成為我們的探針。
  3. 检查 aaa 和 nnn 是否有除1以外的公因子。如果有(即 gcd⁡(a,n)>1\gcd(a,n) > 1gcd(a,n)>1),我们就找到了 nnn 的一个因子,证明了它是合数。
  4. 如果它们互素,我们就启动陷阱。我们计算两个数:幂运算的结果 r=a(n−1)/2(modn)r = a^{(n-1)/2} \pmod nr=a(n−1)/2(modn),以及雅可比符号的值 j=(an)j = \left(\frac{a}{n}\right)j=(na​)。
  5. 我们检查我们的数 nnn 是否遵守欧拉准则:r≡j(modn)r \equiv j \pmod nr≡j(modn) 是否成立?

有两种可能的结果。

首先,同余式不成立:a(n−1)/2≢(an)(modn)a^{(n-1)/2} \not\equiv \left(\frac{a}{n}\right) \pmod na(n−1)/2≡(na​)(modn)。我们知道,每个真正的素数对于所有可能的 aaa 都必须满足这个同余式。既然我们的 nnn 未能通过,它就暴露了其真实本性。它不可能是素数。在这种情况下,底数 aaa 充当了 nnn 的合数性的​​Solovay-Strassen 见证者​​。游戏结束;我们得到了证明。

其次,同余式成立。这是一个微妙的情况。这是否意味着 nnn 是素数?不一定。可能我们的合数 nnn 恰好对这个特定的 aaa 通过了测试。我们称这样顺从的底数 aaa 为​​Solovay-Strassen 骗子​​,因为它使合数 nnn 伪装成素数。例如,当测试合数 n=77n=77n=77 时,底数 a=76a=76a=76 是一个骗子,因为它满足同余式,而像 222、999 和 101010 这样的底数则是诚实的见证者,它们揭示了 777777 是合数。

数字的力量:战胜不确定性

一个可能被骗子欺骗的测试似乎不可靠。但这就是概率的崇高力量前来拯救我们的地方。Solovay-Strassen 测试的基础定理是一个美妙的保证:对于任何奇合数 nnn,骗子总是少数派。​​最多有一半​​的可能底数是骗子;因此,至少有一半的底数保证是诚实的见证者。

把它想象成抛硬币。当你用一个随机底数测试一个合数时,你至少有50%的机会选中一个见证者并证明它是合数。如果测试一次并通过了,你可能只是运气不好。但如果你用一个新的随机底数再试一次呢?连续两次被骗的概率最多是 (0.5)×(0.5)=0.25(0.5) \times (0.5) = 0.25(0.5)×(0.5)=0.25。经过10次独立试验后,一个合数每次都通过测试的几率小于 (0.5)10(0.5)^{10}(0.5)10,约等于千分之一。经过50次试验后,出错的概率小到天文数字级别,比执行计算的计算机发生硬件错误的几率还要低。我们没有得到绝对的确定性,但我们达到了一个在所有实际用途中都同样好的置信水平。

一个更稳健的测试:逃离费马陷阱

有人可能会问,为什么要费心处理雅可比符号的复杂性呢?一个更简单的测试,即​​费马素性测试​​,检查的是费马小定理的一个推论:an−1≡1(modn)a^{n-1} \equiv 1 \pmod nan−1≡1(modn)。事实证明,Solovay-Strassen 条件​​严格更强​​:如果一个数对给定的底数 aaa 通过了 Solovay-Strassen 测试,那么它也保证能通过费马测试,但反之则不然。

费马测试有一个致命缺陷:​​卡迈克尔数​​的存在。这些是合数,如 561=3×11×17561 = 3 \times 11 \times 17561=3×11×17,它们对于费马测试是“完美的骗子”。对于每一个与它们互素的底数 aaa,它们都能通过测试,使得费马测试完全失效。而 Solovay-Strassen 测试,凭借其更严格的条件,没有这样的致命弱点。已经证明不存在“绝对的欧拉-雅可比骗子”;对于任何奇合数,即使是卡迈克尔数,也总会有见证者能够揭示其真实本性。这种稳健性正是该测试如此强大的原因。

这段从素数的简单性质到稳健的概率性算法的旅程,展示了数论之美。其原理深刻且相互关联,但由此产生的机制却是一个实用而高效的发现引擎。测试的步骤——计算最大公约数、模幂运算和雅可比符号——都可以快速执行,即使是对于有数百位数字的数,其耗时也只与数字位数成低次多项式关系(比如对于一个 LLL 比特的数,时间复杂度为 O(L3)O(L^3)O(L3))。正是这种深刻理论与算法效率的融合,构成了现代密码学的基石,守护着我们的数字世界。

应用与跨学科联系

在我们穿越 Solovay-Strassen 测试复杂机制的旅程之后,你可能会感到一种惊奇。可以肯定,它是一件精美的数学钟表装置。但它究竟有何用处?这场由数字、模算术和雅可比符号组成的优雅舞蹈,是否对数论教科书之外的世界有任何影响?答案是响亮的“是”。事实上,这个测试以及其他类似的测试正在我们数字世界的核心地带悄然运行。它的故事是一个经典案例,讲述了最纯粹的数学思想如何在技术中找到意想不到的、至关重要的应用。

提问的艺术:素性测试与因式分解

在我们看到该测试的实际应用之前,我们必须理解计算领域一个微妙但至关重要的区别:*素性测试与整数分解*之间的差异。素性测试问的是一个简单的“是或否”问题:“这个数是素数吗?”而因式分解问的是一个难得多的问题:“是哪些素数相乘构成了这个数?”

你可能认为这两者是同一枚硬币的两面,但它们在计算难度上代表着一道巨大的鸿沟。为了对此有所体会,请考虑合数 n=47053n = 47053n=47053。如果我们幸运或聪明,或许能找到一个“技巧”来分解它。例如,一种名为 Pollard's p−1p-1p−1 算法的方法有时能以惊人的速度分解一个数,前提是它的某个素因子(比如 ppp)具有一个特殊性质,即 p−1p-1p−1 是“平滑的”——也就是说,p−1p-1p−1 本身的所有素因子都很小。在我们的例子中,n=211×223n = 211 \times 223n=211×223。事实證明 211−1=210211-1 = 210211−1=210,而 210 的素因子仅有 2、3、5 和 7。Pollard's 算法正是利用了这种结构,能够迅速揭示 211 是 nnn 的一个因子。

但这是一个特例。对于一个普通的大数,比如一个有数百位数字的数,因式分解被认为是难解的。正是这种难度支撑着现代密码学的大部分内容。

另一方面,素性测试则完全是另一回事。我们不是试图将数字分解,而是审问它。我们问:“你的行为像一个素数吗?”当我们对数字 223 应用 Solovay-Strassen 测试时,我们不是在寻找它的因子。我们是在检查它是否通过了一个所有素数都会通过的特定行为测试。结果表明,它确实通过了测试,这为我们提供了强有力的证据,证明 223 实际上是素数。这种无需分解就能高效地证明一个数“可能为素数”的能力,是现代计算机科学的一块基石。

数字侦探:Solovay-Strassen 在行动

那么,这种审问在实践中是如何运作的呢?Solovay-Strassen 测试不仅仅是一个定理;它是一个算法,一个可以写成代码并由计算机执行的配方。这个配方的核心步骤是检查欧拉准则 an−12≡(an)(modn)a^{\frac{n-1}{2}} \equiv \left(\frac{a}{n}\right) \pmod{n}a2n−1​≡(na​)(modn) 对于一个数 nnn 和一个选定的“底数”aaa 是否成立。

左边部分,即模幂运算,计算机可以使用一种叫做平方求幂的算法轻松计算,即使对于巨大的数字也是如此。右边部分,即雅可比符号 (an)\left(\frac{a}{n}\right)(na​),才是真正神奇的地方。从表面上看,它的定义要求你知道 nnn 的素因子——而这正是我们想要避免的!但是,奇迹般地,二次互反律为我们提供了一种无需分解 nnn 就能计算雅可比符号的方法。它提供了一系列变换——翻转符号、提取2的幂次、以及化简顶部的数字——从而迅速得出答案。这个算法感觉上似乎不可能实现,但它却完美地运作,让我们能够以媲美求最大公约数的速度计算出 (an)\left(\frac{a}{n}\right)(na​)。

当我们释放这位数字侦探时,它的效果非常显著。考虑数字 n=341n=341n=341。它是一个臭名昭著的冒名顶替者。对于底数 a=2a=2a=2,它通过了更简单的费馬测试,因为 2340≡1(mod341)2^{340} \equiv 1 \pmod{341}2340≡1(mod341),这让它看起来像一个素数。但 Solovay-Strassen 测试是一个更敏锐的审问者。它检查 2170≡(2341)(mod341)2^{170} \equiv \left(\frac{2}{341}\right) \pmod{341}2170≡(3412​)(mod341) 是否成立。快速计算可知,2170≡1(mod341)2^{170} \equiv 1 \pmod{341}2170≡1(mod341),但雅可比符号 (2341)\left(\frac{2}{341}\right)(3412​) 是 −1-1−1。由于 1≢−1(mod341)1 \not\equiv -1 \pmod{341}1≡−1(mod341),它的伪装被揭穿了。Solovay-Strassen 测试正确地揭示了 341是一个合数。

确定性的局限:概率与“证明”的本质

现在来看一个有趣的转折。Solovay-Strassen 测试是可能被欺骗的。存在一些被称为欧拉-雅可比伪素数的合数,它们会对某些底数通过测试。最小且最著名的是卡迈克尔数 n=561n=561n=561。如果我们用底数 a=2a=2a=2 测试 n=561n=561n=561,我们发现条件 2280≡(2561)(mod561)2^{280} \equiv \left(\frac{2}{561}\right) \pmod{561}2280≡(5612​)(mod561) 简化为 1≡1(mod561)1 \equiv 1 \pmod{561}1≡1(mod561),这是成立的。测试被骗了;它宣布 561 “可能为素数”。对于这个底数,561 是一个“骗子”。

这个失败是否宣判了该测试的无用?绝对不是。这正是现代计算机科学中最美妙的思想之一发挥作用的地方:概率的力量。事实证明,对于任何合数 nnn,“骗子”底数的集合都很小。实际上,这个骗子集合构成了与 nnn 互素的数在乘法下形成的群的一个*真子群*。这种与抽象代数的深刻联系保证了骗子最多只占所有可能底数的一半。

这个事实是我们的救星。如果我们随机选择一个底数 aaa,我们至少有 50%50\%50% 的机会选到一个能揭示该合数的“见證者”。如果我们用一个新的、独立选择的随机底数再做一次,连续两次被骗的概率最多是 12×12=14\frac{1}{2} \times \frac{1}{2} = \frac{1}{4}21​×21​=41​。如果我们重复测试 kkk 次,将合数错误地识别为素数的概率最多为 (12)k(\frac{1}{2})^k(21​)k。仅仅经过 10 次迭代,出错的概率就低于千分之一。经过 100 次迭代后,这个概率比中彩票的同时被闪电击中的概率还要小。通过使用随机性,我们用绝对确定性换取了压倒性的、实际的确定性。

万神殿中的一席之地:素性测试比较

Solovay-Strassen 测试是一个重要的里程碑,但它只是算法发现这个宏大故事的一部分。

它的主要前身是费馬测试。费馬测试的弱点在于存在卡迈克尔数,比如 561561561,它们对每一个可能的互素底数都是骗子。Solovay-Strassen 测试是一个巨大的改进,因为即使对于卡迈克尔数,它也能保证至少有一半的底数会是见证者。

在 Solovay 和 Strassen 之后不久,另一个测试出现了:Miller-Rabin 测试。它基于类似的思想,但使用了一个更严格的条件,与寻找 1 的非平凡平方根有关。这个更严格的条件使其更加强大。对于 Miller-Rabin 测试,一个随机底数是骗子的概率最多为 14\frac{1}{4}41​,这比 Solovay-Strassen 测试的 12\frac{1}{2}21​ 是一个显著的改进。我们甚至可以在实践中看到这一点:合数 n=561n=561n=561 对底数 2 欺骗了 Solovay-Strassen 测试,但对于同一个底数,Miller-Rabin 测试却能正确地将其识别为合数。

你可能会认为这种额外的能力会带来更高的计算成本。但仔细分析表明,对于单次迭代,两种测试所需的昂贵模乘法次数在渐近意义上是相同的。因为它以大致相同的代价提供了更强的保证,Miller-Rabin 测试已经成为大多数现代应用中的首选概率性素性测试,从生成 RSA 加密中的大素数到密码学和计算数论的其他领域。

隐藏结构的永恒之美

Solovay-Strassen 测试的故事是科学探索之旅的一个完美缩影。它始于 18 世纪一个纯粹的抽象定理。它与数字深层、隐藏的代数结构相连。它拥抱现代的随机性概念,锻造出一个具有巨大实用价值的工具。它表明,即使一个算法不是完美的,它也可以“足够好”来改变世界。它向我们展示,在寻求真理的过程中,有时最有力的问题不是“这是真的吗?”而是“几率有多大?”。在其中,我们发现了数学、计算机科学以及证明本质本身之间一种美妙而极其有用的统一。