現在の位置: ホーム> 最新記事一覧> PHPのgmp_prob_prime()関数は、数値が素数であるかどうかを判断するために使用される関数です。

PHPのgmp_prob_prime()関数は、数値が素数であるかどうかを判断するために使用される関数です。

gitbox 2025-06-06

主要な数字は何ですか

素数(素数)とは、2、3、5、7などを超える自然数でのみ、それ自体ではそれ自体では分割できる数字を指します。プライムナンバーは、特に公共のキー暗号化と判断において、暗号化および暗号化アルゴリズムに幅広いアプリケーションを持っています。

番号が素数であるかどうかを正確に決定することは、セキュリティアルゴリズムを構築するための基礎です。暗号化アルゴリズムの開発により、大規模な整数であるかどうかの効率的な判断がアルゴリズム設計の重要な部分になりました。

gmp_prob_prime()関数の紹介

gmp_prob_prime()は、数字が素数であるかどうかを判断するためにPHPによって提供される関数であり、GMP拡張に依存します。関数プロトタイプは次のとおりです。

 
int gmp_prob_prime(GMP $a [, int $reps = 10])

パラメーター説明:

  • $ A :審査される番号(GMPタイプ)
  • $ reps :テストの繰り返しの数、デフォルトは10です

返品値の説明:

  • 戻り0 :プライムナンバーではないことは間違いありません
  • 返品1 :おそらく素数
  • 戻る2 :おそらくプライムナンバー

この機能にはGMP拡張サポートが必要であり、 PHP.ini拡張= GMPを構成することで有効にすることができることに注意してください。

原始特性テストの基礎となるアルゴリズム:Solovay-Strassen

PHPのgmp_prob_prime()関数の基礎となる層は、確率アルゴリズムであるSolovay-Strassenプライマーテストアルゴリズムに基づいています。その時間の複雑さはO(k log3 n)についてです。ここで、kはテストの数、nは審査される数です。

アルゴリズムのコアステップの分析

1. nに相互に排他的な数字Bをランダムに選択します


$gmp_b = gmp_random_range(2, $gmp_n);

GMP_RANDOM_RANGE()を介して2からNの間の乱数を生成します。

2。最大の共通除数GCDを計算します


$gmp_gcd = gmp_gcd($gmp_b, $gmp_n);

GCD(b、n)≠1の場合、2つは相互に互換性がなく、nが素数であってはなりません。

3。二次残差を計算し、ヤコビシンボルを確認します


$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は素数ではありません。

4. bのランダム性の繰り返しテスト

上記の手順は、指定された回数(パラメーター$ 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_prob_prime()関数の使用例


$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と組み合わせることで、数値が素数であるかどうかを効率的に判断できます。この関数は、暗号化アルゴリズム、デジタル署名、ブロックチェーンなど、大きな素数を生成または検証する必要があるアプリケーションシナリオに特に適しています。