以下是我正在使用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;
...代码继续......
答案 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和类似的测试可以更恰当地称为复合性测试。已知失败的数字是复合的,但通过的数字可能是素数或可能是复合的。只有少数复合材料通过,因此通过的复合材料可能是最佳的。