PHP と GMP を使用して大数の Miller-Rabin 素数テストを実装する方法

PHPz
リリース: 2023-07-30 09:34:01
オリジナル
1188 人が閲覧しました

PHP と GMP を使用して大数の Miller-Rabin 素数性テストを実装する方法

はじめに:
素数は暗号化とコンピューター サイエンスで重要な役割を果たします。 Miller-Rabin 素数性テストは、数値が素数であるかどうかをテストするために使用される確率的アルゴリズムであり、高い確率で正しい答えが得られます。この記事では、PHP 言語と GMP ライブラリ (GNU Multiple Precision Arithmetic Library) を使用して、大数に対する Miller-Rabin 素数性テスト アルゴリズムを実装する方法を紹介します。

GMP ライブラリの紹介:
GMP ライブラリは、高精度計算のためのオープン ソース ライブラリであり、大きな整数をサポートします。 GMP ライブラリを使用すると、大きな数の加算、減算、乗算、除算などの演算を含む大きな数の計算を処理できます。

アルゴリズム原理:
Miller-Rabin の素数性テスト アルゴリズムは、フェルマーの小定理の拡張に基づいています。この定理は次のように述べています。素数 p と整数 a が互いに素であり、a^(p-1) ≡ 1 (mod p) である場合、a は p の基数であり、p は塩基の半分以上を持ちます。

ミラー・ラビンの素数性検定アルゴリズムによれば、異なる基数を複数回選択することで、ある数値が素数であるかどうかを一定の確率で判定できます。アルゴリズムの考え方は、テストされる数値 n ごとにランダムな基数 b を選択し、a^d ≡ 1 (mod n) および a^(2^r*d) ≡ -1 (mod n) を計算するというものです。 ) それが真かどうかはわかりませんが、真であれば n は素数である可能性があり、そうでない場合は n が合成数であると確信できます。

コード例:

<?php

// 导入GMP库
if (!extension_loaded('gmp')) {
    dl('gmp.so');
}

function millerRabinTest($n, $k = 20) {
    if ($n <= 1 || $n == 4) {
        return false;
    }
    if ($n <= 3) {
        return true;
    }

    // 将$n-1表示为(2^r) * d的形式
    $r = 0;
    $d = $n - 1;
    while (gmp_mod($d, 2) == 0) {
        $d >>= 1;
        $r++;
    }

    for ($i = 0; $i < $k; $i++) {
        $a = gmp_random_range(2, $n - 2);
        $x = gmp_powm($a, $d, $n);

        if ($x == 1 || $x == $n - 1) {
            continue;
        }

        $continueLoop = false;
        for ($j = 0; $j < $r - 1; $j++) {
            $x = gmp_powm($x, 2, $n);
            if ($x == 1) {
                return false;
            }
            if ($x == $n - 1) {
                $continueLoop = true;
                break;
            }
        }

        if (!$continueLoop) {
            return false;
        }
    }

    return true;
}

// 测试示例
$numbers = [
    gmp_init('2'),
    gmp_init('3'),
    gmp_init('4'),
    gmp_init('17'),
    gmp_init('7919'),
    gmp_init('999999999999999993')
];

foreach ($numbers as $number) {
    echo gmp_strval($number) . ' is ' . (millerRabinTest($number) ? 'prime' : 'composite') . PHP_EOL;
}
ログイン後にコピー

この例では、millerRabinTest() 関数を使用して、数値が素数かどうかをテストします。パラメーター $k は、テストの反復数を表します。このテスト例では、いくつかの数値を個別にテストし、テスト結果を出力しました。

概要:
Miller-Rabin 素数性テスト アルゴリズムは、特に大きな数に適した効率的な素数性検出アルゴリズムです。 PHP 言語と GMP ライブラリを使用すると、このアルゴリズムを簡単に実装できます。 Miller-Rabin の素数性テストを通じて、数値が素数であるかどうかを効果的に判断できるため、暗号化、セキュリティ、その他の分野で強力なツールが提供されます。

以上がPHP と GMP を使用して大数の Miller-Rabin 素数テストを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート