Twoim zadaniem jest podanie dwóch liczb całkowitych a
i b
obliczenie modularnej multiplikatywnej odwrotności modułu b, jeśli taki istnieje.
Modularna odwrotność a
modulo b
jest liczbą c
taką, że ac ≡ 1 (mod b)
. Ten numer jest unikalnym modułem b
dla dowolnej pary a
i b
. Istnieje tylko wtedy, gdy jest największym wspólnym dzielnikiem a
i b
jest 1
.
Strona Wikipedia dla modułowego Liczba odwrotna może być konsultowany, jeśli potrzebujesz więcej informacji na dany temat.
Wejście i wyjście
Dane wejściowe są podawane jako dwie liczby całkowite lub lista dwóch liczb całkowitych. Twój program powinien wypisać albo pojedynczą liczbę, modularną odwrotność multiplikatywną, która znajduje się w przedziale 0 < c < b
, lub wartość wskazującą, że nie ma odwrotności. Wartość może być dowolna, z wyjątkiem liczby z zakresu (0,b)
, i może być również wyjątkiem. Wartość powinna jednak być taka sama dla przypadków, w których nie ma odwrotności.
0 < a < b
można założyć
Zasady
- Program powinien zakończyć się w pewnym momencie i powinien rozwiązać każdy przypadek testowy w mniej niż 60 sekund
- Obowiązują standardowe luki
Przypadki testowe
Poniższe przypadki testowe są podane w formacie, 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
Punktacja
To jest kod golfowy, więc wygrywa najkrótszy kod dla każdego języka.
To i to są podobne pytania, ale oba dotyczą konkretnych sytuacji.
źródło
Odpowiedzi:
Mathematica, 14 bajtów
Obowiązkowy Mathematica wbudowane :
Jest to funkcja, która pobiera dwa argumenty (
a
ib
) i zwraca odwrotność mod b, jeśli istnieje. Jeśli nie, zwraca błądModularInverse: a is not invertible modulo b.
.źródło
JavaScript (ES6),
79736261 bajtówZwraca,
false
jeśli odwrotność nie istnieje.Wykorzystuje rozszerzony algorytm euklidesowy i prawie natychmiast rozwiązuje wszystkie przypadki testowe.
Przypadki testowe
Pokaż fragment kodu
źródło
f(x,y)
jest zawsze analizowany jako wywołanie funkcji, z wyjątkiem sytuacji, gdy jest to wyraźnie poprzedzonefunction
słowem kluczowym. Z drugiej strony anonimowa funkcja strzałki jest zadeklarowana jako(x,y)=>something
if=(x,y)=>something
przypisuje funkcję dof
zmiennej.Galaretka , 2 bajty
Wypróbuj online!
Używa wbudowanego do modułowego odwrotnego i zwraca 0 dla braku modułowego odwrotnego.
Galaretka , 7 bajtów
Wypróbuj online!
Wyprowadza pusty zestaw (reprezentowany jako pusty ciąg) przy braku odwrotności modułowej. Skończy się pamięć w TIO dla największych przypadków testowych, ale powinna działać z wystarczającą ilością pamięci.
Jak to działa
Jeśli chcesz pracować dla większych przypadków testowych, wypróbuj tę (względnie nie golfową) wersję, która wymaga dużo czasu niż pamięci:
Galaretka, 9 bajtów
Wypróbuj online!
Jak to działa
źródło
Python 2 , 34 bajty
Wypróbuj online!
Rekurencyjna funkcja, która daje
True
zaprint f(1,2)
, które uważam za dopuszczalne, a błędy dla nieprawidłowych danych wejściowych.Nabierającymoda −1≡k⋅b(moda) −k⋅b≡1(moda) k .
źródło
Liczby R + , 15 bajtów
zwraca
NA
dla tycha
bez modów inwersyjnychb
.R-Fiddle, aby spróbować!
R , 33 bajty (niekonkurujące)
To się nie powiedzie na bardzo dużych
b
ponieważ faktycznie tworzy wektor32*b
bitów wielkości .Wypróbuj online!
Zwraca
integer(0)
(pusta lista) dla tycha
bez modów inwersyjnychb
.źródło
Mathematica, 18 bajtów
wkład
źródło
Python 2 ,
514954535149 bajtów-1 bajt dzięki oficjalnemu
-1 bajtowi dzięki Kudłaty
Wypróbuj online!
Drukuje,
0
gdy nie ma rozwiązania.źródło
0
dlaa=1
ib=2
; z przypadków testowych, powinien wypisać1
.2, 1
31,73714876143
.Japt ,
98 bajtówPobiera dane wejściowe w odwrotnej kolejności. Wyjścia
-1
dla braku dopasowania. Występuje, gdy większa liczba całkowita staje się większa.Sprawdź to
źródło
73714876143,31
Wygląda na to, że dane wejściowe testu powodują błąd braku pamięci w przeglądarce Firefox (i powodują awarię Chromium). Nie sądzę, żeby to była prawidłowa odpowiedź.Python 3 + gmpy , 23 bajty
Nie sądzę, że w Pythonie może być krótszy.
Wypróbuj online! (nie będzie działać, jeśli nie masz zainstalowanego Gmaila)
źródło
Python 3 , 49 bajtów
Wypróbuj online!
Python 3 , 50 bajtów
Wypróbuj online!
Wyrzuca to
IndexError: list index out of range
w przypadku, gdy nie ma modularnego odwrotności multiplikatywnej, jak dopuszczają to reguły.źródło
31,73714876143
w ciągu 60 sekund (w TIO).8 , 6 bajtów
Kod
Wyjaśnienie
invmod
jest ósmym słowem, które oblicza wartość odwrotnościa
modulob
. Powracanull
w przypadku przepełnienia lub innych błędów.Przypadki użycia i testowe
źródło
Pari / GP , 22 bajty
Zgłasza błąd, gdy nie ma odwrotności.
Wypróbuj online!
źródło
J , 28 bajtów
Wypróbuj online!
Wykorzystuje twierdzenie Eulera . Zwraca 0, jeśli odwrotność nie istnieje.
Wyjaśnienie
źródło
Pyth , 10 bajtów
3 bajty zapisane dzięki @Jakube .
Wypróbuj tutaj!
Zwroty
-1
brak multiplikatywnej odwrotności.Podział kodu
Pyth ,
1513 bajtówZgłasza wyjątek w przypadku, gdy nie istnieje odwrotność multiplikatywna.
Wypróbuj tutaj!
Pyth , 15 bajtów
Dodaje to wiele bajtów do obsługi przypadku, w którym taka liczba nie istnieje. Program można znacznie skrócić, jeśli nie będzie trzeba zajmować się tą sprawą:
Wypróbuj tutaj!
źródło
KExm%*QdKK1
xm%*szdQQ1
C (gcc) , 115 bajtów
Wypróbuj online!
Rozszerzony algorytm euklidesowy, wersja rekurencyjna
C (gcc) , 119 bajtów
Wypróbuj online!
Rozszerzony algorytm euklidesowy, wersja iteracyjna
źródło
C (gcc) ,
48 110104 bajtówWypróbuj online!
Powinno to działać ze wszystkimi wejściami (które mieszczą się w długim czasie) w ciągu 60 sekund.
Edytować. Już nadużywam
n
zmiennej, więc równie dobrze mogę założyć, że gcc umieszcza pierwsze przypisanie%rax
.źródło
f(3,1000001)
zwraca 717, co oczywiście jest nonsensem (poprawna odpowiedź to 333334). Ponadto, nawet jeśli ten błąd został naprawiony przy użyciu szerszego typu liczb całkowitych, to podejście brutalnej siły z pewnością przekroczyłoby limit czasu dla niektórych większych przypadków testowych podanych w wyzwaniu.Python 2 + sympy, 74 bajty
Wypróbuj online!
Taken from Jelly source code.
źródło
Axiom, 45 bytes
0 for error else return z with x*z Mod y =1
źródło
Python 2, 52 bytes
-3 bytes thanks to Mr. Xcoder.
Try it online!
Outputs
False
on no solution and errors out asb
gets larger.Embedded TIO
I'm just testing out iframes in Stack Snippets and they work absolutely fantastic.
Show code snippet
źródło
i*a%b
be0
?(31,73714876143)
.JavaScript (ES6),
42413938 bytesOutputs
false
for no match. Will throw a overflow error as the second number gets to be too large.źródło
Jelly, 27 bytes
Try it online!
Uses Euler's theorem with modular exponentiation. Since Jelly doesn't have a builtin to perform modular exponentiation, it had to be implemented, and it took most of the bytes.
źródło
Axiom, 99 bytes
it use the function h(); h(a,b) return 0 if error [not exist inverse] otherwise it return the z such that a*z mod b = 1 This would be ok even if arguments are negative...
this would be the general egcd() function that retunr a list of int (so they can be negative too)
this is how use it
i find the base algo in internet from https://pastebin.com/A13ybryc
źródło