>백엔드 개발 >PHP 튜토리얼 >PHP와 GMP를 사용하여 대량의 Miller-Rabin 소수성 테스트를 구현하는 방법

PHP와 GMP를 사용하여 대량의 Miller-Rabin 소수성 테스트를 구현하는 방법

PHPz
PHPz원래의
2023-07-30 09:30:251220검색

PHP와 GMP를 사용하여 큰 숫자의 Miller-Rabin 소수성 테스트를 구현하는 방법

소개:
소수는 암호화 및 컴퓨터 과학에서 중요한 역할을 합니다. 밀러-라빈 소수성 테스트(Miller-Rabin primality test)는 숫자가 소수인지 테스트하는 데 사용되는 확률론적 알고리즘으로 높은 확률로 정답을 제공합니다. 이 기사에서는 PHP 언어와 GMP 라이브러리(GNU Multiple Precision Arithmetic Library)를 사용하여 큰 수에 대한 Miller-Rabin 소수성 테스트 알고리즘을 구현하는 방법을 소개합니다.

GMP 라이브러리 소개:
GMP 라이브러리는 고정밀 계산을 위한 오픈 소스 라이브러리로, 큰 정수를 지원합니다. GMP 라이브러리를 사용하여 큰 수 덧셈, 뺄셈, 곱셈, 나눗셈 및 기타 연산을 포함한 큰 수 계산을 처리할 수 있습니다.

알고리즘 원리:
밀러-라빈 소수성 검정 알고리즘은 페르마의 작은 정리(Fermat's Little Theorem)의 확장을 기반으로 합니다. 정리에 따르면 소수 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.