php的最大素数

Posted

技术标签:

【中文标题】php的最大素数【英文标题】:The largest prime factor with php 【发布时间】:2010-05-19 18:25:54 【问题描述】:

我用 php 编写了一个程序来找到最大的质因数。我认为它非常优化,因为它加载速度非常快。但是,有一个问题:它没有计算非常大的数字的质因数。这是程序:

function is_even($s)       
    $sk_sum = 0;        
    for($i = 1; $i <= $s; $i++)            
        if($s % $i == 0)  $sk_sum++;          
       
    if($sk_sum == 2)           
        return true;            
              


$x = 600851475143; $i = 2; //x is number    
while($i <= $x)    
    if($x % $i == 0) 
        if(is_even($i)) 
            $sk = $i; $x = $x / $i;
        
    
    $i++;   

echo $sk;

【问题讨论】:

我会将is_even 重命名为is_prime,并让它在函数的最后一行返回false。此外,您不必在该循环中包含 $i = 1 或 $i = $s,您可以返回 false 以防它可以被任何其他数字整除。 【参考方案1】:

PHP中最大的非溢出整数存储在常量PHP_INT_MAX中。

您将无法在 PHP 中使用大于此值的整数。

要查看所有 PHP 的预定义常量,只需使用:

<?php
echo '<pre>';
print_r(get_defined_constants());
echo '</pre>';
?>

PHP_INT_MAX 的值可能为2,147,483,647

要在 PHP 中处理任意精度的数字,请参阅 GMPBC Math PHP 扩展。

【讨论】:

【参考方案2】:

您应该阅读有关Prime testing 和Sieving 的信息。

特别是,您不需要测试每个除数是否为素数。

像下面这样会更快。

while($i <= $x) 

    while ($x % $i == 0)
    
        $sk = $i;
        $x = $x / $i;
    
    $i++;

您也可以在 $i 到达 sqrt($x) 时停止外循环,如果您还没有找到除数,那么您知道 $x 是素数。

【讨论】:

【参考方案3】:

嗯,每一种语言都有它自己的(虽然通常是相同的)限制,所以如果你超过了这个 php 的限制,你就不能再高了。最大整数是 9E18。

【讨论】:

当然可以扩展限制,只需编写一个类(或找到一个库),将任意大的数字存储为小于 MAX_INT 的数字数组,并提供标准运算符来处理它们。 查看我的答案以获得 GMP 和 BC Math 扩展的链接,它们在 PHP 中处理任意大的数字。 您的建议是一个很好的解决方法。但是,您不能超出给定的限制。

以上是关于php的最大素数的主要内容,如果未能解决你的问题,请参考以下文章

TOJ 4705最大素数

1405 两素数的和与最大积

求一个数的最大素数的算法

在c中使用递归找到最大的素数

素数长度的所有连续子数组的最大和

求n以内最大的k个素数以及它们的和 (10分)