24
('1' * N) !~ /^1?$|^(11+?)\1+$/

在网上,我发现这段 Ruby 代码适用于 N >= 0,它确定 N 是否为素数。据我所知,它看起来像是在玩正则表达式,但我不知道它是如何工作的。有人可以告诉我它是如何工作的吗?

4

7 回答 7

25

您可以在此处找到此代码的详细说明: http ://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/

于 2008-09-29T01:53:14.253 回答
20

这可能有点离题,但在 Ruby 1.9 中,您可以这样做:

 require 'mathn'
 38749711234868463.prime?
 => false
于 2010-01-18T19:58:27.267 回答
3
require 'prime'

Prime.prime?(4)
# => false

Prime.prime?(5)
# => true

或者:

require 'prime'

Prime.instance.prime?(4)
# => false

Prime.instance.prime?(5)
# => true
于 2014-04-01T08:44:46.097 回答
2

另请参阅您使用过的最出色的正则表达式是什么?(是的,我可以确认这个正则表达式最初是由 Abigail 编写的。我什至听过她解释它是如何工作的 :)

于 2008-09-29T07:55:46.317 回答
1

最大公约数(gcd):

/^(1+)\1*=\1+$/.match('1' * x + '=' + '1' * y)[1].length

这和 is_prime 都以大致相同的方式工作。它会在放弃之前尝试所有组合。

这个将尝试将第一个数字分成偶数部分,并将第二个数字与这些部分中的一个或多个匹配。如果找到匹配项,则返回所选部分的长度。

于 2008-09-29T07:42:39.797 回答
1

另一个有很好解释的博客:Famous Perl One-Liners Explained (part III)

于 2010-01-18T20:35:37.380 回答
1

如果一个 1 的字符串的长度是复合的,那么该字符串可以分解为多个相同的子字符串,如 111111 -> 11 11 11

例如,1111111111,有 10 个 1,匹配 (11){5} 或 (11111){2},其中 {2} 表示重复 2 次。111111111,有 9 个 1,匹配 (111){3}。

通过概括 1 的计数和 {} 中的数字,正则表达式是 /(1{2,}){2,}/. 但是,1{2,} 也可以写成 11+,并且 (...){2,} 可以重写为 (...)\1+,带有反向引用。

^1?$一个交替中的部分检查 0 和 1 情况。

于 2010-11-13T20:52:05.617 回答