Алгоритм нахождения простых чисел
Дело было давно, в университете, когда мы начали изучать язык программирования Pascal и домашним заданием стало создание алгоритма нахождения простых чисел.
Алгоритм был придуман и тутже реализован на изучаемом языке. Программа запрашивала у пользователя число N и искала все простые числа до N включительно. После первого успешного теста сразу же возникло непреодолимое желание ввести N = «много». Программа работала, но не так быстро как хотелось бы. Естественно, дело было в многочисленных проверках (порядка N*N/2), поэтому пришлось избавиться от лишних. В итоге получилось 5 похожих алгоритмов каждый из которых работал быстре предыдущего. Недавно захотелось их вспомнить и реализовать, но на этот раз на Python.
Итак, поехали. Первый алгоритм, ударивший в студенческую голову, продемонстрирован в Листинге 1.
# Листинг 1 # вводим N n = input(«n python»># Листинг 2 n = input(«n python»># Листинг 3 n = input(«n python»># Листинг 4 from math import sqrt n = input(«n python»># Листинг 5 from math import sqrt n = input(«n python»># Листинг 6 from math import sqrt n = input(«n python»># Листинг 7 n = input(«n python»># Листинг 8 n = input(«n v-portal» style=»display:none;»>
Самый быстрый метод Python для вычисления всех простых чисел Автор записи
Вычисление простых чисел из данной серии чисел не может быть большим вопросом. Тем не менее, вычисляющие простые простые простые простые способы сохранения временной сложности и другие факторы, могут быть сложным вопросом. В конце концов, одним из основных критериев эффективного кода является его эффективность. Поэтому в этой статье мы будем сравнивать и контрастировать сложности различных кодов, чтобы вычислить все простые простынения, меньше, чем N , где n обозначает произвольное количество значений в данной серии, как введено пользователем.
Пример: Ниже приведен простой пример того, что нужно следовать следующему в этой статье:
❖ Отказ от ответственности: Методы, используемые в следующем скрипте, чисто основаны на наименьшее время, предпринятые для вычисления простых чисел
Без дальнейшей задержки давайте погрузимся в сравнения и визуализируйте вывод.
Сравнение кода
Вместо того, чтобы сравнить коды один за другим, который сделает статью более длинным излишне, вот список всех вероятных методов для вычисления простых чисел в данном диапазоне с наименьшим возможным времени для вычислений.
Из приведенного выше анализа понятно, что Метод 3 берет минимально Время для вычисления проставок Метод 5 берет максимум Время сделать это. Для сравнения и сравнения различных методов и время, предпринимаемое каждому методу, мы рассчитали время для вычисления всех простых чисел в пределах диапазона от 1 до 10 7 а затем вывел наш вывод. Следовательно,
Наш победитель: Метод 3
❖ Отказ от ответственности : Значения прошедшего времени, предпринятые каждым методом, рассчитанным по время Модуль может варьироваться в зависимости от использования в использовании системы/оборудования и версию Python, которую вы используете.
Если вы все еще используете Python 2.x, вы можете предпринять следующие методы, приведенные ниже:
Графическое сравнение
Учитывая, что вышеуказанный фрагмент написан в файле с именем Plot.py , вот графический анализ времен, предпринятых каждым методом для вычисления всех простых чисел меньше, чем Н. Код, приведенный ниже, используется для участия Бар-граф Для сравнения различных методов, используемых для вычисления простых чисел
Сюжет/график Выход:
❖ Приведенные ниже еще одно графическое сравнение с помощью пунктирного Линейный граф что сравнивает время, предпринятое каждому методу:
Код для генерации вышеуказанного графа приведен ниже (код, содержащий основные методы, упомянуто выше. Мы считаем его присутствующим в файле plot.py, а затем мы импортируем его в наш основной файл классов, чтобы построить график.)
Заключение
В этой статье мы сравнили несколько методов и нашли лучший метод с точки зрения наименьшего времени, чтобы вычислить все простыни
Я надеюсь, что вам понравилось статью, пожалуйста, подпишитесь и оставайтесь настроенными для более интересных статей и подобных услуг.
Я профессиональный Python Blogger и Content Creator. Я опубликовал многочисленные статьи и создал курсы в течение определенного периода времени. В настоящее время я работаю полный рабочий день, и у меня есть опыт в областях, таких как Python, AWS, DevOps и Networking.
Вывести ряд простых чисел в python
Я пытаюсь изучить программирование на Python, и я довольно новичок в этом.
У меня были проблемы с печатью серии простых чисел от одного до ста. Я не могу понять, что не так с моим кодом.
Вот что я написал; он печатает все нечетные числа вместо простых чисел:
29 ответов
Вам нужно проверить все числа от 2 до n-1 (на самом деле до sqrt (n), но хорошо, пусть это будет n). Если n делится на любое из чисел, оно не является простым. Если число простое, выведите его.
Вы можете написать то же самое намного короче и более питонично:
Как я уже сказал, было бы лучше проверять делители не от 2 до n-1, а от 2 до sqrt (n):
Для небольших чисел, таких как 101, это не имеет значения, но для 10 ** 8 разница будет очень большой.
Вы можете немного улучшить его, увеличив диапазон, который вы проверяете, на 2 и, таким образом, проверяя только нечетные числа. Вот так:
Так как в первом цикле выбраны нечетные числа, во втором цикле нет необходимости проверять четные числа, поэтому значение «i» можно начинать с 3 и пропускать до 2.
Используя функцию фильтра.
Сначала мы находим фактор этого числа
Скрипт для проверки премьер или нет
Скрипт для печати всех простых чисел до n
Игорь Чубин ответ можно улучшить. При проверке, является ли X простым, алгоритму не нужно проверять каждое число до квадратного корня из X, ему нужно проверять только простые числа до sqrt (X). Таким образом, он может быть более эффективным, если будет ссылаться на список простых чисел при его создании. Функция ниже выводит список всех простых чисел под b, который удобен в виде списка по нескольким причинам (например, когда вы хотите узнать количество простых чисел 0
break завершает цикл, в котором он находится в данный момент. Итак, вы всегда проверяете, делится ли он на 2, давая вам все нечетные числа.
Тем не менее, есть гораздо лучшие способы найти простые числа в Python, чем этот.
Здесь другой подход, который меняет пространство для более быстрого поиска времени. Это может быть быстрее всего.
Простые числа до 1000000
78498
реальный 0m6.600s
пользователь 0m6.532s
sys 0m0.036s
Лучшим способом решения вышеуказанной проблемы было бы использование алгоритма «Теста примитивности Миллера Рабина». Он использует вероятностный подход, чтобы определить, является ли число простым или нет. И это, безусловно, самый эффективный алгоритм, с которым мне доводилось сталкиваться.
Реализация того же Python продемонстрирована ниже:
Я сторонник того, чтобы не принимать лучшее решение и не проверять его. Ниже приведены некоторые модификации, которые я сделал для создания простых классов примеров как @ igor-chubin, так и @ user448810. Прежде всего позвольте мне сказать, что это отличная информация, спасибо, ребята. Но я должен признать @ user448810 за его умное решение, которое оказывается самым быстрым на сегодняшний день (из тех, что я тестировал). Слава вам, сэр! Во всех примерах я использую значения 1 миллион (1,000,000) как n.
Пожалуйста, не стесняйтесь попробовать код.
Метод 1 , описанный Игорем Чубиным:
Тест : более 272 секунд
Метод 2 , описанный Игорем Чубиным:
Тест : 73,3420000076 секунд
Метод 3 , описанный Игорем Чубиным:
Тест: 11,3580000401 секунд
Метод 4 , описанный Игорем Чубиным:
Тест: 8,7009999752 секунды
Метод 5 , как описано в user448810 (который я считаю довольно умным):
Тест : 1.12000012398 секунд
Примечания . Перечисленное выше решение 5 (предложенное пользователем 448810) оказалось самым быстрым и честно тихим, креативным и умным. Я люблю это. Спасибо ребята!!
РЕДАКТИРОВАТЬ: Да, и, кстати, я не чувствовал необходимости импортировать математическую библиотеку для квадратного корня из значения, поскольку эквивалент равен просто (n **. 5). В противном случае я не слишком много редактировал, а затем заставлял значения сохраняться в массиве и возвращать его в класс. Кроме того, вероятно, было бы немного более эффективно сохранять результаты в файле, чем в подробном формате, и можно было бы сэкономить много памяти, если бы они были по одному, но это стоило бы немного больше времени из-за записи на диск. Я думаю, что всегда есть возможности для улучшения. Надеюсь, код имеет смысл, ребята.
Функциональный модуль программы Python, который возвращает 1-е N простых чисел:
Мой способ перечисления простых чисел для номера записи без особых хлопот заключается в использовании свойства, позволяющего получить любое число, не являющееся простым числом, с суммированием простых чисел.
Следовательно, если вы делите входной номер со всеми простыми числами под ним, и он не делится поровну ни на одно из них, вы знаете, что у вас есть простое число.
Конечно, есть еще более быстрые способы получения простых чисел, но этот уже работает довольно хорошо, особенно потому, что вы не делите номер записи на какое-либо число, а просто только простые числа вплоть до этого числа.
С помощью этого кода мне удалось на моем компьютере перечислить все простые числа до 100 000 менее чем за 4 секунды.
Вы заканчиваете цикл слишком рано. После того, как вы проверили все возможности в теле цикла for и не нарушали его, число становится простым. Поскольку один не прост, вы должны начать с 2:
В более быстром решении вы пытаетесь разделить только на простые числа, которые меньше или равны корню числа, которое вы тестируете. Это может быть достигнуто путем запоминания всех простых чисел, которые вы уже нашли. Кроме того, вам нужно только проверить нечетные числа (кроме 2). Вы можете поместить полученный алгоритм в генератор, чтобы использовать его для хранения простых чисел в контейнере или просто распечатать их:
Как вы можете видеть, нет необходимости вычислять квадратный корень, быстрее сохранить квадрат для каждого простого числа и сравнить каждый делитель с этим числом.
Более простым и эффективным способом решения этой проблемы является сохранение всех найденных ранее простых чисел и проверка, кратно ли следующее число любому из меньших простых чисел.
Обратите внимание, что any — функция короткого замыкания, другими словами, она разорвет цикл, как только будет найдено истинное значение.
Вот упрощенный ответ с использованием лямбда-функции.
Мы можем составить список простых чисел, используя библиотеку sympy
Я был вдохновлен Игорем и сделал блок кода, который создает список:
В дополнение к принятому ответу можно добиться дальнейшей оптимизации, используя список для хранения простых чисел и распечатывая их после генерации.
Вместо пробного деления лучший подход, изобретенный греческим математиком Эратосфеном более двух тысяч лет назад, состоит в просеивании путем многократного изгнания множества простых чисел.
Начните с составления списка всех чисел от 2 до максимально желаемого простого числа n. Затем несколько раз возьмите наименьшее непересекающееся число и вычеркните все его кратные числа; числа, которые остаются непересекающимися, являются простыми.
Например, рассмотрим числа меньше 30. Первоначально 2 идентифицируется как простое число, затем 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 и 30 вычеркнуты. Следующие 3 идентифицируются как простые, затем вычеркиваются 6, 9, 12, 15, 18, 21, 24, 27 и 30. Следующее простое число 5, поэтому 10, 15, 20, 25 и 30 вычеркнуты. И так далее. Числа, которые остаются простыми: 2, 3, 5, 7, 11, 13, 17, 19, 23 и 29.
Оптимизированная версия сита обрабатывает 2 отдельно и просеивает только нечетные числа. Кроме того, поскольку все композиты, меньшие квадрата текущего простого числа, пересекаются меньшими простыми числами, внутренний цикл может начинаться с p ^ 2 вместо p, а внешний цикл может останавливаться у квадратного корня из n. Я оставлю оптимизированную версию для работы с вами.
Вот самая простая логика для начинающих, чтобы получить простые числа:
Это пример программы, которую я написал, чтобы проверить, является ли число простым или нет.