一个判断是否为质数的正则表达式

  源地址:http://www.cnblogs.com/Greatest/archive/2010/07/21 /1782016.html
  这个神奇的正则表达式就是:/^1?$|^(11+?)\1+$/
  首先这个东西的出处在这里:http://www.noulakaz.net/weblog/2007/03/18/a-regula r-expression-to-check-for-prime-numbers/
  原来这个正则表达式是Perl的,在上面的地址中,那个作者用Ruby改写了。为了让大家看得明白,这里我用Javascript改写一下: 下面,我将一半翻译,一半自己的理解来解释一下这个正则表达式为什么能判断是否为质数。
  先看一下上面的isprime 函数,它将按照n,生成一个n个'1'的字符串,然后交给这个正则表达式来判断。这个正则表达式匹配任何"非质数"个"1"的字符串。
  此正则表达式分成由"|"分割两部分 /^1?$/和/^(11+?)\1+$/。
  /^1?$/ 很明显是匹配空字符串或者"1",也就是n==0或n==1,这2个不是质数。
  下面来解析一下后面那部分,/^(11+?)\1+$/ 。
  它首先匹配(11+?),然后\1是对前面(11+?)匹配部分的引用,也就是\1+的意思就是前面(11+?)匹配的部分至少重复1次。
  其次,(11+?) 匹配的是至少两个1,也就是"11","111","1111"这样的字符串。
  这样就很明显了,如果X=(11+?)匹配的内容(假定为x个"1"),那么后半部分的正则表达式就可以写成/XX+/也就是至少2个X(假定为k个X)。那么,整个就是匹配k*x个1(x>=2,k>=2),很明显k*x不是质数,而且也不会是2.而且由于正则表达式匹配的方式,它会通过backtrace穷举所有可能的k和x来匹配输入的n个"1",所以如果不匹配那就只剩下质数了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值