Китайская теорема об остатках может быть весьма полезным в модульной арифметике.
Например, рассмотрим следующий набор конгруэнтных отношений:
Для множеств конгруэнции отношений , как это, где все основания ( 3, 5, 7
в данном примере) являются совместно простым друг с другом, там будет одно и только одно целым числом n
между 1
и продукт оснований ( 3*5*7 = 105
в этом примере) включительно , которая удовлетворяет соотношения ,
В этом примере число будет 14
сгенерировано по следующей формуле:
где 2, 4, and 0
приведены из приведенного выше примера.
70, 21, 15
являются коэффициенты формулы и они зависят от оснований, 3, 5, 7
.
Для вычисления коэффициентов формулы ( 70, 21, 15
в нашем примере) для набора базисов мы используем следующую процедуру.
Для каждого номера a
в наборе основ:
- Найдите произведение всех других основ, обозначенных как
P
. - Найдите первое кратное,
P
которое оставляет остаток от1
деления наa
. Это коэффициентa
.
Например, чтобы вычислить коэффициент, который соответствует основанию 3
, мы находим произведение всех других оснований (то есть 5*7 = 35
), а затем находим первое кратное этого произведения, которое оставляет остаток от 1
деления на основание.
В этом случае 35
оставляет остаток от 2
деления на 3
, но 35*2 = 70
оставляет остаток от 1
деления на 3
, 70
как и соответствующий коэффициент для 3
. Точно так же 3*7 = 21
оставляет остаток от 1
деления на 5
и 3*5 = 15
оставляет остаток от 1
деления на 7
.
В двух словах
Для каждого номера a
в наборе номеров:
- Найдите произведение всех других чисел, обозначенных как
P
. - Найдите первое кратное,
P
которое оставляет остаток от1
деления наa
. Это коэффициентa
.
Соревнование
- Задача состоит в том, чтобы для набора из двух или более баз найти набор соответствующих коэффициентов.
- Множество оснований, как гарантируют, будут попарно взаимно простыми, и каждое основание, как гарантируют, будет больше чем 1.
- Ваши входные данные представляют собой список целых чисел в виде
[3,4,5]
строки ввода или строки, разделенных пробелами,"3 4 5"
или же ваши входные данные работают. - Ваш вывод должен быть либо списком целых чисел, либо строкой через пробел, которая обозначает набор коэффициентов.
Контрольные примеры
input output
[3,5,7] [70,21,15]
[2,3,5] [15,10,6]
[3,4,5] [40,45,36]
[3,4] [4,9]
[2,3,5,7] [105,70,126,120]
[40,27,11] [9801,7480,6480]
[100,27,31] [61101,49600,56700]
[16,27,25,49,11] [363825,2371600,2794176,5583600,529200]
Большое спасибо Leaky Nun за помощь в написании этой задачи. Как всегда, если проблема неясна, пожалуйста, дайте мне знать. Удачи и хорошего гольфа!
Ответы:
Haskell,
615553 байтаОпределяет функцию,
f
которая принимает входные данные и выдает выходные данные в виде списка целых чисел.Сначала мы перебираем все целые числа на входе (1). Затем мы берем произведение всех целых чисел (2) и делим на n, чтобы получить просто произведение нецелых
n
чисел, которое равноP
(3).Затем мы используем result (
P
) в качестве значения шага для диапазона, начинающегося с нуля (4). Мы берем результат[0, P, 2P, 3P, ...]
и фильтруем его по значениям, для которых результат операции mod-n равен единице (5). Наконец, мы берем первый элемент, который работает благодаря ленивой оценке (6).Спасибо @xnor за 2 байта!
источник
quot
можете бытьdiv
, иhead
может быть!!0
.Желе ,
117 байтПопробуйте онлайн! или проверьте все контрольные примеры .
Фон
Пусть P и a строго положительные, взаимно простые числа.
Двухэтапный процесс в вопросе - поиск кратного P, который оставляет остаток от 1 при делении на a - может быть описан следующим уравнением сравнения.
По теореме Эйлера-Ферма имеем
где φ обозначает функцию Эйлера . Из этого результата мы выводим следующее.
Наконец, поскольку задача требует от нас вычисления Px , мы наблюдаем, что
где Pa можно рассчитать как произведение всех модулей.
Как это работает
источник
J 13 байт
На основании удивительного ответа @Dennis .
Применение
Некоторые тестовые случаи потребуют ввода в виде расширенных целых чисел с суффиксом
x
.объяснение
Попробуй это здесь.
источник
Mathematica, 27 байт
источник
Pyth , 14 байт
Тестирование.
Наивная реализация алгоритма.
источник
Желе,
1413 байтСохраненный байт благодаря @ Деннис !
Использует процесс, описанный в спецификации задачи. Входные данные представляют собой список базисов, а выходные данные представляют собой список коэффициентов.
Попробуйте онлайн или проверьте все контрольные примеры .
объяснение
источник
JavaScript (ES6), 80 байт
Я пробовал расширенный евклидов алгоритм, но он занимает 98 байт:
Если все значения простые, ES7 может сделать это в 56 байтах:
источник
Python + SymPy, 71 байт
Это использует алгоритм из моего ответа желе . Ввод / вывод осуществляется в виде списков номеров SymPy.
источник
Python 2,
8784 байтаПростая реализация алгоритма. Предложения по игре в гольф приветствуются.
источник
Чеддер , 64 байта
источник
.product
что делает.reduce((*))
для массивов ...GAP , 51 байт
В GAP есть функция, с помощью которой можно вычислить мотивирующий пример
ChineseRem([2,5,7],[2,4,0])
, но это все же не позволяет легко получить коэффициенты. Мы можем получить n-й коэффициент, используя список с единицей в n-й позиции и нулями в других позициях в качестве второго аргумента. Поэтому нам нужно создать эти списки и применить функцию ко всем из них:источник
Пакетный, 148 байт
источник
На самом деле, 14 байтов
Это использует алгоритм в ответе желе Денниса . Еще один ответ, основанный на моем ответе на Python, готовится к публикации. Предложения по игре в гольф приветствуются. Попробуйте онлайн!
Как это работает
Еще один ответ, основанный на моем ответе на Python в 22 байта. Предложения по игре в гольф приветствуются. Попробуйте онлайн!
Как это работает
источник