PHP中的函数gmp_prob_prime有点缺乏光泽吗?

时间:2014-01-26 12:23:52

标签: php gmp

以下是我正在使用gmp_prob_prime的代码片段。虽然我目前只测试10 ^ 6范围内的数字,但这个函数经常“失败”我的QuickTest并最终需要手动检查$ NumberToTest以获得素数。

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;

...代码继续......

1 个答案:

答案 0 :(得分:0)

直接从C ++调用mpz_probab_prime_p时我有同样的行为,但我不记得以下信息是否修复了它(copied from the manual)。

  

功能:int mpz_probab_prime_p(const mpz_t n,int reps)

     

确定n是否为素数。如果n绝对是素数则返回2,如果n可能是素数(不确定)则返回1,如果n肯定是复合则返回0。

     

这个函数做了一些试验,然后是一些Miller-Rabin概率素性测试。参数reps控制完成了多少次这样的测试;较高的值将减少复合返回的可能性“可能是素数”。 25是合理的数字;然后,合成数将被识别为概率小于2 ^( - 50)的素数。

     

Miller-Rabin和类似的测试可以更恰当地称为复合性测试。已知失败的数字是复合的,但通过的数字可能是素数或可能是复合的。只有少数复合材料通过,因此通过的复合材料可能是最佳的。