Maison >développement back-end >tutoriel php >Comment utiliser PHP et GMP pour implémenter les tests de primalité Fermat sur de grands nombres

Comment utiliser PHP et GMP pour implémenter les tests de primalité Fermat sur de grands nombres

王林
王林original
2023-07-31 16:52:561365parcourir

Comment utiliser PHP et GMP pour implémenter le test de primalité de Fermat sur de grands nombres

Introduction :
Le test de primalité de Fermat est une méthode simple pour détecter si un nombre est premier. Cette méthode est basée sur le petit théorème de Fermat, qui stipule que si p est un nombre premier et a est un entier positif inférieur à p, alors a^(p-1) ≡ 1 (mod p). Ce théorème nous permet de tester si un nombre est premier en utilisant un a choisi au hasard. Dans cet article, nous utiliserons les bibliothèques PHP et GMP pour implémenter les tests de primalité Fermat sur de grands nombres.

Installation et configuration :
Tout d'abord, assurez-vous que les bibliothèques PHP et GMP sont installées sur votre système. Si vous ne les avez pas encore installés, vous pouvez les installer en exécutant la commande suivante dans la ligne de commande :

sudo apt-get install php
sudo apt-get install php-gmp

Ensuite, créez un fichier appelé "fermat_prime.php" et ouvrez-le avec un éditeur de texte.

Implémentez la fonction de test de primalité Fermat :
Ajoutez le code suivant pour implémenter la fonction de test de primalité Fermat :

<?php

function is_prime($n, $k)
{
    if ($n <= 1 || $n == 4) {
        return false;
    }
    if ($n <= 3) {
        return true;
    }
 
    while ($k > 0) {
        // 随机选择一个 [2, $n-2] 之间的整数
        $a = gmp_random_range(2, $n-2);
 
        // 使用 GMP 函数进行幂运算
        $res = gmp_powm($a, $n-1, $n);
 
        // 如果不满足费马小定理,则 n 不是素数
        if (gmp_cmp($res, 1) != 0) {
            return false;
        }
        $k--;
    }
 
    return true;
}

Analysez le code :

  • La fonction is_prime accepte deux paramètres, $n est le nombre à tester, $k est le nombre de tests
  • La fonction vérifie d'abord si $n est compris entre 1 et 4, si c'est le cas, elle renvoie false. En effet, ni 1 ni 4 ne sont des nombres premiers. is_prime接受两个参数,$n是待测试的数,$k是测试的次数
  • 函数首先检查$n是否在1和4之间,如果是,则返回false。这是因为1和4都不是素数。
  • 接下来,函数使用一个while循环来进行$k次的测试。在每次循环中,函数随机选择一个介于2和$n-2之间的正整数,并使用GMP函数gmp_powm进行幂运算。
  • 最后,函数比较计算出来的幂是否等于1,如果不相等,则返回false,说明该数不是素数。
  • 如果在$k次测试中都通过了费马小定理的验证,函数返回true,说明该数可能是一个素数。

测试代码:
在代码文件的末尾添加以下代码来测试is_primeEnsuite, la fonction utilise une boucle while pour effectuer $k tests. Dans chaque boucle, la fonction sélectionne aléatoirement un entier positif compris entre 2 et $n-2 et utilise la fonction GMP gmp_powm pour l'exponentiation.

Enfin, la fonction compare si la puissance calculée est égale à 1. Sinon, elle renvoie faux, indiquant que le nombre n'est pas un nombre premier.

Si la vérification du petit théorème de Fermat est réussie dans les tests $k, la fonction renvoie vrai, indiquant que le nombre peut être un nombre premier.

Testez le code :

Ajoutez le code suivant à la fin du fichier de code pour tester l'effet de la fonction is_prime :

// 测试1: 检测一个较小的素数
$n = gmp_init("17");
$k = 5;
$result = is_prime($n, $k);
echo $result ? "$n is probable prime
" : "$n is not prime
";
 
// 测试2: 检测一个较大的合数
$n = gmp_init("123456789123456789");
$k = 5;
$result = is_prime($n, $k);
echo $result ? "$n is probable prime
" : "$n is not prime
";

Enregistrez et fermez le fichier.

Exécutez le code :

Exécutez la commande suivante dans la ligne de commande pour exécuter le fichier de code :

php fermat_prime.php

Ensuite, vous devriez pouvoir voir les résultats de la sortie du programme dans la ligne de commande :🎜
17 is probable prime
123456789123456789 is not prime
🎜Conclusion :🎜Ceci L'article explique comment utiliser la bibliothèque PHP et GMP pour implémenter les tests de primalité Fermat sur de grands nombres. Avec ce simple test, nous pouvons savoir si un nombre plus grand est premier. En utilisant cette méthode, nous pouvons mieux comprendre le petit théorème de Fermat et être capables d'implémenter des fonctions de test de primalité de base. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn