Числа Кнёделя - Найти Кн


10

Кнодельские числа

Числа Кнёделя представляют собой набор последовательностей. В частности, число Knodel для положительного целого числа nпредставляют собой набор составных чисел m, таким образом, что все i < m, взаимно простое с m, удовлетворяют условию i^(m-n) = 1 (mod m). Множество чисел Кнёделя для конкретного nобозначается Kn. ( Википедия ).

Например, K1это числа Кармайкла и OEIS A002997 . Они идут как {561, 1105, 1729, 2465, 2821, 6601, ... }. K2является OEIS A050990 и идет , как, {4, 6, 8, 10, 12, 14, 22, 24, 26, ... }.

Твое задание

Ваша задача - написать программу / функцию / и т.д. это занимает два числа, nи p. Она должна возвращать первые pномера в Knodel последовательности, Kn.

Это , поэтому выигрывает самый короткий код в байтах!

Примеры

1, 6   ->   [561, 1105, 1729, 2465, 2821, 6601]
2, 3   ->   [4, 6, 8]
4, 9   ->   [6, 8, 12, 16, 20, 24, 28, 40, 44]
3, 1   ->   [9]
3, 0   ->   []
21, 21 ->   [45, 57, 63, 85, 105, 117, 147, 231, 273, 357, 399, 441, 483, 585, 609, 651, 741, 777, 861, 903, 987]

1
Почему 4нет в последовательности K_4? i^(4-4) = 1 mod 4всегда верно.
Исаак

1
@isaacg MathWorld имеет дополнительное условие , что m > n.
Мартин Эндер

Ответы:


6

Pyth, 29 28 байт

.f&tPZ!f&q1iTZt%^T-ZQZSZvzhQ

1 байт сохранен благодаря Jakube и orlp.

Демонстрация.

Ввод в форме

p
n

Довольно простой расчет. Относительная простота проверяется с помощью функции Pyc's gcd. Этот код демонстрирует .fфункцию Pyth "первый n удовлетворяющий".

Я включил неявное условие, m > nначав поиск mзначений в n + 1.


4

Haskell, 89 байт

Очень простая реализация. Определяет бинарный оператор n!p.

n!p=take p[m|m<-[n+1..],any((<1).mod m)[2..m-1],and[i^(m-n)`mod`m<2|i<-[1..m],gcd i m<2]]

Пример:

Prelude> 4!9
[6,8,12,16,20,24,28,40,44]

2
Для чего m>n?
Рубик

Не имею представления. Я получаю negative exponentошибки 21!21, и добавляю, что это решило проблему.
Линн

1
Я установил Haskell, чтобы попытаться выяснить, как избавиться от m>n&&биты, переходя m<-[4..]на, m<-[n+1..]кажется, работает. Вы также получите количество байтов 91!
Каде

1
Ухоженная! Спасибо, @Vioz.
Линн

@ Vioz- Значит, ты вмешался в Haskell, не зная раньше Haskell? Как ты сделал это?
гордый haskeller

2

Хаскелл, 90

a#b=gcd a b>1
n!p=take p[m|m<-[n+1..],any(m#)[2..m-1],all(\i->m#i||mod(i^(m-n))m<2)[1..m]]

почти так же, как ответ @Marius, хотя и разработан независимо.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.