PHP新手求助:如何找出所有差值为2的素数对
如何筛选出所有满足|p₁ - p₂|=2的素数对(孪生素数)
先看你原代码存在的几个问题:
- 素数判断函数有bug:
- 循环条件
$teiler*$teiler < $nummer错误,比如4的平方根是2,这个条件会让循环不执行,误把4判断为素数,应该改成$teiler*$teiler <= $nummer - 没处理
$nummer <=1的情况,1不是素数,但原函数会返回TRUE
- 循环条件
- 素数对筛选逻辑不对:你现在只是把相邻素数配对后计算差值,没有筛选出差值等于2的对,最后输出的是差值数组,不是目标素数对本身
下面是修正并优化后的完整代码:
echo '<pre>'; // 修正后的素数判断函数,处理边界情况并优化效率 function istPrimzahl($nummer) { // 小于等于1的数不是素数 if ($nummer <= 1) { return false; } // 2是唯一的偶素数 if ($nummer == 2) { return true; } // 偶数直接排除(除了2) if ($nummer % 2 == 0) { return false; } // 只检查奇数因子,且范围到平方根即可 for ($teiler = 3; $teiler * $teiler <= $nummer; $teiler += 2) { if ($nummer % $teiler == 0) { return false; } } return true; } $anfang = 1; $ende = 2000; $primzahlen = []; // 收集指定范围内的所有素数 for ($zahl = $anfang; $zahl <= $ende; $zahl++) { if (istPrimzahl($zahl)) { $primzahlen[] = $zahl; } } $孪生素数对 = []; // 遍历素数数组,筛选差值为2的相邻素数对 for ($i = 0; $i < count($primzahlen) - 1; $i++) { $当前素数 = $primzahlen[$i]; $下一个素数 = $primzahlen[$i + 1]; // 因为素数是递增排列的,直接用后减前判断即可,不用abs if ($下一个素数 - $当前素数 == 2) { $孪生素数对[] = [$当前素数, $下一个素数]; } } // 输出结果 print_r($孪生素数对); echo '</pre>';
关键优化点说明:
- 素数判断函数里直接排除偶数(除了2),循环只检查奇数因子,比原代码效率更高
- 筛选素数对时,因为素数数组是从小到大排序的,所以直接比较相邻两个素数的差值是否为2即可,不用计算绝对值
- 修复了原函数对1、4这类数的错误判断
内容的提问来源于stack exchange,提问作者EatMyShorts
相关产品推荐
相关产品推荐

