素数(素数)とは、2、3、5、7などを超える自然数でのみ、それ自体ではそれ自体では分割できる数字を指します。プライムナンバーは、特に公共のキー暗号化と判断において、暗号化および暗号化アルゴリズムに幅広いアプリケーションを持っています。
番号が素数であるかどうかを正確に決定することは、セキュリティアルゴリズムを構築するための基礎です。暗号化アルゴリズムの開発により、大規模な整数であるかどうかの効率的な判断がアルゴリズム設計の重要な部分になりました。
gmp_prob_prime()は、数字が素数であるかどうかを判断するためにPHPによって提供される関数であり、GMP拡張に依存します。関数プロトタイプは次のとおりです。
int gmp_prob_prime(GMP $a [, int $reps = 10])
パラメーター説明:
返品値の説明:
この機能にはGMP拡張サポートが必要であり、 PHP.iniで拡張= GMPを構成することで有効にすることができることに注意してください。
PHPのgmp_prob_prime()関数の基礎となる層は、確率アルゴリズムであるSolovay-Strassenプライマーテストアルゴリズムに基づいています。その時間の複雑さはO(k log3 n)についてです。ここで、kはテストの数、nは審査される数です。
$gmp_b = gmp_random_range(2, $gmp_n);
GMP_RANDOM_RANGE()を介して2からNの間の乱数を生成します。
$gmp_gcd = gmp_gcd($gmp_b, $gmp_n);
GCD(b、n)≠1の場合、2つは相互に互換性がなく、nが素数であってはなりません。
$gmp_r = gmp_powm($gmp_b, gmp_div_q($gmp_n, 2), $gmp_n);
$gmp_jacobi = gmp_jacobi($gmp_b, $gmp_n);
<p>if ($gmp_jacobi == 0 || $gmp_r != $gmp_jacobi) {<br>
return 0;<br>
}<br>
二次残差は、オイラーの差別法によって検証されています。条件が満たされていない場合、Nは素数ではありません。
上記の手順は、指定された回数(パラメーター$ repsによって決定)で実行されます。
for ($i = 0; $i < $reps; $i++) {
$gmp_b = gmp_random_range(2, $gmp_n);
if (gmp_gcd($gmp_b, $gmp_n) != 1) return 0;
$gmp_jacobi = gmp_jacobi($gmp_b, $gmp_n);
$gmp_r = gmp_powm($gmp_b, gmp_div_q(gmp_sub($gmp_n, 1), 2), $gmp_n);
if ($gmp_jacobi == 0 || $gmp_r != $gmp_jacobi) return 0;
}
return 1;
$gmp_n = gmp_init('101');
$prob = gmp_prob_prime($gmp_n);
if ($prob == 2) {
echo "It is likely to be a prime.";
} elseif ($prob == 0) {
echo "It is not prime.";
} else {
echo "It might be a prime.";
}
この例では、101は「素数である可能性が非常に高い」と認識されています。
GMP_PROB_PRIME()は、大規模なプライミネステストを処理するためのPHPの重要な機能です。確率アルゴリズムSolovay-Strassenと組み合わせることで、数値が素数であるかどうかを効率的に判断できます。この関数は、暗号化アルゴリズム、デジタル署名、ブロックチェーンなど、大きな素数を生成または検証する必要があるアプリケーションシナリオに特に適しています。