使用正则表达式验证素数

今天看到了这种相当奇妙的验证方法,原代码是JS的,但是算法对于py同样适用。

原代码如下:

 1 function ss(d) {
 2     if (d <= 3) {
 3         return true;
 4     }
 5     //将数值转成111
 6     var str = '';
 7     while (--d >= 0) {
 8         str += 1;
 9     }
10     console.log("str:", str);
11     return !/^(11+?)\1+$/.test(str)
12 }
13 
14 // 测试
15 for (var i = 2; i < 100; i++) {
16     if (ss(i)) {
17         console.log(i)
18     }
19 }

试验结果显示这种算法确实有效。

这个算法实际上是讲数字转换成全为1的长度等于数值大小的字符串,然后对字符串进行匹配。

在非贪婪模式下,11+可以匹配11,也可以匹配到111,然后通过\1反向引用,可以同时匹配两种模式。满足这两种模式的判断为非素数(正则的test方法结果取非),不满足的则是素数。

具体的数学原理目前不太明白,记录以备增补。

 

这种算法的优点是不需要顺序遍历n/2次,在对计算量有限制的场合很有效。但是由于需要构建数值大小长度的字符串,如果数值太大,则会占用相当大的内存,可能造成内存溢出。可以认为是一种空间换时间的解决方案。

 

posted @ 2016-06-19 14:35  harelion  阅读(576)  评论(0编辑  收藏  举报