Raku 的 is-prime 函数有多可靠?

Sea*_*ean 9 primes raku

Raku 函数的文档说明is-prime如下:

如果已知此 Int 是素数,或者根据概率 Miller-Rabin 测试很可能是素数,则返回 True。

如果已知此 Int 不是素数,则返回 False。

我在 Raku 中进行了大量的代码编程,对于许多问题来说,有一个内置的方法来测试素性是非常方便的。例如,要获取素数的惰性无限序列:

my @primes = grep &is-prime, ^Inf;
Run Code Online (Sandbox Code Playgroud)

然而,有时我会因为文档中所说的“如果此 Int 为素数则返回 True,否则返回 False”以外的内容而感到困扰。事实上,该措辞似乎承认可能​​存在误报或漏报。

真的有多可靠is-prime

小智 10

Raku 使用 Miller-Rabin 素数测试,该测试检查潜在素数是否在不同碱基中可能是素数,并且它可能是素数的碱基越多,它实际上是素数的可能性就越大。其精度至少为 1\xc2\xa0\xe2\x88\x92\xc2\xa04 \xe2\x88\x92 k,其中k是运行的迭代次数。我无法找到 Raku 运行的实际迭代次数,可能很多。但无论如何,围绕 Miller-Rabin 主要测试的普遍观点是,它足以满足实际使用的需要,但不要将其用于任何与加密或其他安全相关的事情。

\n

我个人认为对于代码高尔夫来说已经足够好了 - 这是一种语言功能,如果人们想对此挑剔,那么你可以编写自己的 Raku 版本,除了将素性测试替换为真正的素数测试之外,它是完全相同的。

\n

  • Miller-Rabin 通常用于密码学和安全相关的应用程序。另外,问题是关于“可靠性”的,因此了解迭代次数对于回答问题至关重要。 (2认同)
  • @raiph Forišek & Jančina 对于 32 位来说是可靠的。对于64位,BPSW没有反例,可能会更快。LibTomMath 是“mp_prime_is_prime”调用的源,可以设置为对低于 3317044064679887385961981 的数字进行确定性 Sorenson-Webster 检查;这非常慢(13-14 MR 测试)但很完美,因此可能与 65 到 81 位之间的输入相关。(目前 is-prime 中未使用此功能。) (2认同)
  • @raiph 目前,该代码在高达 32 位的情况下是高效的,除此之外,它还会进行 42 次 MR 测试,如果设置了“LTM_USE_FROBENIUS_TEST”并且未设置“LTM_USE_ONLY_MR”,则还会进行强大的 Lucas-Selfridge 测试。但这根本不合理;即使由于某种原因您希望错误概率为 10^24 中的 1,使用 Frobenius 检验也会更有效。在 BPSW 之后运行 mp_prime_frobenius_underwood 可以满足所有实际需求,但要获得 10^24 中的 1,您将需要该测试所缺少的参数化。 (2认同)