这个正则表达式如何找到素数? [复制]

Posted

技术标签:

【中文标题】这个正则表达式如何找到素数? [复制]【英文标题】:How does this regex find primes? [duplicate] 【发布时间】:2011-03-18 18:51:03 【问题描述】:

可能重复:How to determine if a number is a prime with regex?

This page 声称这个正则表达式发现了非素数(反例:素数):

/^1?$|^(11+?)\1+$/

这是如何找到素数的?

【问题讨论】:

不是一个骗局。这是一个不同的正则表达式和不同的技术,并且有更好的答案,可以启动。 @bmargulies:这骗子。正则表达式是相同的,考虑到这个问题的输入限制,并且 Java 的 String.matches 方法将正则表达式与整个字符串匹配(所以 ^ 和 $ 是隐含的),它显然是这样做的。 @Rog - 那里的赞成答案从未提及一元。 @bmargulies:如果您认为您可以为该问题提供更好或更完整的答案,请这样做。我会将此问题标记为合并,但问题文本中的 表面 差异意味着答案需要进行一些编辑(通常是这种情况),即使在您消除这些表面差异后问题是相同的。 @Rog 在这一点上,我相信钻石会巧妙地合并。 【参考方案1】:

我认为这篇文章解释得很好,但我也会尝试一下。

输入格式为unary。 1 是1,2 是11,3 是111,等等。0 是一个空字符串。

正则表达式的第一部分将 0 和 1 匹配为非素数。第二个是魔法发挥作用的地方。

(11+?) 从寻找除数开始。它首先被定义为 11 或 2。\1 是一个引用先前捕获的匹配项的变量,因此 \1+ 确定该数字是否可以被该除数整除。 (111111首先将变量赋值给11,然后确定剩余的111111重复的,所以6可以被2整除。)

如果数字不能被 2 整除,正则表达式引擎会增加除数。 (11+?) 变成 111,然后我们再试一次。如果在任何时候正则表达式匹配,则该数字有一个不产生余数的除数,因此该数字不能是素数。

【讨论】:

这真是太棒了。 这个答案真是太棒了.. :)

以上是关于这个正则表达式如何找到素数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将标准正则表达式转换为 php 正则表达式? [复制]

正则表达式代雨燕[复制]

如何在正则表达式值或值内添加注释? [复制]

如何将此正则表达式行分成几行? [复制]

如何使用正则表达式查找具有特定起始字符串的所有匹配项? [复制]

使用正则表达式验证素数