Иногда при написании программы вам нужно по какой-либо причине использовать простое число (например, криптографию). Я предполагаю, что иногда вам также нужно использовать составное число. Иногда, по крайней мере, здесь, на PPCG, ваша программа должна иметь дело с произвольными изменениями. И в обстоятельствах, которые удобно создать интересный вопрос PPCG, возможно, даже цифры, которые вы используете, должны быть устойчивы к коррупции ...
Определения
Составное число является целым числом ≥ 4 , что не является простым, то есть это произведение двух меньших чисел больше 1. А bitflip резистентных составное число определяется следующим образом : это составное натуральное число , для которого, если вы пишете в двоичном коде в минимально возможном количестве битов вы можете изменить любой один или два бита из числа, и число все еще является составным.
пример
Например, рассмотрим число 84. В двоичном виде это 1010100
. Вот все числа, которые отличаются не более чем на 2 бита от этого:
0000100 4 2 × 2 0010000 16 4 × 4 0010100 20 4 × 5 0010101 21 3 × 7 0010110 22 2 × 11 0011100 28 4 × 7 0110100 52 4 × 13 1000000 64 8 × 8 1000100 68 4 × 17 1000101 69 3 × 23 1000110 70 7 × 10 1001100 76 4 × 19 1010000 80 8 × 10 1010001 81 9 × 9 1010010 82 2 × 41 1010100 84 7 × 12 1010101 85 5 × 17 1010110 86 2 × 43 1010111 87 3 × 29 1011000 88 8 × 11 1011100 92 4 × 23 1011101 93 3 × 31 1011110 94 2 × 47 1100100 100 10 × 10 1110000 112 8 × 14 1110100 116 4 × 29 1110101 117 9 × 13 1110110 118 2 × 59 1111100 124 4 × 31
Первый столбец - это число в двоичном формате; второй столбец - это число в десятичном виде. Как показывает третий столбец, все эти числа являются составными. Таким образом, 84 является устойчивым к битфлипу составным числом.
Задание
Вы должны написать одну из следующих трех программ или функций, в зависимости от того, что лучше всего подходит для вашего языка:
- Программа или функция, которая принимает неотрицательное целое число n в качестве входных данных и выводит первые n составных чисел, устойчивых к биту.
- Программа или функция, которая принимает неотрицательное целое число n в качестве входных данных и выводит все составные числа, устойчивые к битовым сдвигам, меньшие, чем n (или, если вы предпочитаете, меньшие или равные n , т.е. вы можете выбрать, будет ли n включен в выходные данные, если bitflip резистентный).
- Программа или функция, которая не требует ввода и выводит все составные числа, устойчивые к бит-флипу. (При этом должен использоваться механизм вывода, способный генерировать выходные данные во время работы программы, например, печать в стандартный вывод, отложенный список или генератор; вы не можете просто вычислить весь список и затем напечатать его.)
Контрольные примеры
Вот первые несколько составных чисел, устойчивых к бит-флипу:
84, 184, 246, 252, 324, 342, 424, 468, 588, 636, 664, 670, 712, 730, 934, 958
Разъяснения
- Только числа, которые вы производите, должны быть устойчивы к бит-флипам. Это не задача создания программы, которая считает их устойчивыми к бит-флипам; используйте любые числа в самой программе, которые вам нравятся.
- Числа, которые вы выводите, не должны быть устойчивыми к бит-флипу в «ведущих нулях»; представьте, что числа будут храниться в минимально возможном количестве битов, и только эти биты должны быть защищены от переворачивания. Тем не менее, начальные 1 бита в числах, которые вы выводите, должны быть невосприимчивы к бит-флипам.
- Используйте любой алгоритм, который вам нравится, который дает правильный результат; Вы не отмечены на эффективность здесь.
- Если вы можете доказать, что существует конечное число составных чисел, устойчивых к битовым флипам, то а) ограничения на формат вывода будут сняты, и б) будет разрешено жесткое кодирование списка (хотя, вероятно, более подробное, чем просто его вычисление). Это правило в основном только для полноты; Я не ожидаю, что это будет актуально.
Состояние победы
Это код-гольф , поэтому, как обычно, чем короче, тем лучше. Также, как обычно, длина программы будет измеряться в байтах.
n
лиn
бит-флип-устойчивым? (то есть сделать его "меньше или равно n"?)Ответы:
Желе , 20? 22 байта
Попробуйте онлайн!
Выдает первые n таких чисел.
Может быть,
;0
можно удалить (без этого мы не проверяем, является ли само число составным - есть ли простые числа со всеми сложными переворотами?)Обратите внимание , что не достаточно , чтобы провести тест
not(any(is prime))
на множество битовых-перевернуты числа. Мы также должны проверить, что0
не в наборе.Это потому, что
0
не является простым и не составным (1
тоже, но см. Ниже).Необходимость проверки
0
может быть замечена контрпримером:131136
( 2 17 +2 6 ) имеет следующий бит-флип:Все из которых, кроме
0
составных, еще не0
является простым.1
также не является простым и не составным и может появиться в наборе. Однако мы можем, если захотим, оставить это, как если бы оно было составным:все входные данные, которые меньше или равны
3
(если рассматриваются вообще), содержат в0
любом случае (фактически все меньше, чем7
делают).чтобы достичь
1
за один бит переворачивания, исходное число должно иметь вид 2 k +2 0 , и если оно больше, чем3
, то есть k> 1 , то мы можем достичь3
, перевернув k- бит и установив 1- бит ( 2 1 +2 0 = 3 ).чтобы достичь
1
двухбитных переворотов, исходное число должно иметь форму 2 k, и если оно больше, чем3
мы можем достичь2
за два переворота, и2
оно простое.В нынешнем виде код обрабатывает и то,
0
и другое1
вместе с использованием «незначительного» атомаỊ
.Как?
источник
;0
есть -Œċ
получает все неупорядоченные пары с заменой indexes (J
), то есть для 84, который имеет 7 битов, что составляет 28 (включая подобные [1,1] для одиночных переворотов битов (из часть «с заменой»), а не 29 (плюс без изменений).Брахилог ,
3238 байтПопробуйте онлайн!
Это функция / предикат,
↰₀
которая возвращает генератор, который генерирует все такие числа. (Ссылка TIO печатает только первое число, так что что-то можно наблюдать. Однако при локальном запуске получилось гораздо больше.)Теперь обновлено, чтобы обрабатывать числа, которые находятся в пределах двух бит-флипов от 0 или 1 (которые не являются ни простыми, ни составными) правильно.
объяснение
Предикат помощника
↰₂
(возвращает список, равный входному значению, за исключением, может быть, одного элемента)Мне бы понравилось, если бы был более краткий способ сделать эту относительно простую рекурсию, но я не уверен, что она еще есть; В спецификации есть многообещающие функции, но они помечены как невыполненные.
Основная программа
↰₀
источник
JavaScript (ES6), 96 байт
Полная программа, которая запрашивает количество совпадающих целых чисел и отображает их одно за другим, используя
alert()
.Если ваш браузер не настроен на использование Tail Call Optimization, это в конечном итоге сломается из-за переполнения рекурсии.
Ниже приведена нерекурсивная версия (102 байта).
предположение
Этот алгоритм основан на предположении, что все составные числа, устойчивые к битовым флипам, являются четными. Это приводит к довольно важному упрощению: вместо того, чтобы переворачивать каждую возможную пару битов, мы переворачиваем только бит № 0 и еще один бит (или вообще никакого другого бита) и проверяем, что все полученные числа являются составными.
Тем не менее, я не могу найти никакого очевидного доказательства того, что нечетного составного числа, устойчивого к бит-флипу, на самом деле не существует. Просто так случается, что для маленьких чисел никогда не бывает (я проверил до 1 000 000), и похоже, что вероятность найти единицу уменьшается с увеличением количества бит (но это в основном только моя интуиция).
источник
Желе ,
2017 байтПопробуйте онлайн!
Как это работает
источник
Python 2, 113 байт
(Вторая строка - это безымянная функция, которая возвращает список всех составных чисел, устойчивых к бит-флипу, которые меньше, чем входные данные для функции.)
Синтаксис
all(u%q for q in range(2,u))
будет оцениваться,True
когдаu
он либо прост, либо меньше или равен2
, а в противном случае будет оцениватьсяFalse
. (Пусто,True
еслиu
меньше или равно2
.)Другими словами,
all(u%q for q in range(2,u))
равен0
тогда и только тогда, когдаu
является составным.Если ввод функции меньше чем
2
, то функция возвращает пустой список (по желанию). Итак, предположим, что входN
по крайней мере2
, и предположим1 <= n < N
. Для каждогоk
из0
сквозныхn
(включительно) код будет проверять, является лиn
XOR'd сk
составным, и также проверяет,k
имеет ли не более двух1
в своем двоичном представлении. Еслиn^k
составной, или еслиk
имеет более двух1
, то он переходит к следующему значениюk
. Если он получает через все значенияk
от0
черезn
таким образом, то она включает в себяn
в списке.С другой стороны, если есть значение
k
с не более чем двумя значениями1
, котороеn^k
не является составным, тоn
оно не включается в список.источник
Perl 6 ,
8785 байтВозвращает все такие числа, которые меньше или равны введенному номеру.
Как это работает
Для каждого числа n от 2 до ввода выполняется следующее:
Создает все неотрицательные целые числа, которые имеют одинаковую или меньшую длину в битах, чем n .
Фильтрует числа из этого списка, у которых установлено менее трех битов (с использованием регулярного выражения).
XOR n с каждым из этих чисел, давая все действительные "мутации" n .
Позволяет n быть частью выходного списка только в том случае, если ни одна из мутаций не является составной (проверяется путем выбора каждой мутации x по модулю all-Junction чисел от 2 до x -1).
источник
Mathematica, 115 байт
14 байта сохранено благодаря @MartinEnderОчень неэффективно, потому что генерирует все числа до 2 ^ ceil (lg (n)).
Второй код использует U + F4A1 (
Function
функция)источник
Floroid ,
95109 байтВозвращает список устойчивых к битфлипу чисел до
input - 1
. Также обрабатывает острые ситуации (0 и 1).Floroid - мой старый язык, который я использовал только пару раз. Давно не трогал его, отсюда и размер программы.
Переводит на следующий код Python, который, я думаю, может быть уменьшен с помощью рекурсии.
Каждая используемая здесь функция предопределена в Floroid. Эта страница содержит все функции и их определения.
источник
MATL ,
30282726 байтовПопробуйте онлайн!
Выводит все устойчивые к битфлипу составные числа до (включая) n. Использует идеи из обоих решений Jelly - рассматривает только 0 как проблемное не простое число; и сначала генерирует список чисел на расстоянии 2, затем принимает xor.
Альтернативное решение с помощью цикла (30 байт):
Выводит все устойчивые к битфлипу составные числа до (включая) n.
источник
CJam ,
3433 байтаВычисляет все бит-флип-устойчивые композиты строго меньше, чем n .
Как и Джонатан Аллан, я не уверен, действительно ли необходимо проверять наличие 0 бит-клипов. Если выясняется, что ни одно простое число не имеет всех своих бит-флипов, приводящих к составным числам, их
0+
можно удалить.Попробуйте онлайн!
объяснение
источник
MATL , 29 байт
Спасибо Джонатану Аллану за исправление.
Он принимает число n и выводит все составные числа, устойчивые к бит-флипу, вплоть до n .
Как это работает
Попробуйте это в MATL Online!
источник