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 中处理任意精度的数字,请参阅 GMP 或 BC 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的最大素数的主要内容,如果未能解决你的问题,请参考以下文章