Hintergrund
Beim letzten Mal haben wir Gruppen einer bestimmten Größe gezählt , was kein einfaches Problem ist.
Dieses Mal werden nur abelsche Gruppen gezählt , dh Gruppen mit einer kommutativen Operation. Formal ist eine Gruppe (G, ∗) abelsch, wenn x ∗ y = y ∗ x für alle x, y in G ist .
Auf diese Weise wird das Problem viel einfacher, und wir werden sie effizient zählen.
Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die eine nicht negative ganze Zahl n als Eingabe akzeptiert und die Anzahl der nicht isomorphen abelschen Gruppen der Ordnung n ausgibt oder zurückgibt .
Eine Möglichkeit, die Anzahl der Gruppen zu berechnen, die wir mit A (n) bezeichnen, besteht darin, Folgendes zu beachten:
A (0) = 0
Wenn p eine Primzahl ist, ist A (p k ) gleich der Anzahl von ganzzahligen Partitionen von k . (vgl. OEIS A000041 )
Wenn n = mk und m und k Co-Primer sind, ist A (n) = A (m) A (k) .
Sie können diese oder eine andere Methode zur Berechnung von A (n) verwenden .
Testfälle
Input Output
0 0
1 1
2 1
3 1
4 2
5 1
6 1
7 1
8 3
9 2
10 1
11 1
12 2
13 1
14 1
15 1
16 5
17 1
18 2
19 1
20 2
4611686018427387904 1300156
5587736968198167552 155232
9223371994482243049 2
(entnommen aus OEIS A000688 )
Zusätzliche Regeln
Bei genügend Zeit, RAM und einer Registergröße, die die Eingabe aufnehmen kann, sollte Ihr Code (theoretisch) für beliebig große ganze Zahlen funktionieren.
Ihr Code muss für alle Ganzzahlen zwischen 0 und 2 63 - 1 funktionieren und auf meinem Computer (Intel i7-3770, 16 GiB RAM, Fedora 21) in weniger als 10 Minuten fertig sein.
Stellen Sie sicher, dass Sie Ihren Code für die letzten drei Testfälle zeitlich festgelegt haben, bevor Sie Ihre Antwort senden.
Integrierte Funktionen, die diese Aufgabe banalisieren, wie z. B. die von Mathema- tica
FiniteAbelianGroupCount
, sind nicht zulässig.Integrierte Funktionen, die die ganzzahligen Partitionen einer Zahl oder die Partitionen einer Liste zurückgeben oder zählen, sind nicht zulässig.
Es gelten die Standardregeln für Code-Golf .
quelle
Antworten:
CJam (
3938 Bytes)Online-Demo
Dies folgt der vorgeschlagenen Linie, um eine Primfaktorisierung zu finden (
mF
) und dann die Partitionen jeder Potenz zu berechnen und ihr Produkt zu nehmen.Es gibt zwei Sonderfälle für
mF
: es Faktoren0
als0^1
und1
als1^1
. Letzteres erfordert keine spezielle Behandlung: Es gibt eine abelsche Gruppe der Größe 1 und eine Partition von 1. Für Null ist jedoch ein Sonderfall erforderlich.Die Partitionszählung verwendet eine Wiederholung für
A008284(n, k)
die Anzahl der Partitionenn
ink
Teile. In OEIS ist es gegeben alsaber ich denke, es ist sinnvoller, die Summe als von
1
bis zu zu betrachtenmin(k, n-k)
.Präparation
quelle
CJam,
50494743 BytesVerwendet die eingebaute
mF
Faktorisierung von CJam und einen gespeicherten Port dieser Python-Partitionsnummernfunktion:oder ungolfed:
Wie bei der Antwort von @ RetoKoradi dauert der letzte Fall im Offline-Interpreter ungefähr 17 Sekunden, da CJam so lange braucht, um die Zahl zu faktorisieren. Daher habe ich es aus dieser Online-Testsuite herausgelassen .
Vollständige Erklärung
quelle
Mathematica,
969488 BytesIch beherrsche Mathematica nicht so gut, aber ich dachte, ich würde es versuchen. Danke an @ MartinBüttner für -6 Bytes.
Hierbei wird die Formel für die Generierungsfunktion für ganzzahlige Partitionen verwendet.
quelle
CJam, 58 Bytes
Probieren Sie es online aus
Das allerletzte Testbeispiel dauert im Online-Interpreter ewig (oder zumindest länger als ich gewartet habe), ist aber mit der Offline-Version von CJam auf meinem Laptop in 17 Sekunden abgeschlossen. Alle anderen Testbeispiele sind ziemlich augenblicklich.
Dies verwendet den CJam
mF
Operator, der die Primfaktorisierung mit Exponenten liefert. Das Ergebnis ist dann das Produkt der Partitionszählung für jeden Exponenten.Der Hauptteil des Codes berechnet die Anzahl der Partitionen. Ich habe den rekursiven Algorithmus auf der Wikipedia-Seite mit dem
j
Operator implementiert, der Rekursion mit Memoisierung unterstützt.Erläuterung:
quelle