Рубрики

Анализ различных методов, чтобы найти простое число в Python

Если вы участвуете в соревновательном программировании, вам может быть знаком тот факт, что вопросы, связанные с простыми числами, являются одним из вариантов решения проблем. Здесь мы обсудим, как оптимизировать вашу функцию, которая проверяет простое число в данном наборе диапазонов, а также рассчитаем время для их выполнения.

По определению, простое число — это положительное целое число, которое делится только на себя и 1. Например: 2,3,5,7. Но если число можно разбить на меньшие числа, оно называется составным числом. Например: 4 = 2 * 2, 6 = 2 * 3
И целое число 1 не является ни простым числом, ни составным числом. Проверить, что число простое, легко, но эффективная проверка требует некоторых усилий.

Способ 1
Давайте теперь перейдем к самой первой функции, чтобы проверить, является ли число, скажем, n, простым или нет. В этом методе мы проверим все делители от 2 до n-1. Мы пропустим 1 и n. Если n делится на любой из делителей, функция вернет False, иначе True.
Ниже приведены шаги, используемые в этом методе:

  1. Если целое число меньше 1, возвращается False.
  2. Если данное число делится на любое из чисел от 2 до n, функция вернет False
  3. Остальное вернет True

# Программа Python для поиска простых чисел в диапазоне

import time

def is_prime(n):

    if n <= 1:

        return False

    for i in range(2,n):

        if n % i == 0:

            return False

    return True

  
# Функция драйвера

t0 = time.time()

c = 0 # для подсчета

  

for n in range(1,100000):

    x = is_prime(n)

    c += x

print("Total prime numbers in range :", c)

  

t1 = time.time()

print("Time required :", t1 - t0)

Выход:

Total prime numbers in range: 9592
Time required: 60.702312707901

В приведенном выше коде мы проверяем все числа от 1 до 100000, являются ли эти числа простыми или нет. У этого есть огромное время выполнения, как показано. Это займет около 1 минуты, чтобы бежать. Это простой подход, но он требует много времени для запуска. Таким образом, это не является предпочтительным в конкурентном программировании.

Способ 2
В этом методе мы используем простой прием, уменьшая количество проверяемых делителей. Мы обнаружили, что есть тонкая линия, которая действует как зеркало, что показывает факторизацию под линией и факторизацию над линией в обратном порядке. Линия, которая разделила факторы на две половины, является линией квадратного корня числа. Если число является идеальным квадратом, мы можем сдвинуть линию на 1, и если мы можем получить целочисленное значение линии, которая делится.

36=1*36          
  =2*18
  =3*12
  =4*9
------------
  =6*6
------------
  =9*4
  =12*3
  =18*2
  =36*1

В этой функции мы вычисляем целое число, скажем, max_div, которое является квадратным корнем числа, и получаем его минимальное значение, используя математическую библиотеку Python. В последнем примере мы повторяем от 2 до n-1. Но в этом мы уменьшаем делители наполовину, как показано. Вам нужно импортировать математический модуль, чтобы получить функцию floor и sqrt.
Ниже приведены шаги, используемые в этом методе:

  1. Если целое число меньше 1, возвращается False.
  2. Теперь мы уменьшаем числа, которые необходимо проверить, до квадратного корня из данного числа.
  3. Если данное число делится на любое из чисел от 2 до квадратного корня из числа, функция вернет False
  4. Остальное вернет True

# Программа Python для поиска простых чисел в диапазоне

import math

import time

def is_prime(n):

    if n <= 1:

        return False

  

    max_div = math.floor(math.sqrt(n))

    for i in range(2, 1 + max_div):

        if n % i == 0:

            return False

    return True

  
# Функция драйвера

t0 = time.time()

c = 0 # для подсчета

  

for n in range(1,100000):

    x = is_prime(n)

    c += x

print("Total prime numbers in range :", c)

  

t1 = time.time()

print("Time required :", t1 - t0)

Выход:

Total prime numbers in range: 9592
Time required: 0.4116342067718506

В приведенном выше коде мы проверяем все числа от 1 до 100000, являются ли эти числа простыми или нет. Это занимает сравнительно меньше времени, чем предыдущий метод. Это немного хитрый подход, но он имеет огромное значение во время выполнения кода. Так что это предпочтительнее в конкурентном программировании.

Способ 3
Теперь мы оптимизируем наш код до следующего уровня, который занимает меньше времени, чем предыдущий метод. Вы могли заметить, что в последнем примере мы повторяли каждое четное число до предела, который был пустой тратой. Следует отметить, что все четные числа, кроме двух, не могут быть простыми числами. В этом методе мы выбрасываем все четные числа для оптимизации нашего кода и проверяем только нечетные делители.
Ниже приведены шаги, используемые в этом методе:

  1. Если целое число меньше 1, возвращается False.
  2. Если число равно 2, оно вернет True.
  3. Если число больше 2 и делится на 2, оно возвращает False.
  4. Теперь мы проверили все четные числа. Теперь посмотрите на нечетные числа.
  5. Если данное число делится на любое из чисел от 3 до квадратного корня числа, пропускающего все четные числа, функция вернет False
  6. Остальное вернет True

# Программа Python для поиска простых чисел в диапазоне

import math

import time

def is_prime(n):

    if n <= 1:

        return False

    if n == 2:

        return True

    if n > 2 and n % 2 == 0:

        return False

  

    max_div = math.floor(math.sqrt(n))

    for i in range(3, 1 + max_div, 2):

        if n % i == 0:

            return False

    return True

  
# Функция драйвера

t0 = time.time()

c = 0 # для подсчета

  

for n in range(1,100000):

    x = is_prime(n)

    c += x

print("Total prime numbers in range :", c)

  

t1 = time.time()

print("Time required :", t1 - t0)

Выход:

Total prime numbers in range: 9592
Time required: 0.23305177688598633

В приведенном выше коде мы проверяем все числа от 1 до 100000, являются ли эти числа простыми или нет. Это занимает сравнительно меньше времени, чем все предыдущие методы запуска программы. Это самый эффективный и быстрый способ проверить простое число. Поэтому он наиболее предпочтителен в конкурентном программировании. В следующий раз, пытаясь ответить на любой вопрос в конкурентном программировании, используйте этот метод для достижения наилучших результатов.

Метод сита
Этот метод печатает все простые числа, меньшие или равные данному числу, n. Например, если n равно 10, вывод должен быть «2, 3, 5, 7». Если n равно 20, выходное значение должно быть «2, 3, 5, 7, 11, 13, 17, 19».
Этот метод считается наиболее эффективным методом для генерации всех простых чисел, меньших заданного числа, n. Он считается самым быстрым из всех способов генерирования списка простых чисел. Этот метод не подходит для проверки определенного номера. Этот метод предпочтителен для генерации списка всех простых чисел.

# Программа Python для поиска простых чисел в диапазоне

import time

def SieveOfEratosthenes(n):

       

    # Создайте логический массив "prime [0..n]" и

    # инициализировать все записи, как истина. Ценность

    # в простом [i] будет, наконец, ложным, если я

    # Не простое, иначе правда.

    prime = [True for i in range(n+1)]

      

    p = 2

    while(p * p <= n):

           

        # Если простое число [p] не изменилось, то оно

       # простое число

        if (prime[p] == True):

               

            # Обновить все кратные р

            for i in range(p * 2, n + 1, p):

                prime[i] = False

        p += 1

    c = 0

  

    # Распечатать все простые числа

    for p in range(2, n):

        if prime[p]:

            c += 1

    return c

  
# Функция драйвера

t0 = time.time()

c = SieveOfEratosthenes(100000)

print("Total prime numbers in range:", c)

  

t1 = time.time()

print("Time required:", t1 - t0)

Выход:

Total prime numbers in range: 9592
Time required: 0.0312497615814209

Примечание. Время, необходимое для всех процедур, может варьироваться в зависимости от компилятора, но порядок времени, необходимый для различных методов, останется неизменным.

Ссылка :
Http: // Http: //espressocode.top/sieve-of-eratosthenes/
http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

Эта статья предоставлена Rishabh Bansal . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Анализ различных методов, чтобы найти простое число в Python

0.00 (0%) 0 votes