【问题标题】:The largest prime factor with phpphp的最大素数
【发布时间】: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 以防它可以被任何其他数字整除。

标签: php prime-factoring


【解决方案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 testingSieving 的信息。

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

    像下面这样会更快。

    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 中处理任意大的数字。
      • 您的建议是一个很好的解决方法。但是,您不能超出给定的限制。
      猜你喜欢
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2013-10-05
      • 2016-03-25
      相关资源
      最近更新 更多