Assurez-vous de choisir un nombre premier la prochaine fois

Le nombre premier (premier) est aussi appelé nombre premier, c'est-à-dire qu'il n'y a pas d'autre diviseur que 1 et lui-même. L'étude des nombres premiers a toujours été un point chaud en mathématiques, les gens cherchaient la loi des nombres premiers et s'il y avait un plus grand nombre premier. Bien sûr, ce n'est pas seulement un problème purement mathématique, les nombres premiers ont une large gamme d'applications dans le cryptage informatique.
Bien que la définition des nombres premiers soit facile à comprendre et simple, il est difficile de vraiment déterminer un nombre premier, en particulier pour les très grands nombres, ce qui nécessite beaucoup de calcul. Il existe de nombreux algorithmes pour déterminer si un nombre est premier ou non, voici un algorithme de Rabin-Miller.
Le principe de l'algorithme n'est plus introduit (car je ne le comprends pas), il suffit de poster le code directement.

# Primality Testing with the Rabin-Miller Algorithm
# http://inventwithpython.com/hacking (BSD Licensed)
import random
def rabinMiller(num):
    # Returns True if num is a prime number.
    s = num - 1
    t = 0
    while s % 2 == 0:
        # keep halving s while it is even (and use t
        # to count how many times we halve s)
        s = s // 2
        t += 1
    for trials in range(5): # try to falsify num's primality 5 times
        a = random.randrange(2, num - 1)
        v = pow(a, s, num)
        if v != 1: # this test does not apply if v is 1.
            i = 0
            while v != (num - 1):
                if i == t - 1:
                    return False
                else:    
                    i = i + 1
                    v = (v ** 2) % num
    return True

def isPrime(num):
    # Return True if num is a prime number. This function does a quicker
    # prime number check before calling rabinMiller().
    if (num < 2):
        return False # 0, 1, and negative numbers are not prime
        # About 1/3 of the time we can quickly determine if num is not prime
        # by dividing by the first few dozen prime numbers. This is quicker
        # than rabinMiller(), but unlike rabinMiller() is not guaranteed to
        # prove that a number is prime.
    lowPrimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
    if num in lowPrimes:
        return True
        # See if any of the low prime numbers can divide num
    for prime in lowPrimes:
        if (num % prime == 0):
            return False
        # If all else fails, call rabinMiller() to determine if num is a prime.
    return rabinMiller(num)

def generateLargePrime(keysize=1024):
# Return a random prime number of keysize bits in size.
    while True:
        num = random.randrange(2**(keysize-1), 2**(keysize))
        if isPrime(num):
            return num
(代码块可左右滑动)

Si nous voulons déterminer si un nombre est un nombre premier, nous pouvons appeler directement la fonction isPrime ().

isPrime(2)
# True
isPrime(71)
# True
isPrime(99)
# False

Pour un numéro de téléphone portable à 11 chiffres, si votre mantisse est 0, 2, 4, 5, 6, 8, alors vous pouvez abandonner, ce ne peut pas être du tout un nombre premier.
Par exemple, nous voulons trouver le nombre de nombres premiers dans 10000 numéros de téléphone mobile commençant par 1881308 ****:

my_prime = []
for i in range(18813080000,18813089999):
    if isPrime(i):
        my_prime.append(i)

print(my_prime)
# [18813080003,18813080021, 18813080029, 18813080059,
# ....
# 18813089921, 18813089983, 18813089987]

Nous pouvons trouver 403 nombres chanceux qui sont des nombres premiers.
Il est à noter que l'algorithme de Rabin-Miller ne vérifie pas un par un, il y a donc un certain risque à l'utiliser pour déterminer si un nombre est un nombre premier. Si l'algorithme considère un nombre comme un nombre premier, alors le nombre est "très probablement" un nombre premier. Pensez qu'un nombre n'est pas un nombre premier, alors le nombre n'est "absolument" pas un nombre premier. Bien sûr, l'avantage de cet algorithme est la rapidité, presque aucun temps supplémentaire n'est requis.

Donc, la prochaine fois que vous choisirez un numéro de téléphone mobile, assurez-vous de vérifier s'il s'agit d'un nombre premier. Lorsque d'autres disent que mon numéro de téléphone portable est "l'anniversaire de XX" et qu'il y a 4 8, votre numéro de téléphone portable est un nombre premier. Mérite et renommée!
Et l'opérateur ne vous le vendra jamais comme un joli nom à une augmentation de prix!

===== LA FIN ====

Matériel de référence: voir les remarques sur le code

Assurez-vous de choisir un nombre premier la prochaine fois

Je suppose que tu aimes

Origine blog.51cto.com/15069450/2577352
conseillé
Classement