今天看到了这种相当奇妙的验证方法,原代码是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次,在对计算量有限制的场合很有效。但是由于需要构建数值大小长度的字符串,如果数值太大,则会占用相当大的内存,可能造成内存溢出。可以认为是一种空间换时间的解决方案。