('1' * N) !~ /^1?$|^(11+?)\1+$/
在网上,我发现这条适用于N> = 0的Ruby代码确定N是否为素数。从我所知道的,它看起来像玩正则表达式,但我不知道它是如何工作的。有人能告诉我它是如何运作的吗?
答案 0 :(得分:25)
您可以在此处找到有关此代码的详细说明: http://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/
答案 1 :(得分:20)
这可能相当偏离主题,但在Ruby 1.9中,您可以这样做:
require 'mathn'
38749711234868463.prime?
=> false
答案 2 :(得分:3)
require 'prime'
Prime.prime?(4)
# => false
Prime.prime?(5)
# => true
或者:
require 'prime'
Prime.instance.prime?(4)
# => false
Prime.instance.prime?(5)
# => true
答案 3 :(得分:2)
另见What is the most brilliant regex you’ve ever used?(是的,我可以确认这个正则表达式最初是由阿比盖尔写的。我甚至听过她解释它是如何工作的:)
答案 4 :(得分:1)
最大公约数(gcd):
/^(1+)\1*=\1+$/.match('1' * x + '=' + '1' * y)[1].length
这个和is_prime都以大致相同的方式工作。它会在放弃之前尝试所有组合。
这个会尝试将偶数部分中的第一个数字拆分,并将第二个数字与这些部分中的一个或多个匹配。如果找到匹配,则返回所选部分的长度。
答案 5 :(得分:1)
另一篇博客有一个很好的解释:Famous Perl One-Liners Explained (part III)
答案 6 :(得分: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个案例。