Улучшите код, чтобы найти простые числа - PullRequest
0 голосов
/ 08 июня 2018

Я написал этот код Python около 3 дней назад, и я застрял здесь, я думаю, что это может быть лучше, но я не знаю, как его улучшить.Ребята, не могли бы вы мне помочь?

# Function
def is_prime(n):
    if n == 2 or n == 3:
        return True

    for d in range(3, int(n**0.5), 2):
        if n % d == 0:
            return False

    return True

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Попробуйте приведенный ниже код, скорость которого равна скорости решения Оливье Мелансона:

from math import sqrt; from itertools import count, islice

def is_prime(n):
    return n > 1 and all(n%i for i in islice(count(2), int(sqrt(n)-1)))

print(is_prime(5))

Вывод:

True
0 голосов
/ 08 июня 2018

Хороший детерминистический способ найти относительно небольшие простые числа - это использовать сито .

Математический принцип, лежащий в основе этого метода, заключается в следующем: проверить,число простое, достаточно проверить, что оно не делится на другие простые числа.

import math

def is_prime(n):
    # Prepare our Sieve, for readability we make index match the number by adding 0 and 1
    primes = [False] * 2 + [True] * (n - 1)

    # Remove non-primes
    for x in range(2, int(math.sqrt(n) + 1)):
        if primes[x]:
            primes[2*x::x] = [False] * (n // x - 1)

    return primes[n]

    # Or use the following to return all primes:
    # return {x for x, is_prime in enumerate(primes) if is_prime}

print(is_prime(13)) # True

Для возможности повторного использования вы можете адаптировать приведенный выше код для возврата set всех простых чисел до n.

...