当前位置: 首页 > 后端技术 > PHP

各种求素数算法的比较

时间:2023-03-29 22:34:24 PHP

首先申明本人水平有限,只是做个记录,不对的地方还请大家指正,文中垃圾内容请见谅!!无意中在网上浏览了一个叫《求质数算法的N种境界(N>10)》的技术博客。写得很好。有兴趣的读者可以自行搜索。然后就想试试这个博客写的各种求素数的方法。不想搭建环境,所以暂时使用PHP语言,在apache中运行,简单测试一下。首先,弄清楚质数(primenumber)的概念,也称素数,有无穷大。素数定义为大于1的自然数,除了1和它本身之外没有其他因数。100以内的素数表2357111317192329313741434753596167717379838997素数的个数是无限的。与之相反的是合数,数学术语,英文名Compositenumber,是指除了1和它本身(如:4、6、8、9、10)。相反的是质数,1既不是质数也不是合数。最小的合数是4。下面是寻找100//1以内素数的算法。最基本的写法$a=1;//序列号,识别数字为($i=2;$i<101;$i++){$primes=0;对于($k=1;$k<=$i;$k++)if($i%$k===0)$primes++;if($primes<=2){//一个可以被1和它本身(不包括0)整除的整数echo$a.".{$i}";$a++;}}//2。考虑到所有的数都可以被1整除和//如果有(除了它本身)质因数,那么肯定会小于等于$i/2,所以$i/2//这里不能轻易改变语句为($k=1;$k<=$i;$k++)//for($k=1;$k<=$i/2;$k++);自己试一试就知道了$a=1;//序列号,识别数字for($i=2;$i<101;$i++){$primes=0;对于($k=2;$k<=$i/2;$k++)如果($i%$k===0)$primes++;if($primes<=0){//一个能被1和它本身(不包括0)整除的整数echo$a.".{$i}";$a++;}}//3。进一步认为除2以外所有可能的质因数都是奇数。//所以先测试2,然后测试从3到$i/2的所有奇数。//关键特殊考虑编号2$a=1;//序列号,标识号for($i=2;$i<101;$i++){$primes=0;如果($i!=2&&$i%2===0)$primes++;for($k=3;$k<=$i/2;$k=$k+2)如果($i%$k===0)$primes++;if($primes<=0){//可以被1和它本身整除的整数(不包括0)echo$a.".{$i}";$a++;}}//4。其实只要试试从2到√x(平方根),就可以了。$a=1;//序列号,识别号for($i=2;$i<101;$i++){$primes=0;如果($i!=2&&$i%2===0)$primes++;for($k=3;$k<=sqrt($i);$k=$k+2)如果($i%$k===0)$primes++;if($primes<=0){//能被1和它本身整除的整数(不包括0)echo$a.".{$i}";$a++;}}//5。其实只要试试从2到√x(平方根)里面的所有素数就可以//算法理论中常说的:用空间换时间。就是先把前面的结果保存下来再用//下面我只是用一个数组来实现这个算法。我的技术有限。不知道这是不是对原博客意图的准确理解//客座作者,随便看看$arr=array();$a=1;//序列号,标识号for($i=2;$i<101;$i++){$primes=0;if($i!=2&&$i%2===0)$primes++;if(!empty($arr)){foreach($arras$key=>$value){if($value<=sqrt($i)){如果($i%$value===0)$primes++;}}}if($primes<=0){//一个可以被1和它本身整除的整数(不包括0)array_push($arr,$i);回声$a。".{$i}";$a++;}}接下来我们做一个简单的性能测试,比较一下各个算法的优劣,只是考虑时间。下面是测试结果,因为算法1、2、3的差异不是很大,所以不做比较,比较下面1、4、5的优劣在100以内算法1[时间:0.00099992752075195]sAlgorithm5[time:0.0010001659393311]sTheresultsshowthatthedifferenceisnotbigwithin100Algorithm1[time:0.00099992752075195]stime:0.059004068374634]sAlgorithm4[time:0.004000186920166]sAlgorithm5[time:0.035001993179321]s结果显示在1000以内,算法4突出了10000以内的优势算法1[time:4.537260055542]s算法4[time:0.12902]s算法5[time:1.9741129875183]s结果显示在10000以内,算法1不再有效算法5在100,000以内也不行s的结果在100,000以内。除算法4外,其他都不可行。总结:起初,我认为算法5会更好。不知道是我写的垃圾,还是php数组底层的问题,也可能是我没有理解空间换时间的本质,所以算法4仍然是目前最好的。本人水平有限,就做个记录吧。不对之处还请大家指正,文中垃圾之处还请见谅!!