Algorithmes de test de primalité
Présentation des tests de primalité
Le test de primalité consiste à déterminer si un nombre donné est premier. Plusieurs algorithmes existent, chacun avec des niveaux d'efficacité et de complexité différents.
Algorithmes de test de primalité courants
Algorithme |
Complexité temporelle |
Précision |
Complexité |
Division par tâtonnement |
O(√n) |
100 % |
Faible |
Test de primalité de Fermat |
O(k log n) |
Probabiliste |
Moyenne |
Test de Miller-Rabin |
O(k log³n) |
Probabiliste |
Haute |
Méthode de division par tâtonnement
def trial_division(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
Test de primalité de Fermat
import random
def fermat_test(n, k=5):
if n <= 1 or n == 4:
return False
if n <= 3:
return True
for _ in range(k):
a = random.randint(2, n - 2)
if pow(a, n - 1, n)!= 1:
return False
return True
Test de primalité de Miller-Rabin
def miller_rabin(n, k=5):
if n <= 1 or n == 4:
return False
if n <= 3:
return True
def check(a, d, n, s):
x = pow(a, d, n)
if x == 1 or x == n - 1:
return True
for _ in range(s - 1):
x = pow(x, 2, n)
if x == n - 1:
return True
return False
s = 0
d = n - 1
while d % 2 == 0:
d //= 2
s += 1
for _ in range(k):
a = random.randint(2, n - 2)
if not check(a, d, n, s):
return False
return True
Diagramme en flux de comparaison d'algorithmes
graph TD
A[Commencer le test de primalité] --> B{Choisir un algorithme}
B --> |Cas simples| C[Division par tâtonnement]
B --> |Probabiliste| D[Test de Fermat]
B --> |Avancé| E[Test de Miller-Rabin]
C --> F{Est premier?}
D --> G{Probabilité de primalité}
E --> H{Haute précision}
Considérations pratiques
Chez LabEx, nous recommandons de choisir l'algorithme approprié en fonction de :
- La taille du nombre
- La précision requise
- Les ressources de calcul
- Le cas d'utilisation spécifique