Exemple d'utilisation de Python pour détecter les nombres premiers

伊谢尔伦
Libérer: 2017-05-31 14:41:29
original
1569 Les gens l'ont consulté

Cet article présente principalement la méthode de détection des nombres premiers Python. Il analyse les compétences associées à la détection des nombres premiers Python avec des exemples. Les détails sont les suivants :

Détection du facteur :

Facteur de détection, complexité temporelle O(n^(1/2))

def is_prime(n):
  if n < 2:
    return False
  for i in xrange(2, int(n**0.5+1)):
    if n%i == 0:
      return False
  return True
Copier après la connexion

Petit théorème de Fermat :

Si n est un nombre premier et a est un entier positif inférieur à n, alors la nième puissance de a est congrue à un modulo n

Méthode de mise en œuvre :

Choisissez une base (par exemple 2), pour un grand entier p, si 2^(p-1) et 1 ne sont pas congrus modulo p, alors p ne doit pas être un nombre premier sinon, p est susceptible d'être un ; le nombre premier

2**(n-1 )%n n'est pas un nombre facile à calculer

Règles de fonctionnement modulo :

(a^b) % p = ((a % p)^b) % p
(a * b) % p = (a % p * b % p) % p
Copier après la connexion
Calculer X^N(% P)

Peut

si N est un nombre pair, alors X^N = (X*X)^[N/2]
Si N est un nombre impair, alors X^N = X* ; X^(N-1) = X * (X*X)^[ N/2];

def xn_mod_p(x, n, p):
  if n == 0:
    return 1
  res = xn_mod_p((x*x)%p, n>>1, p)
  if n&1 != 0:
    res = (res*x)%p
  return res
Copier après la connexion
Il peut également être résumé comme l'algorithme suivant Les deux fonctions sont les mêmes

def xn_mod_p2(x, n, p):
  res = 1
  n_bin = bin(n)[2:]
  for i in range(0, len(n_bin)):
    res = res**2 % p
    if n_bin[i] == &#39;1&#39;:
      res = res * x % p
  return res
Copier après la connexion
Grâce au traitement rapide de l'opération d'exponentiation modulaire, la détection de Fermat peut être réalisée

Le test de Fermat est précis lorsqu'il donne une conclusion négative, mais la conclusion positive peut être fausse. grands entiers, et le taux de faux positifs diminue à mesure que l'entier augmente

def fermat_test_prime(n):
  if n == 1:
    return False
  if n == 2:
    return True
  res = xn_mod_p(2, n-1, n)
  return res == 1
Copier après la connexion

Test de MILLER-RABIN

Le test de Miller-Rabin est actuellement largement utilisé

Théorème de détection quadratique : si p est un nombre premier et 0 Petit théorème de Fermat : a^(p-1) ≡ 1(mod p)

C'est la méthode du test de primalité de Miller-Rabin. Extrayez continuellement le facteur 2 dans l'index n-1 et exprimez n-1 sous la forme d*2^r (où d est un nombre impair). Ensuite, ce que nous devons calculer devient le reste de a divisé par n à la puissance d*2^r. Par conséquent, a^(d * 2^(r-1)) est soit égal à 1, soit égal à n-1. Si a^(d * 2^(r-1)) est égal à 1, le théorème continue de s'appliquer à a^(d * 2^(r-2)), et la racine carrée se poursuit ainsi jusqu'à ce que a ^ est satisfait pour un certain i (d * 2^i) mod n = n-1 ou le 2 du dernier exposant est utilisé pour obtenir un ^d mod n=1 ou n-1. De cette façon, le petit théorème de Fermat est renforcé sous la forme suivante :

Extraire le facteur 2 autant que possible, et exprimer n-1 sous la forme d*2^r Si n est un nombre premier, alors ou a. ^d mod n=1, Ou il existe un certain i tel que a^(d*2^i) mod n=n-1 (0<=i

Théorème : Si n est un nombre premier et a est un entier positif inférieur à n, alors le test de Miller basé sur a pour n sera vrai.

Le test de Miller est effectué k fois, la probabilité d'erreur du traitement des nombres composés comme des nombres premiers ne dépassera pas 4^(-k)

au plus.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!