2010-03-02 20 views
3

我有一個問題,我想計算什麼是最低素數是一個數字,但我不明白PHP給我的結果。模PHP的問題

如果我有這個數

$number = 600851475143; 

然後我模量是:

$primes = array(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97); 

    foreach($primes as $key=>$value) {  
     if($number % $value == 0) {echo $value; break; } 
    } 

爲什麼是它$值= 3?如果$ value = 3,那意味着600851475143/3 應該是是一個整數,但它不是。所以我不明白爲什麼if()的計算結果爲true?

+0

當我跑了,它沒有打印3? – 2010-03-02 19:39:38

+0

看看這個:http://codepad.org/cjCD14gJ – Eli 2010-03-02 19:41:14

+0

這:http://codepad.org/R9l8wBuv – Eli 2010-03-02 19:45:29

回答

0

使用PHP 5.2.8,它會按照問題中的描述失敗。看起來模運算符不適用於大整數。應考慮使用bc_mod(模數以任意精度):

<?php 

$number = 600851475143; 

$primes = array(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97); 

    foreach($primes as $key=>$value) 
    {  
     if($number % $value == 0) {echo $value."<br/>"; } 
     if(bcmod($number, $value) == 0) {echo "bcmod ".$value."<br/>"; } 
    } 

?> 

上面的代碼打印:

bcmod 71

0

我可能會誤解它,但是modulo會給你一個部門的其餘部分,例如, 600851475143/3是200283825047休息2,這就是它給你的回報。

+0

是的。我知道。所以$數字%3應該等於? – Eli 2010-03-02 19:44:05

4

參見本bug listing here

%對於超過2^31(32位)或2^63(64位)的數字不起作用。改爲使用BCMOD

+0

是的。我剛剛發現。因爲它是一個浮動。 – Eli 2010-03-02 19:48:32

+0

在64位平臺上使用PHP 5.2.5可以很好地工作(我希望在這樣的系統上模數可以高達2^63)。但我相信32位平臺上的模數仍然有這個限制,這不應該讓人感到意外。 – 2010-03-02 20:39:17