Chińskie twierdzenie o resztach może być bardzo przydatna w arytmetyce modularnej.
Rozważmy na przykład następujący zestaw relacji zgodności:
W przypadku zestawów warunków kongruencji jak ten, w którym wszystkie zasady ( 3, 5, 7
w tym przykładzie) są wspólnie pierwsza z siebie, że będzie jeden i tylko jeden całkowitą n
od 1
i produkt z zasady ( 3*5*7 = 105
w tym przykładzie) włącznie, który spełnia stosunki .
W tym przykładzie liczba byłaby 14
wygenerowana według tej formuły:
gdzie 2, 4, and 0
podano z powyższego przykładu.
70, 21, 15
są współczynniki o wzorze i są one zależne od podstawach 3, 5, 7
.
Aby obliczyć współczynniki wzoru ( 70, 21, 15
w naszym przykładzie) dla zestawu zasad, stosujemy następującą procedurę.
Dla każdej liczby a
w zestawie zasad:
- Znajdź produkt wszystkich innych baz, oznaczonych jako
P
. - Znajdź pierwszą wielokrotność,
P
która pozostawia resztę1
po podzieleniu przeza
. Jest to współczynnika
.
Na przykład, aby obliczyć współczynnik odpowiadający podstawie 3
, znajdujemy iloczyn wszystkich pozostałych zasad (tj. 5*7 = 35
), A następnie znajdujemy pierwszą wielokrotność tego produktu, która pozostawia resztę 1
po podzieleniu przez zasadę.
W tym przypadku 35
pozostawia resztę 2
po podzieleniu przez 3
, ale 35*2 = 70
pozostawia resztę 1
po podzieleniu przez 3
, więc 70
jest to odpowiedni współczynnik dla 3
. Podobnie 3*7 = 21
pozostawia resztę 1
po podzieleniu przez 5
i 3*5 = 15
pozostawia resztę 1
po podzieleniu przez 7
.
W skrócie
Dla każdej liczby a
w zestawie liczb:
- Znajdź iloczyn wszystkich pozostałych liczb oznaczonych jako
P
. - Znajdź pierwszą wielokrotność,
P
która pozostawia resztę1
po podzieleniu przeza
. Jest to współczynnika
.
Wyzwanie
- Wyzwaniem dla zestawu dwóch lub więcej zasad jest znalezienie zestawu odpowiednich współczynników.
- Zestaw podstaw jest gwarantowany jako para-podstawowa, a każda podstawa jest większa niż 1.
- Twoje dane wejściowe to lista liczb całkowitych jako
[3,4,5]
ciąg wejściowy lub ciąg znaków oddzielonych spacjami"3 4 5"
lub dane wejściowe działają. - Wynik powinien być albo listą liczb całkowitych, albo ciągiem znaków oddzielonych spacją, który oznacza zbiór współczynników.
Przypadki testowe
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]
Wielkie dzięki dla Dziurawej Zakonnicy za pomoc w napisaniu tego wyzwania. Jak zawsze, jeśli problem jest niejasny, daj mi znać. Powodzenia i dobrej gry w golfa!
Odpowiedzi:
Haskell,
615553 bajtówDefiniuje funkcję,
f
która pobiera dane wejściowe i podaje dane wyjściowe jako listę liczb całkowitych.Najpierw zapętlamy wszystkie liczby całkowite na wejściu (1). Następnie bierzemy iloczyn wszystkich liczb całkowitych (2) i dzielimy przez n, aby otrzymać tylko iloczyn
n
liczb całkowitych, czyliP
(3).Następnie wykorzystujemy wynik (
P
) jako wartość kroku dla zakresu rozpoczynającego się od zera (4). Bierzemy wynik[0, P, 2P, 3P, ...]
i filtrujemy go według wartości, dla których wynikiem operacji mod-n jest jeden (5). Na koniec bierzemy pierwszy element, który działa dzięki leniwej ocenie (6).Dzięki @xnor za 2 bajty!
źródło
quot
możesz byćdiv
ihead
może być!!0
.Galaretka ,
117 bajtówWypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
tło
Niech P i być ściśle dodatnich, względnie pierwsze liczby całkowite.
Dwuetapowy proces w pytaniu - znalezienie wielokrotności P, która pozostawia resztę 1, gdy dzieli się przez a - można opisać następującym równaniem zgodności.
Według twierdzenia Eulera-Fermata mamy
gdzie φ oznacza funkcję całkowitą Eulera . Na podstawie tego wyniku wnioskujemy, co następuje.
Wreszcie, ponieważ wyzwanie wymaga od nas obliczenia Px , obserwujemy to
gdzie Pa można obliczyć jako iloczyn wszystkich modułów.
Jak to działa
źródło
J, 13 bajtów
Na podstawie niesamowitej odpowiedzi @Dennis .
Stosowanie
Niektóre przypadki testowe będą wymagały danych wejściowych jako rozszerzonych liczb całkowitych z sufiksem
x
.Wyjaśnienie
Wypróbuj tutaj.
źródło
Mathematica, 27 bajtów
źródło
Pyth , 14 bajtów
Zestaw testowy.
Naiwna implementacja algorytmu.
źródło
Galaretka,
1413 bajtówZapisano bajt dzięki @ Dennis !
Wykorzystuje proces opisany w specyfikacji wyzwania. Dane wejściowe to lista zasad, a dane wyjściowe to lista współczynników.
Wypróbuj online lub Zweryfikuj wszystkie przypadki testowe .
Wyjaśnienie
źródło
JavaScript (ES6), 80 bajtów
Wypróbowałem rozszerzony algorytm euklidesowy, ale zajmuje on 98 bajtów:
Jeśli wszystkie wartości są liczbą pierwszą, ES7 może to zrobić w 56 bajtach:
źródło
Python + SymPy, 71 bajtów
Wykorzystuje algorytm z mojej odpowiedzi Jelly . I / O ma postać list numerów SymPy.
źródło
Python 2,
8784 bajtówProsta implementacja algorytmu. Sugestie dotyczące gry w golfa mile widziane.
źródło
Cheddar , 64 bajty
źródło
.product
który robi.reduce((*))
dla tablic ...GAP , 51 bajtów
GAP ma funkcję, która może obliczyć motywujący przykład
ChineseRem([2,5,7],[2,4,0])
, ale wciąż nie ułatwia to uzyskania współczynników. Możemy uzyskać n-ty współczynnik, używając listy z jednym w n-tej pozycji i zerami w innych pozycjach jako drugim argumentem. Musimy więc utworzyć te listy i zastosować funkcję do wszystkich:źródło
Partia, 148 bajtów
źródło
Właściwie 14 bajtów
Wykorzystuje to algorytm w odpowiedzi Dennisa Jelly . Nadchodzi kolejna odpowiedź oparta na mojej odpowiedzi w języku Python. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!
Jak to działa
Kolejna odpowiedź oparta na mojej odpowiedzi w języku Python na 22 bajty. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!
Jak to działa
źródło