Генератор простых чисел python

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

Существует несколько оптимизаций:

Пример:

  • Обложка базовых футляров
  • Только итерация до квадратного корня n

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

Один из наиболее эффективных алгоритмов, найденных на Python, можно найти в следующем ответе на вопрос (используя сито):

Моя собственная адаптация ситового алгоритма:

На моем оборудовании я могу быстро сгенерировать первые миллионы простых чисел (учитывая, что это написано на Python):

Вот стандартный способ генерации простых чисел, адаптированных из версии С#, по адресу: Самый элегантный способ создания первичного номера

Здесь довольно эффективный генератор простых чисел, который я написал некоторое время назад, который использует Сито Эратосфена:

Статья в Википедии (связанная выше) объясняет, как она работает лучше, чем я мог, поэтому я просто рекомендую вам прочитать это.

У меня есть некоторые оптимизации для первого кода, который можно использовать, когда аргумент отрицательный:

Будучи Python, обычно лучше возвращать генератор, который возвращает бесконечную последовательность простых чисел, а не список.

ActiveState имеет список старших сит Eratosthenes recipes

Вот один из них, обновленный до Python 2.7, с помощью itertools count с аргументом шага, которого не было, когда был написан оригинальный рецепт:

Поскольку он является генератором, он намного эффективнее памяти, чем генерирует весь список. Так как он находит композит, он также эффективен с точки зрения вычислений.

Затем каждый последующий вызов возвращает следующее простое:

Затем вы можете получить список между границами (т.е. X-го числа от первого до простого числа X + Y. ) с помощью islice:

Как вы помните простое число — это такое число которое делится только на себя и на 1.
Никаких супер мега методик тут не будет. Я просто постараюсь на примере объяснить значение команды yield .

С начала напишем функцию, которая будет проверять простое это число или нет:

Думаю тут затруднений быть не должно.. Функция просто проверяет в цикле все числа от 2 до проверяемого и если хотя-бы 1 делится без остатка возвращает лож.
Следующей будет самая "интересная" функция этой статьи:

Эта функция генерирует простые числа. Мы в бесконечном цикле (не бойтесь это не повлияет на ресурсы, на самом деле в бесконечность интерпретатор не залезет) проверяем каждое число от 1 и если оно простое заносим его в результат при помощи yield . Эта команда по сути является чем-то вроде функции добавления значений в результат. Тут это неплохо показано на примере.
Ну и теперь используем єто всё:

Для каждого элемента (который мы назвали n) из числа который генерируется в primes(). И выводим все числа меньшие сотни.

Комментарии

Ваш код выдает не только простые числа, он выводит нечетные числа. Следует подправить первую функцию:
def isprime(n):
. if n == 1:
. return False
. for x in range(2, n):
. if n % x == 0:
. return False
. return True

Если я введу двойку то ответ будет Not prime (хотя это Prime). Почему нельзя прописать что если n == 2 то это Prime?

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

7 ответов

Есть несколько оптимизаций, которые являются общими:

Пример:

  • Покройте базовые случаи
  • Итерация только до квадратного корня из n

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

Один из наиболее эффективных алгоритмов, которые я нашел в Python, найден в следующем вопросе и ответе ( с использованием сита ):

Моя собственная адаптация алгоритма сита:

На моем оборудовании я могу довольно быстро сгенерировать первый миллион простых чисел ( учитывая, что это написано на Python ):

Вот стандартный метод генерации простых чисел, адаптированный из версии на C #: Самый элегантный способ генерации простого числа

Вы начинаете с этого:

вам действительно нужна ветка else? Нет.

Вам нужен счетчик? Нет!

Вам нужно проверить, что я больше, чем sqrt (a)? Нет.

Вы действительно хотите увеличить вручную?

Это базовый рефакторинг, который должен автоматически вытекать из ваших пальцев.

Затем вы тестируете измененный код, видите, что он глючит, и исправляете его:

И, наконец, вы избавляетесь от флага isPrime:

теперь вы сделали!

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

Статья в Википедии (ссылка выше) объясняет, как это работает лучше, чем я, поэтому я просто рекомендую вам прочитать это.

У меня есть некоторые оптимизации для первого кода, которые можно использовать, когда аргумент отрицательный:

Будучи Python, обычно лучше возвращать генератор, который будет возвращать бесконечную последовательность простых чисел, а не список.

ActiveState имеет список старых рецептов сита Эратосфена

Вот один из них, обновленный до Python 2.7 с использованием счетчика itertools с аргументом шага, которого не было на момент написания оригинального рецепта:

Так как это генератор, он намного эффективнее по памяти, чем генерация всего списка. Так как он находит составной, он также эффективен в вычислительном отношении.

Затем каждый последующий вызов возвращает следующее простое число:

Затем вы можете получить список между границами (т. Е. Простое число X от первого до простого числа X + Y . ), используя islice:


[an error occurred while processing the directive]
Карта сайта