Der chinesische Restsatz kann in der modularen Arithmetik sehr nützlich sein.
Betrachten Sie beispielsweise die folgenden Kongruenzbeziehungen:
Für Gruppen von Kongruenzrelationen wie diese, in dem alle Basen ( 3, 5, 7
in diesem Beispiel) sind Co-prime miteinander, wird es eine sein und nur ein ganze Zahl n
zwischen 1
und das Produkt der Basen ( 3*5*7 = 105
in diesem Beispiel) , Grenzen eingeschlossen , die erfüllen die Beziehungen .
In diesem Beispiel würde die Zahl 14
durch diese Formel generiert werden:
wo 2, 4, and 0
sind aus dem obigen Beispiel angegeben.
70, 21, 15
sind die Koeffizienten der Formel und sie sind abhängig von den Basen , 3, 5, 7
.
Um die Koeffizienten der Formel ( 70, 21, 15
in unserem Beispiel) für eine Reihe von Basen zu berechnen , verwenden wir das folgende Verfahren.
Für jede Zahl a
in einer Reihe von Basen:
- Finden Sie das Produkt aller anderen Basen, bezeichnet als
P
. - Finden Sie das erste Vielfache davon
P
, das einen Rest ergibt,1
wenn durch geteilta
. Dies ist der Koeffizient vona
.
Um beispielsweise den Koeffizienten zu berechnen, der der Basis entspricht 3
, finden wir das Produkt aller anderen Basen (dh 5*7 = 35
) und dann das erste Vielfache dieses Produkts, das einen Rest hinterlässt, 1
wenn es durch die Basis geteilt wird.
In diesem Fall 35
bleibt ein Rest von 2
geteilt durch 3
, 35*2 = 70
bleibt aber ein Rest von 1
geteilt durch 3
, so 70
ist der entsprechende Koeffizient für 3
. In ähnlicher Weise 3*7 = 21
bleibt ein Rest von 1
geteilt durch 5
und 3*5 = 15
ein Rest von 1
geteilt durch 7
.
In einer Nussschale
Für jede Zahl a
in einer Reihe von Zahlen:
- Finden Sie das Produkt aller anderen Zahlen, bezeichnet als
P
. - Finden Sie das erste Vielfache davon
P
, das einen Rest ergibt,1
wenn durch geteilta
. Dies ist der Koeffizient vona
.
Die Herausforderung
- Die Herausforderung besteht darin, für einen Satz von zwei oder mehr Basen den Satz entsprechender Koeffizienten zu finden.
- Es ist garantiert, dass der Satz von Basen paarweise ko-primiert, und jede Basis ist garantiert größer als 1.
- Ihre Eingabe ist eine Liste von Ganzzahlen als Eingabe
[3,4,5]
oder durch Leerzeichen getrennte Zeichenfolge,"3 4 5"
oder wie auch immer Ihre Eingaben funktionieren. - Ihre Ausgabe sollte entweder eine Liste von Ganzzahlen oder eine durch Leerzeichen getrennte Zeichenfolge sein, die den Satz von Koeffizienten angibt.
Testfälle
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]
Vielen Dank an Leaky Nun für seine Hilfe beim Schreiben dieser Herausforderung. Wie immer, wenn das Problem unklar ist, lassen Sie es mich bitte wissen. Viel Glück und gutes Golfen!
Antworten:
Haskell,
615553 BytesDefiniert eine Funktion
f
, die Eingaben akzeptiert und Ausgaben als Liste von Ganzzahlen ausgibt.Zuerst durchlaufen wir alle ganzen Zahlen in der Eingabe (1). Dann nehmen wir das Produkt aller ganzen Zahlen (2) und dividieren durch n, um nur das Produkt der nicht
n
ganzen Zahlen zu erhalten, nämlichP
(3).Dann verwenden wir das Ergebnis (
P
) als Schrittwert für einen Bereich, der bei Null beginnt (4). Wir nehmen das Ergebnis[0, P, 2P, 3P, ...]
und filtern es nach Werten, für die das Ergebnis einer mod-n-Operation eins ist (5). Schließlich nehmen wir das erste Element, das dank der verzögerten Bewertung funktioniert (6).Danke an @xnor für 2 Bytes!
quelle
quot
kannst ein seindiv
undhead
kann sein!!0
.Gelee ,
117 BytesProbieren Sie es online aus! oder überprüfen Sie alle Testfälle .
Hintergrund
Sei P und a streng positiv, Coprime- Ganzzahlen.
Der zweistufige Prozess in der Frage - Finden eines Vielfachen von P , das einen Rest von 1 ergibt, wenn es durch a geteilt wird - kann durch die folgende Kongruenzgleichung beschrieben werden.
Nach dem Euler-Fermat-Theorem haben wir
wobei φ die Totientenfunktion von Euler bezeichnet . Aus diesem Ergebnis leiten wir Folgendes ab.
Da die Herausforderung erfordert, dass wir Px berechnen , beobachten wir dies
wobei Pa als Produkt aller Module berechnet werden kann.
Wie es funktioniert
quelle
J, 13 Bytes
Basierend auf der erstaunlichen Antwort von @Dennis .
Verwendungszweck
Einige Testfälle benötigen die Eingabe als erweiterte Ganzzahlen mit einem Suffix
x
.Erläuterung
Probieren Sie es hier aus.
quelle
Mathematica, 27 Bytes
quelle
Pyth , 14 Bytes
Testsuite.
Naive Implementierung des Algorithmus.
quelle
Gelee,
1413 BytesDank @ Dennis ein Byte gespeichert !
Verwendet den in der Challenge-Spezifikation beschriebenen Prozess. Die Eingabe ist eine Liste von Basen und die Ausgabe ist eine Liste von Koeffizienten.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
JavaScript (ES6), 80 Byte
Ich habe den erweiterten euklidischen Algorithmus ausprobiert, aber er benötigt 98 Bytes:
Wenn alle Werte prim sind, kann ES7 dies in 56 Bytes tun:
quelle
Python + SymPy, 71 Bytes
Dies verwendet den Algorithmus aus meiner Jelly-Antwort . E / A besteht aus Listen mit SymPy-Nummern.
quelle
Python 2,
8784 BytesEine einfache Implementierung des Algorithmus. Golfvorschläge willkommen.
quelle
Cheddar , 64 Bytes
quelle
.product
was.reduce((*))
für Arrays gilt ...GAP , 51 Bytes
GAP hat eine Funktion, mit der das motivierende Beispiel berechnet werden kann
ChineseRem([2,5,7],[2,4,0])
, die es jedoch nicht so einfach macht, die Koeffizienten zu ermitteln. Wir können den n-ten Koeffizienten erhalten, indem wir die Liste mit einer Eins an der n-ten Position und Nullen an den anderen Positionen als zweites Argument verwenden. Wir müssen also diese Listen erstellen und die Funktion auf alle anwenden:quelle
Stapel, 148 Bytes
quelle
Eigentlich 14 Bytes
Dies verwendet den Algorithmus in Dennis 'Jelly-Antwort . Eine weitere Antwort, die auf meiner Python-Antwort basiert, ist in Vorbereitung. Golfvorschläge willkommen. Probieren Sie es online aus!
Wie es funktioniert
Eine weitere Antwort basiert auf meiner Python-Antwort mit 22 Bytes. Golfvorschläge willkommen. Probieren Sie es online aus!
Wie es funktioniert
quelle