Постулат Бертрана утверждает, что для каждого целого числа n ≥ 1 существует хотя бы одно простое число p такое, что n <p ≤ 2n . Чтобы проверить эту теорему для n <4000, нам не нужно проверять 4000 случаев: трюк Ландау говорит, что достаточно проверить, что
2, 3, 5, 7, 13, 23, 43, 83, 163, 317, 631, 1259, 2503, 5003
все простые. Поскольку каждое из этих чисел менее чем в два раза превосходит своего предшественника, каждый интервал {y: n <y ≤ 2n} содержит хотя бы одно из этих простых чисел.
Эта последовательность чисел - простые числа Бертрана (OEIS A006992), и они определены следующим образом:
a(1) = 2
a(n) = largest prime below 2a(n-1)
Вызов
Реализуйте эту последовательность. Вы можете написать
- функция или программа, для которых задано некоторое n, возвращает a (n) (0 или 1 проиндексировано),
- функция или программа, для которых задано некоторое n, возвращает первые n (или n-1 или n + 1 ) записей этой последовательности,
- бесконечный список или поток или генератор или аналогичный эквивалент в вашем языке.
Fx.ØØ
так близко ... Работает на все, что вышеn > 2
.$F·ÅPθ
для того же количества байтов.Haskell , 50 байтов
Попробуйте онлайн!
Выводит бесконечный список.
Haskell , 40 байт?
Попробуйте онлайн!
Это работает, если простые числа Бертрана не содержат псевдослучайных чисел Ферма для 2 .
источник
Желе , 6 байт
Попробуйте онлайн!
0 индексированные.
объяснение
источник
MATL , 9 байт
Входы n , выходы a ( n ), 1-индексированные.
Попробуйте онлайн!
объяснение
источник
Stax , 10 байт
Выполнить тестовые случаи
Эта проблема выявила ошибку в реализации stax
:p
, которая представляет собой инструкцию, которая получает наибольшее простое число меньше, чем ее ввод. Если бы это работало правильно, было бы56-байтовое решение.Но, увы, этого нет и нет.Как создатель языка, я исправлю это, но после того, как проблема была опубликована, кажется, что исправить и использовать ее довольно дешево.В любом случае, вот соответствующее представление программы в формате ascii выше.
Это относительно простая реализация постановки задачи. Единственное, что может быть интересным, это использование
gs
формы генератора. Генераторы - это семейство конструкций, которые объединяют начальное условие, преобразование и фильтр для получения одного или нескольких удовлетворяющих значений. В этом случае он используется вместо сломанной:p
инструкции.Изменить: вот 6-байтовое решение, но оно требует исправления ошибки, которое было применено только после публикации этого запроса.
источник
Python 2 , 63 байта
Попробуйте онлайн!
Отпечатки навсегда.
Использует простой генератор теоремы Вильсона, хотя генерация простых чисел вперед неуклюжа для этой задачи. Отслеживает текущее наибольшее простое число
r
и границу удвоенияm
.Два байта сохраняются, выполняя,
P*=k
а неP*=k*k
как обычно, поскольку единственный эффект состоит в том, чтобы утверждать, что 4 является простым, и последовательность удвоения пропускает его.источник
CJam (15 байт)
Демо онлайн . Обратите внимание, что это 0-индексированный.
Более эффективный подход - поиск в обратном направлении, но для этого требуется еще один символ, поскольку он не может использовать неявный
,
(диапазон):источник
Japt ,
16141312 байтДва решения по цене одного, оба с 1 индексированием.
N-й срок
Наконец, задача, которую я могу написать рабочее решение для использования
F.g()
.Попытайся
Первые N Условия
Попытайся
источник
Par / GP , 34 байта
Попробуйте онлайн!
источник
Python 2 , 64 байта
Попробуйте онлайн! Печатает последовательность бесконечно
источник
Haskell , 58 байт
Попробуйте онлайн!
источник
Python 2 , 68 байт
Печатает последовательность бесконечно (вам нужно нажать «Выполнить» во второй раз, чтобы остановить выполнение).
Попробуйте онлайн!
Python 3 , 90 байт
Возвращает n- й член.
Попробуйте онлайн!
источник
C (gcc) ,
9787868079 байтP
в основной цикл.printf
вызов.i
-ой записи последовательности (с 0 индексами) вместо вывода бесконечного потока.Попробуйте онлайн!
источник
Атташе , 38 байт
Попробуйте онлайн!
0 на основе; возвращает
n
пятое число Бертрана.В настоящее время нет встроенной функции для поиска предыдущих / следующих простых чисел, поэтому я использую
Series
встроенную функцию для вычисления всех простых чисел до2*$[_-1]
. Это последнее выражение использует неявную рекурсию (привязанную к$
), чтобы легко определить рекуррентное отношение. Условие if используется для определения базового условия.источник
Perl 6 , 35 байт
Попробуйте онлайн!
Это выражение представляет собой бесконечный список простых чисел Бертрана.
источник
Сетчатка , 39 байт
Попробуйте онлайн! Объяснение:
Начните с 1.
Повторите цикл, используя вход в качестве счетчика цикла.
Удвойте значение.
Найти самое высокое простое число меньше значения.
Распечатай.
источник
Ruby , 51 + 7 (-rprime) = 58 байт
Попробуйте онлайн!
Ламба, принимающая
n
и возвращающаяnth
простое число Бертрана, 0-индексированная. Здесь не так много, но позвольте мне все же разжать этоРубин , 48 + 7 = 55 байт
Попробуйте онлайн!
Для развлечения вот решение с бесконечным циклом. Он печатает, как он идет, и требует прерывания. В зависимости от того, когда именно вы прерываете, вы можете видеть или не видеть результат. Ungolfed:
источник
APL (Dyalog Extended) , 12 байт
Принимает ввод от пользователя как N, возвращает N-й элемент последовательности (0-индексированный).
Попробуйте онлайн!
Объяснение:
источник
р , 87 байт
Данные
n
выводыa(n)
Попробуйте онлайн!
Я все еще работаю над "Учитывая n выходных данных (1), a (2) ... a (n)". Я думал, что смогу немного изменить этот код, но он кажется более сложным.
источник