Ваша задача - дать два целых числа a
и b
вычислить модульную мультипликативную инверсию по модулю b, если она существует.
Модульная обратная по a
модулю b
это число c
такое, что ac ≡ 1 (mod b)
. Это число является уникальным по модулю b
для любой пары a
и b
. Он существует, только если наибольшим общим делителем a
и b
является 1
.
Страницу Wikipedia для модульного мультипликативного обратного можно обратиться , если вам необходима дополнительная информация о теме.
Вход и выход
Входные данные задаются либо двумя целыми числами, либо списком из двух целых чисел. Ваша программа должна выводить либо одно число, либо модульную мультипликативную инверсию, которая находится в интервале 0 < c < b
, либо значение, указывающее, что инверсии нет. Значение может быть любым, кроме числа в диапазоне (0,b)
, а также может быть исключением. Однако значение должно быть одинаковым для случаев, когда нет обратного.
0 < a < b
можно предположить
правила
- Программа должна завершиться в какой-то момент и решить каждый контрольный пример менее чем за 60 секунд.
- Применяются стандартные лазейки
Контрольные примеры
Тестовые случаи ниже приведены в формате, a, b -> output
1, 2 -> 1
3, 6 -> Does not exist
7, 87 -> 25
25, 87 -> 7
2, 91 -> 46
13, 91 -> Does not exist
19, 1212393831 -> 701912218
31, 73714876143 -> 45180085378
3, 73714876143 -> Does not exist
счет
Это кодовый гольф, поэтому выигрывает самый короткий код для каждого языка.
Это и это схожие вопросы, но оба задают конкретные ситуации.
источник
Ответы:
Mathematica, 14 байтов
Обязательный Mathematica встроен :
Это функция, которая принимает два аргумента (
a
иb
) и возвращает инверсию мода b, если он существует. Если нет, возвращается ошибкаModularInverse: a is not invertible modulo b.
.источник
JavaScript (ES6),
79736261 байтВозвращает,
false
если обратного не существует.Он использует расширенный евклидов алгоритм и решает все тестовые случаи практически мгновенно.
Контрольные примеры
Показать фрагмент кода
источник
f(x,y)
всегда анализируется как вызов функции, за исключением случаев, когда ему явно предшествуетfunction
ключевое слово. С другой стороны, анонимная функция стрелки объявляется как(x,y)=>something
иf=(x,y)=>something
присваивает функциюf
переменной.Желе , 2 байта
Попробуйте онлайн!
Он использует встроенную функцию для модульной инверсии и возвращает 0 для отсутствия модульной инверсии.
Желе , 7 байт
Попробуйте онлайн!
Выводит пустой набор (представленный в виде пустой строки) без модульной инверсии. Запускается нехватка памяти на TIO для самых больших тестовых случаев, но должна работать при достаточном объеме памяти.
Как это работает
Если вы хотите работать с большими тестовыми примерами, попробуйте эту (относительно безвкусицу) версию, которая требует больше времени, чем памяти:
Желе, 9 байт
Попробуйте онлайн!
Как это работает
источник
Python 2 , 34 байта
Попробуйте онлайн!
Рекурсивная функция , которая дает
True
дляprint f(1,2)
, который я считаю приемлемыми, и ошибки для недействительных входов.Взятиеmoda −1≡k⋅b(moda) −k⋅b≡1(moda) k
источник
R + числа , 15 байтов
возвращается
NA
для тех, ктоa
без инверсий модb
.R-Fiddle, чтобы попробовать это!
R , 33 байта (не конкурирует)
Это приведет к ошибке очень большого размера,
b
поскольку фактически создает вектор32*b
битов размера .Попробуйте онлайн!
Возвращает
integer(0)
(пустой список) для техa
без инверсии модb
.источник
Mathematica, 18 байт
вход
источник
Python 2 ,
514954535149 байт-1 байт благодаря officialaimm
-1 байт благодаря Shaggy
Попробуйте онлайн!
Печатает,
0
когда нет решения.источник
0
дляa=1
иb=2
; из тестовых случаев, он должен выводить1
.2, 1
31,73714876143
.Japt ,
98 байтПринимает входные данные в обратном порядке. Выходы
-1
не совпадают. Вылетает, когда большее целое становится больше.Попробуй это
источник
73714876143,31
похоже, вызывает ошибку нехватки памяти в Firefox (и приводит к сбою Chromium). Я не думаю, что это правильный ответ.Python 3 + gmpy , 23 байта
Я не думаю, что это может стать немного короче в Python.
Попробуйте онлайн! (не будет работать, если у вас не установлен gmpy)
источник
Python 3 , 49 байт
Попробуйте онлайн!
Python 3 , 50 байт
Попробуйте онлайн!
Это бросает
IndexError: list index out of range
в случае, если нет модульного мультипликативного обратного, как это разрешено правилами.источник
31,73714876143
в течение 60 секунд (на TIO).8 , 6 байтов
Код
объяснение
invmod
является восьмым словом, которое вычисляет значение, обратноеa
, по модулюb
. Возвращаетсяnull
при переполнении или других ошибках.Использование и тестовые случаи
источник
Пари / ГП , 22 байта
Выдает ошибку, когда нет обратного.
Попробуйте онлайн!
источник
J , 28 байт
Попробуйте онлайн!
Использует теорему Эйлера . Возвращает 0, если обратное не существует.
объяснение
источник
Pyth , 10 байт
3 байта сохранены благодаря @Jakube .
Попробуй это здесь!
Возвращает
-1
без мультипликативного обратного.Разбивка кода
Pyth ,
1513 байтВыдает исключение, если мультипликативного обратного не существует.
Попробуй это здесь!
Pyth , 15 байт
Это добавляет много байтов для обработки случая, когда такого числа не существует. Программа может быть значительно сокращена, если этот случай не нужно обрабатывать:
Попробуй это здесь!
источник
KExm%*QdKK1
xm%*szdQQ1
C (gcc) , 115 байтов
Попробуйте онлайн!
Расширенный евклидов алгоритм, рекурсивная версия
C (gcc) , 119 байт
Попробуйте онлайн!
Расширенный евклидов алгоритм, итерационная версия
источник
C (gcc) ,
48 110104 байтаПопробуйте онлайн!
Это должно работать со всеми входами (которые подходят в течение длительного времени) в течение 60 секунд.
Редактировать. Я уже злоупотребляю
n
переменной, поэтому могу предположить, что gcc вставляет первое присваивание%rax
.источник
f(3,1000001)
возвращает 717, что, очевидно, является ерундой (правильный ответ - 333334). Кроме того, даже если бы эта ошибка была исправлена с использованием более широкого целочисленного типа, этот метод грубой силы наверняка истек бы для некоторых из более крупных тестовых случаев, приведенных в задаче.Python 2 + sympy, 74 байта
Попробуйте онлайн!
Взято из исходного кода Jelly.
источник
Аксиома, 45 байт
0 для ошибки, иначе верните z с x * z Mod y = 1
источник
Python 2 , 52 байта
-3 байта благодаря мистеру Xcoder.
Попробуйте онлайн!
Выходы
False
на нет решения и ошибок, какb
становится больше.Встроенный TIO
Я просто тестирую фреймы в Stack Snippets, и они работают просто фантастически.
Показать фрагмент кода
источник
i*a%b
быть0
?(31,73714876143)
.JavaScript (ES6),
42413938 байтВыходы
false
не совпадают. Выдает ошибку переполнения, поскольку второе число становится слишком большим.источник
Желе , 27 байт
Попробуйте онлайн!
Используется теорема Эйлера с модульным возведением в степень. Поскольку у Jelly нет встроенной функции для модульного возведения в степень, его необходимо было реализовать, и он занял большую часть байтов.
источник
Аксиома, 99 байт
он использует функцию h (); h (a, b) возвращает 0, если ошибка [не существует обратного], в противном случае она возвращает z так, что a * z mod b = 1 Это было бы нормально, даже если аргументы отрицательны ...
это будет общая функция egcd (), которая возвращает список int (так что они тоже могут быть отрицательными)
вот как это использовать
Я нахожу базовый алгоритм в Интернете с https://pastebin.com/A13ybryc
источник