Ruby isPrime方法
时间:2020-03-06 14:51:27 来源:igfitidea点击:
('1' * N) !~ /^1?$|^(11+?)+$/
在网上,我发现了这段适用于N> = 0的Ruby代码,该代码确定N是否为质数。据我所知,它看起来就像玩正则表达式,但我不知道它是如何工作的。有人可以告诉我它是如何工作的吗?
解决方案
我们可以在此处找到有关此代码的详细说明:
http://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/
最大公约数(gcd):
/^(1+)*=+$/.match('1' * x + '=' + '1' * y)[1].length
这和is_prime一个的工作方式大致相同。它会在放弃之前尝试所有组合。
这个将尝试将第一个数字分成偶数个部分,并将第二个数字与一个或者多个这些部分匹配。如果找到匹配项,则返回所选零件的长度。
另请参阅我们使用过的最出色的正则表达式是什么? (是的,我可以确认此正则表达式最初是由Abigail编写的。我什至听过她解释了它的工作原理:)
这可能有点题外话,但是在Ruby 1.9中,我们可以执行以下操作:
require 'mathn' 38749711234868463.prime? => false
另一个具有很好解释的博客:著名的Perl One-Liners解释(第三部分)
如果一个字符串的长度是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情况。