Возрастающие простые числа
Возрастающие простые числа (ascending primes)
В этом примере мы реализуем алгоритм, который находит все простые числа, составленные из возрастающих цифр от 1 до 9.
Введение
Алгоритм поиска возсрастающих простых чисел предназначен для поиска всех простых чисел, которые можно составить, используя цифры от 1 до 9 в возрастающем порядке. Это означает, что каждая следующая цифра в числе не меньше предыдущей. Данный алгоритм используется для демонстрации работы с комбинаторикой и простыми числами в языке программирования Julia. Он находит применение в математических и олимпиадных задачах, где требуется найти определенные подмножества чисел.
# Установка необходимых пакетов
import Pkg; Pkg.add(["Combinatorics", "Primes", "BenchmarkTools"])
# Подключение необходимых библиотек
using Combinatorics # Для работы с комбинаторными функциями (например, powerset)
using Primes # Для проверки, является ли число простым
using BenchmarkTools # Для оценки времени выполнения
Основная часть
Функция ascendingprimes()
Эта функция генерирует все возможные непустые подмножества цифр от 1 до 9, преобразует их в числа и оставляет только простые числа. Рассмотрим работу по шагам.
# Определение функции ascendingprimes
function ascendingprimes()
# Генерация всех возможных подмножеств множества [1, 2, 3, 4, 5, 6, 7, 8, 9]
# powerset создает все возможные комбинации элементов множества, включая пустое множество
# Мы фильтруем подмножества, оставляя только непустые (!isempty(x))
# Затем для каждого подмножества:
# - reverse(x) разворачивает подмножество (например, [1,2,3] -> [3,2,1])
# - evalpoly(10, reverse(x)) вычисляет значение многочлена с основанием 10
# Это преобразует список цифр в число (например, [1,2,3] -> 321)
# - filter(isprime, ...) оставляет только простые числа
return filter(isprime, [evalpoly(10, reverse(x)) for x in powerset([1, 2, 3, 4, 5, 6, 7, 8, 9]) if !isempty(x)])
end
Вывод результатов
Следующий код выводит найденные простые числа в форматированном виде, разбивая их по 10 чисел в строке.
# Вывод всех простых чисел в форматированном виде
# foreach применяет функцию к каждому элементу перечисления
# enumerate добавляет индексы к элементам списка
# rpad(p[2], 10) добавляет пробелы справа, чтобы число занимало 10 символов
# p[1] % 10 == 0 ? "\n" : "" - если индекс делится на 10, добавляется перевод строки
foreach(p -> print(rpad(p[2], 10), p[1] % 10 == 0 ? "\n" : ""), enumerate(ascendingprimes()))
Измерение времени выполнения
Последняя строка измеряет время выполнения функции ascendingprimes() с помощью макроса @btime.
# Измерение времени выполнения функции ascendingprimes()
@btime ascendingprimes()
Заключение
В этом примере мы рассмотрели реализацию алгоритма поиска возрастающих простых чисел на языке Julia. Мы использовали пакет Combinatorics для генерации всех возможных подмножеств цифр от 1 до 9, а также пакет Primes для проверки простоты чисел. Нам удалось создать функцию, которая находит все простые числа, составленные из возрастающих цифр, и вывести их в удобочитаемом формате. Этот пример демонстрирует мощь языка Julia в области математических вычислений, комбинаторики и работы с простыми числами, что может быть полезно при решении различных математических задач и алгоритмических олимпиад.
Пример разработан с использованием материалов Rosetta Code