2014-01-26 25 views
0

這裏是我使用gmp_prob_prime的一段代碼。儘管我目前只在10^6範圍內測試數字,但這個函數非常經常地「失敗」我的QuickTest,並且最終需要手動檢查$ NumberToTest的素數。PHP中的函數gmp_prob_prime有點缺乏光澤嗎?

gmp_prob_prime不是很強大嗎?我沒有料到它會在10^9甚至10^12的範圍內提示「可能的素數」。

這裏是我的代碼的功能的片段,是被稱爲:

function IsPrime($DocRoot, $NumberToTest, $PowOf2) 
{ 
// First a quick test... 
// 0 = composite 
// 1 = probable prime 
// 2 = definite prime 
$Reps = 15; 
$QuickTest = gmp_prob_prime($NumberToTest,$Reps); 
if($QuickTest == 0) 
     { 
     return 0; 
     } 
if ($QuickTest == 2) 
     { 
     return 1; 
     } 

// If we get to here then gmp_prob_prime isn't sure whether the $NumberToTest is prime or not. 
print "Consider increasing the Reps for gmp_prob_prime.\n"; 

// Find the sqrt of $NumberToTest; 

...代碼繼續...

回答

0

我直接從C++調用mpz_probab_prime_p當有同樣的行爲,但我無法回想下面的信息是否固定(copied from the manual)。

功能:INT mpz_probab_prime_p(常量mpz_t N,INT代表)

確定n是否是素數。如果n肯定是素數,則返回2;如果n可能是素數(不確定),則返回1;如果n肯定是複合數,則返回0。

該函數進行一些試驗分割,然後進行一些Miller-Rabin概率素性測試。參數代表控制着多少次這樣的測試;較高的價值將降低組合被歸還爲「可能爲素數」的可能性。 25是一個合理的數字;一個複合數字將被識別爲一個概率小於2 ^( - 50)的素數。

米勒拉賓和類似的測試可以更恰當地稱爲複合性測試。已知失敗的數字是複合數字,但通過的數字可能是質數或可能是複合數字。只有少數複合材料通過,因此通過的材料可能被認爲是主要材料。