Арифметическая последовательность простых чисел сумасшедшего библиотекаря

18

Что ж, библиотекарь поймал вас на том, что вы обманули свою работу с помощью алгоритма сортировки , так что теперь вы наказаны. Вам было приказано создать некоторый код, чтобы библиотекарь мог поразить объект своей безответной привязанности, учителя математики. Так вот что означает «Другие обязанности как назначено» ...

Все знакомы с последовательностью натуральных чисел в базе 10, называемой N :

0, 1, 2, 3, 4, 5, 6, ...

Исходя из этого, мы можем сгенерировать последовательность простых чисел, назовем ее P , так что каждый элемент в P имеет ровно два делителя в N , а именно 1и себя. Эта последовательность:

2, 3, 5, 7, 11, 13, ...

ОК, пока что довольно.

Библиотекарь подумал об изящной функции F (x, y), которая берет число xиз N с условием 0 <= x <= 9и число yиз N и вставляет xв yдесятичное расширение в каждой позиции (то есть добавляет, вставляет или добавляет xв y), затем возвращает отсортированный набор новых номеров.
Например, F (6, 127) приведет к

1267, 1276, 1627, 6127

Это все еще скучно, хотя. Библиарий хочет оживить немного дополнительной помощью вместо указания новой функции z -> {p : p in P and F(z,p) subset of P}, сортируются по возрастанию.
Например, z (7) будет

3, 19, 97, 433, 487, 541, ...

потому что 37и 73оба простые, 719 179и 197все простые и т. д.

Обратите внимание, что z (2) пусто, потому что никакое простое число, к которому 2добавлен символ, никогда не будет простым. Аналогично для {0,4,5,6,8}.

Ваша задача - написать код, который будет генерировать и выводить первые 100 чисел в последовательности z (x) для заданного x .

вход

Единственное целое число х такое, что 0 <= x <= 9. Ввод может быть через аргумент функции, STDIN или эквивалентный.

Выход

Последовательность первых 100 чисел, разделенных по вашему выбору STDOUT или эквивалентной, так что последовательность удовлетворяет z (x), как описано выше. Если z (x) пусто, как в случае {0,2,4,5,6,8}, Empty Setвместо этого должны быть выведены слова.

ограничения

  • Это код-гольф, так как вам нужно будет записать это в учетную карточку, чтобы библиотекарь мог показать учителю математики, и ваша рука легко болит.
  • Стандартные ограничения лазейки применяются. Библиотекарь не терпит мошенников.

Эталонные последовательности

x = 1: A069246
x = 3: A215419
x = 7: A215420
x = 9: A215421

Связанный: Найти наибольшее хрупкое простое число / Найти наименьшее простое число из подстроки / Найти наибольшее простое число, которое все еще является простым после удаления цифры

AdmBorkBork
источник

Ответы:

5

Pyth, 49 байтов

Как и в Python3 и других ответах Pyth, время выполнения для поиска 100 чисел является запретительным. (тестовый набор дает 10)

?}z"1379".f&!tPZ!|FmtPvjzc`Z]dhl`Z*TT3"Empty Set"

Попробуйте онлайн

Брайан Так
источник
1
Трейлинг "не нужен, но очень хорошая работа.
FryAmTheEggman
Спасибо за напоминание. Поскольку EOL больше не завершает строку, я избегаю неопределенных строк, но, конечно, EOF все еще работает
Brian Tuck
4

Python 3, 188 байт

x=input()
k=1
i=100
if x in"024568":i=print("Empty Set")
while i:k+=1;s=str(k);i-=all(sum(p%d<1for d in range(2,p))<4for p in[k*int(s[:j]+x+s[j:])for j in range(len(s)+1)])and not print(k)

Плохо играл в гольф, но здесь кое-что пока. Вместо того, чтобы проверять p in P and F(z,p) subset of P, мы проверяем, что p*fдля каждого полуприцепа f in F(z,p). Объедините это с пробным делением для проверки простоты, и вы получите O(scary)алгоритм.

Sp3000
источник
+1 заO(scary)
AdmBorkBork
1
Хороший трюк в настройке я на None.
lirtosiast
3

Perl, 124 байта

$p=prime_iterator;y/1379//or$i=+~print'Empty Set'}while($i<100){$_=&$p;is_prime"$`@F$'"or redo while//g;$i++

Требуется следующий параметр командной строки:, -palMntheory=:allсчитается как 16. Ввод взят из стандартного ввода.

Использование @DanaJ «ы Math::Prime::Utilмодуль для Perl (загружается с прагмой ntheory). Получите это с:

cpan install Math::Prime::Util
cpan install Math::Prime::Util::GMP

is_primeявляется детерминированным для всех значений менее 2 64 , что достаточно для наших целей.


Образец использования

$ echo 2|perl -palMntheory=:all oscary.pl
Empty Set

$ echo 7|perl -palMntheory=:all oscary.pl
3
19
97
433
487
541
691
757
853
1471
.
.
.
718705783
720574573
737773357
745157779
747215167
767717017
768743377
770294977
771778477
774577777

Ожидаемое время выполнения

x = 1 : 1 м 09,2 с
x = 3 : 0 м 04,2 с
x = 7 : 2 м 52,5 с
x = 9 : 0 м 11,5 с

Примо
источник
1

Пиф, 58

L}bPb|*"Empty Set"}Qj204568T.f&yZ.Amyi++<JjZTdQ>JdThl`Z100

Этот набор тестов вычисляет только первые 10 чисел, потому что для генерации остальных требуется слишком много времени. Грубая сила и первичность и вставка цифр. Демонстрирует такую ​​плохую производительность, что я не смог запустить его до 100, поэтому, пожалуйста, сообщите мне, если есть проблемы.

FryAmTheEggman
источник