Рассчитать обратный модуль

18

Задание:

Выведите значение для x, где a mod x = bдля двух заданных значений a,b.

предположение

  • aи bвсегда будут положительными целыми числами
  • Там не всегда будет решение для x
  • Если существует несколько решений, выведите хотя бы одно из них.
  • Если решений нет, ничего не выводите или указывайте, что решений не существует.
  • Разрешены встроенные модули (не так весело, как другие математические подходы)
  • Выходы всегда целые

Примеры

A, B >> POSSIBLE OUTPUTS

5, 2 >> 3
9, 4 >> 5
8, 2 >> 3, 6
6, 6 >> 7, (ANY NUMBER > 6)
8, 7 >> NO SOLUTION
2, 4 >> NO SOLUTION
8, 5 >> NO SOLUTION
10,1 >> 3, 9

Это , поэтому побеждают младшие байты.

Гравитон
источник
Может ли это быть ошибкой, если решение не найдено?
хлоп
@ConfusedMr_C Технически это указывает на отсутствие решения, так что да.
Гравитон

Ответы:

11

JavaScript , 28 27 26 24 23 байта

a=>b=>(a-=b)?a>b&&a:b+1

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

false указывает на отсутствие решения.

-1 спасибо @Arnauld

eush77
источник
Красиво сделано и приятно в гольф.
Лохматый
Итак, чтобы вызвать его, нужно дать имя внешней функции, скажем f=..., затем вызвать f(8)(3)? Это кажется немного обманным? Нормальный способ вызова функции будет таким f(8,3), что сделает ваше определение функции длиннее?
Стив Беннетт
3
@SteveBennett Да, определение является каррированным , что означает, что оно должно называться как (8)(3), но есть консенсус в отношении PPCG, что это разрешено . Вы не должны давать ему имя, хотя.
eush77
1
@SteveBennett Забавно , как вы думаете , 26 против -15 ничего , но четкий консенсус. Удачи в споре.
eush77
1
@ SteveBennett, как 55 к 1 слабый консенсус?
Cyoce
6

MATL , 6 байтов

tQ:\=f

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

Рассмотрим входы 8, в 2качестве примера.

t    % Implicit input. Duplicate                STACK: 8, 8
Q    % Add 1                                    STACK: 8, 9
:    % Range                                    STACK: 8, [1 2 3 4 5 6 7 8 9]
\    % Modulo                                   STACK: [0 0 2 0 3 2 1 0 8]
=    % Implicit input. Equality comparison      STACK: [0 0 1 0 0 1 0 0 0]
f    % Indices of nonzeros. Implicit display    STACK: [3 6]
Луис Мендо
источник
3

Groovy, 48 байт (с использованием встроенного):

{a,b->Eval.me(a+"g").modInverse(Eval.me(b+"g"))}

Eval.me(...+"g") - Прикрепляет «g» к входу, делая его BigInteger.

modInverse(...) - Выполняет обратную операцию по модулю.


Java 8, 70 байт

{a,b->return BigInteger.valueOf(a).modInverse(BigInteger.valueOf(b));}
Урна волшебного осьминога
источник
3

R , 33 28 байт

pryr::f(match(b,a%%1:(a+1)))

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

-4 байта благодаря Ярко Дуббелдаму.

-1 байт благодаря Джузеппе.

Возвращает, NAесли нет решения. В TIO не установлена ​​библиотека pryr, поэтому function(a,b)вместо этого используется код по этой ссылке .

Nitrodon
источник
pryr::f(which(a%%1:(a+1)==b)) на 4 байта короче.
JAD
Вы также можете удалить другой байт с помощью match(b,a%%1:(a+1)), который возвращает NAпропущенное значение.
Джузеппе
1

Желе , 11 10 байт

³%_⁴
r‘ÇÐḟ

Полная программа , содержащая два положительных целых числа aи bраспечатывающая список целочисленных решений между min(a,b)+1и max(a,b)+1включительно.

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

Джонатан Аллан
источник
1

Mathematica 36 байт

a_±b_:=Select[Range[9a],a~Mod~#==b&]

Входные данные:

5 ± 2
9 ± 4
8 ± 2
6 ± 6
8 ± 7
2 ± 4
8 ± 5
10 ± 1

Выход:

{3}
{5}
{3, 6}
{7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, \
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, \
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54}
{}
{}
{}
{3, 9}
Келли Лоудер
источник
При использовании этих расширенных операторов ASCII в двоичном виде, им нужно пространство перед при определении, иначе анализатор выдает ошибку. Так и должно быть a_ ±b_. Но в любом случае Casesвместо Selectненазванной функции использовать ее короче :Cases[Range[9#],x_/;#~Mod~x==#2]&
Мартин Эндер
1

Haskell , 33 байта

Сбой code.hs: out of memory (requested ??? bytes)при отсутствии решения (тайм-аут на TIO до этого):

a!b=[x|x<-[b+1..],mod(a-b)x<1]!!0

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

Спасибо Орджану Йохансену за обнаружение ошибки!

ბიმო
источник
Это дает неправильные ответы для тестовых случаев, где bделится a.
Орджан Йохансен
1

C # (моно C # компилятор) , 57 56 26 байт

Порт Питона ответ Python. Спасибо WW за -1 байт.

Огромное спасибо Кевину Круйссену за -30 байтов.

a=>b=>a-b>b?a-b:a==b?a+1:0

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

Эпичность
источник
1
Добро пожаловать на сайт! Похоже, вы можете удалить пространство после return.
Wheat Wizard
Добро пожаловать в PPCG! Для нерекурсивных ответов C # всегда лучше и меньше всего использовать лямбда-функцию ( i=>{/*code here*/}). Однако в этом случае, поскольку у вас есть 2 входа, это может быть лямбда-функция с каррированием для сохранения дополнительного байта ( a=>b=>{/*code here*/}вместо (a,b)=>{/*code here*/}). Кроме того, вы можете удалить круглые скобки вокруг ваших if-проверок. В общей сложности, без изменения какой-либо вашей функциональности, она становится a=>b=>a-b>b?a-b:a==b?a+1:0 26 байтов
Кевин Круйссен
Кроме того, если вы еще этого не видели, интересно прочитать и « Советы по игре в гольф на <все языки>», и « Советы по игре в гольф на C #» . Приятного пребывания! :)
Кевин Круйссен
Спасибо всем за советы, я буду помнить их при игре в гольф в будущем.
Epicness
0

Mathematica, 28 байт

Which[#>2#2,#-#2,#==#2,#+1]&
alephalpha
источник
0

Аксиома, 147 128 байтов

g(a:PI,c:PI):Union(List PI,Stream INT)==(a<c=>[];r:=a-c;r=0=>expand((a+1..)::UniversalSegment INT);[b for b in divisors(r)|b>c])

раскрутить и проверить

--a%b=c return all possible b
f(a:PI,c:PI):Union(List PI, Stream INT)==
    a<c=>[]
    r:=a-c
    r=0=>expand((a+1..)::UniversalSegment INT)
    [b  for b in divisors(r)|b>c]

(3) -> [[i,j,g(i,j)] for i in [5,9,8,6,8,2,8,10] for j in [2,4,2,6,7,4,5,1]]
   (3)
   [[5,2,[3]], [9,4,[5]], [8,2,[3,6]], [6,6,[7,8,9,10,11,12,13,14,15,16,...]],
    [8,7,[]], [2,4,[]], [8,5,[]], [10,1,[3,9]]]
                                                      Type: List List Any

Это найдет все решение, даже решение с бесконечным множеством ...

RosLuP
источник
0

Пип , 9 байт

a%,a+2@?b

Принимает два числа в качестве аргументов командной строки. Выводит наименьшее решение или ноль, если решения не существует. Попробуйте онлайн!

объяснение

           a, b are cmdline args (implicit)
  ,a+2     Range from 0 up to but not including a+2
a%         Take a mod each of those numbers
           (Note that a%0 returns nil; it emits a warning, but only if warnings are turned on)
      @?b  Find the index of the first occurrence of b in this list, or nil if it doesn't occur
           Autoprint (implicit)

Например, с вводом 8и 2:

   a+2   10
  ,      [0 1 2 3 4 5 6 7 8 9]
a%       [() 0 0 2 0 3 2 1 0 8]

Основанный на 0 индекс первого вхождения 2в этом списке - 3это наше решение.

DLosc
источник
0

J , 14 байт

(->]){-,~=*1+]

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

Перевод решения Rod's Python 2 .

Как это устроено

Редкие случаи, когда J-код может быть напрямую переведен на Python.

(->]){-,~=*1+]  <=>  [(a==b)*(1+b),a-b][a-b>b]
         =*1+]        (a==b)*(1+b)
      -,~            [            ,a-b]
     {                                 [     ]
(->])                                   a-b>b
фонтанчик для питья
источник
0

Japt , 13 байт

UµV ?U>V©U:ÒV

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

Перевод решения eush77's JS .

Код только (U-=V)?U>V&&U:-~Vкогда передается в JS, где Uи Vявляются двумя входными значениями.

фонтанчик для питья
источник
0

ORK , 566 байт

When this program starts:
I have a inputter called I
I have a number called a
I have a number called b
I is to read a
I is to read b
I have a mathematician called M
M's first operand is a
M's second operand is b
M is to subtract
I have a number called n
n is M's result
M's first operand is b
M's second operand is n
M is to compare
I have a scribe called W
If M says it's less then W is to write n
If M says it's less then W is to write "\n"
M's second operand is a
M is to compare
If M says it's equal then W is to write a
If M says it's equal then W is to write a

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

О bjects R K оол. К счастью, однако, мне не нужно было использовать какие-либо (кроме встроенных) для этой задачи.

JosiahRyanW
источник
0

F #, 40 байт

let m a b=Seq.find(fun x->a%x=b){1..a+1}

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

Довольно просто. Сбрасывает, System.Collections.Generic.KeyNotFoundExceptionесли не может быть найдено решение.

Вы также можете изменить его на Seq.tryFind, который будет возвращать int option, с, Noneесли решение не может быть найдено.

Ciaran_McCarthy
источник
0

> <> , 21 байт

Тот же трюк, что и в большинстве опубликованных решений. Сначала мы подготавливаем все необходимые значения в стеке, а затем проверяем сравнения.

::r::{-:{)?nr=?!;1+n;

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

PidgeyUsedGust
источник
0

Whispers v2 , 128 байт

> Input
> Input
>> 1²
>> (3]
>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7
>> L⋅R
>> Each 9 4 8
> {0}
>> {10}
>> 12∖11
>> Output 13

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

Возвращает набор всех возможных решений и пустой набор (т.е. ) когда решения не существует.

Как это устроено

Неудивительно, что он работает почти так же, как и большинство других ответов: он генерирует список чисел и проверяет каждое из них на наличие обратного модуля с аргументом.

Если вы знакомы с тем, как работает структура программы Whispers, смело переходите к горизонтальной линии. Если нет: по сути, Whispers работает над построчной системой отсчета, начиная с последней строки. Каждая строка классифицируется как один из двух вариантов. Либо это линия nilad , либо это строка оператора .

Строки Nilad начинаются с >, например, > Inputи > {0}и возвращают точное значение, представленное в этой строке, т.е. > {0}возвращает набор{0}, > Inputвозвращает следующую строку STDIN, оценивается, если это возможно.

Строки оператора начинаются с >>, например, >> 1²и >> (3]и означают запуск оператора для одного или нескольких значений. Здесь используемые числа не ссылаются на эти явные числа, вместо этого они ссылаются на значение в этой строке. Например, ²есть квадратная команда (NN2), поэтому >> 1²не возвращает значение12вместо этого он возвращает квадрат линии 1 , которая в данном случае является первым входом.

Обычно операторские строки работают только с использованием чисел в качестве ссылок, но вы, возможно, заметили строки >> L=2и >> L⋅R. Эти два значения, Lи R, используются в сочетании с Eachутверждениями. Eachоператоры работают, принимая два или три аргумента, опять же как числовые ссылки. Первый аргумент (например, 5) является ссылкой на строку оператора, в которой используется функция, а остальные аргументы являются массивами. Затем мы перебираем функцию по массиву, где Lи Rв функции представляют текущий элемент (ы) в массивах, которые перебираются. В качестве примера:

Позволять Aзнак равно[1,2,3,4], Взнак равно[4,3,2,1] и е(Икс,Y)знак равноИкс+Y, Предполагая, что мы запускаем следующий код:

> [1, 2, 3, 4]
> [4, 3, 2, 1]
>> L+R
>> Each 3 1 2

Затем мы получаем демонстрацию того, как Eachработают заявления. Во-первых, при работе с двумя массивами, мы застегиваем ихСзнак равно[(1,4),(2,3),(3,2),(4,1)] затем карта е(Икс,Y) по каждой паре, формируя наш окончательный массив Dзнак равно[е(1,4),е(2,3),е(3,2),е(4,1)]знак равно[5,5,5,5]

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


Как работает этот код

Работая нелогично с тем, как работает Whispers, мы начнем с первых двух строк:

> Input
> Input

Это собирает наши два входа, скажем, Икс и Yи сохраняет их в строках 1 и 2 соответственно. Затем мы хранимИкс2в строке 3 и создать диапазонAзнак равно[1,,,Икс2]по строке 4 . Далее переходим к разделу

>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7

Первое , что выполняется здесь строка 7 , >> Each 5 4, который перебирает линии 5 по линии 4 . Это дает массивВзнак равно[я%Икс|яA], где a%бопределяется как модуль изa и б,

Затем мы выполняем линию 8 , >> Each 6 7, которая итерирует линия 6 за кадромВ, получая массив Сзнак равно[(я%Икс)знак равноY|яA],

Для входов Иксзнак равно5,Yзнак равно2, we have Aзнак равно[1,2,3,,,,,23,24,25], Взнак равно[0,1,2,1,0,5,5,,,,,5,5] и Сзнак равно[0,0,1,0,0,,,,,0,0]

Затем мы спрыгиваем

>> L⋅R
>> Each 9 4 8

which is our example of a dyadic Each statement. Here, our function is line 9 i.e >> L⋅R and our two arrays are A and C. We multiply each element in A with it's corresponding element in C, which yields an array, E, where each element works from the following relationship:

Ei={0Ci=0AiCi=1

We then end up with an array consisting of 0s and the inverse moduli of x and y. In order to remove the 0s, мы конвертируем этот массив в набор (>> {10}), then take the set difference between this set and {0}, уступая, затем выводя, наш конечный результат.

Caird Coneheringaahing
источник
-1

C #, 53 байта (83 с заголовком функции)

static int F(int a, int b){
    for(int i=1;i<=a+1;i++){if(a%i==b)return i;}return 0;
}

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

Сначала попробуйте на Codegolf. Вероятно, не лучший язык для использования и не самое эффективное кодирование.

Alex
источник
5
Удалите ненужные пробелы, чтобы сохранить около 10 или более байтов
Mr. Xcoder