Die Herausforderung besteht darin, den schnellstmöglichen Code für die Berechnung der Permanenz einer Matrix zu schreiben .
Die Permanenz einer n
-by- n
Matrix A
= ( a
i,j
) ist definiert als
Hier wird S_n
die Menge aller Permutationen von dargestellt [1, n]
.
Als Beispiel (aus dem Wiki):
In dieser Frage sind Matrizen alle quadratisch und haben nur die Werte -1
und 1
in ihnen.
Beispiele
Eingang:
[[ 1 -1 -1 1]
[-1 -1 -1 1]
[-1 1 -1 1]
[ 1 -1 -1 1]]
Permanent:
-4
Eingang:
[[-1 -1 -1 -1]
[-1 1 -1 -1]
[ 1 -1 -1 -1]
[ 1 -1 1 -1]]
Permanent:
0
Eingang:
[[ 1 -1 1 -1 -1 -1 -1 -1]
[-1 -1 1 1 -1 1 1 -1]
[ 1 -1 -1 -1 -1 1 1 1]
[-1 -1 -1 1 -1 1 1 1]
[ 1 -1 -1 1 1 1 1 -1]
[-1 1 -1 1 -1 1 1 -1]
[ 1 -1 1 -1 1 -1 1 -1]
[-1 -1 1 -1 1 1 1 1]]
Permanent:
192
Eingang:
[[1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1],
[1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
[-1, -1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
[-1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1],
[1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1],
[1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1],
[1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1],
[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1],
[1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1],
[1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],
[-1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1],
[1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1],
[-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]
Permanent:
1021509632
Die Aufgabe
Sie sollten Code schreiben, der bei einer n
durch n
Matrix seine bleibende Zahl ausgibt.
Da ich Ihren Code testen muss, wäre es hilfreich, wenn Sie mir eine einfache Möglichkeit geben könnten, eine Matrix als Eingabe für Ihren Code zu verwenden, z. B. durch Einlesen von standard in.
Seien Sie gewarnt, dass die bleibende Zahl groß sein kann (die All-1s-Matrix ist der Extremfall).
Partituren und Krawatten
Ich werde Ihren Code auf zufälligen + -1 Matrizen mit zunehmender Größe testen und stoppen, wenn Ihr Code zum ersten Mal länger als 1 Minute auf meinem Computer dauert. Die Bewertungsmatrizen werden für alle Einreichungen konsistent sein, um die Fairness zu gewährleisten.
Wenn zwei Personen die gleiche Punktzahl erzielen, ist der Gewinner derjenige, der für diesen Wert von am schnellsten ist n
. Wenn diese innerhalb einer Sekunde voneinander entfernt sind, ist dies die zuerst veröffentlichte.
Sprachen und Bibliotheken
Sie können jede verfügbare Sprache und Bibliothek verwenden, die Sie möchten, aber keine bereits vorhandene Funktion, um die permanente zu berechnen. Wo immer möglich, wäre es gut, wenn Sie Ihren Code ausführen könnten. Fügen Sie daher bitte eine vollständige Erklärung dazu bei, wie Sie Ihren Code unter Linux ausführen / kompilieren, wenn dies überhaupt möglich ist. "
Referenzimplementierungen
Es gibt bereits eine Codegolf-Frage mit viel Code in verschiedenen Sprachen zur Berechnung der Permanenz für kleine Matrizen. Mathematica und Maple haben auch permanente Implementierungen, wenn Sie auf diese zugreifen können.
Mein Computer Die Timings werden auf meinem 64-Bit-Computer ausgeführt. Dies ist eine Ubuntu-Standardinstallation mit 8 GB RAM, AMD FX-8350 Eight-Core-Prozessor und Radeon HD 4250. Dies bedeutet auch, dass ich in der Lage sein muss, Ihren Code auszuführen.
Niedrige Informationen zu meiner Maschine
cat /proc/cpuinfo/|grep flags
gibt
Fahnen: FPU vme de pse tsc msr PAE mce CX8 APIC September mtrr PGE mca cmov pat PSE36 CLFLUSH MMX fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm CONSTANT_TSC rep_good NOPlat NONSTOP_TSC extd_apicid aperfmperf pni pclmulqdq überwachen SSSE3 fma CX16 sse4_1 sse4_2 popcnt aes XSAVE AVX f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch
Ich werde eine eng verwandte mehrsprachige Folgefrage stellen, die nicht unter dem großen Int-Problem leidet, damit Liebhaber von Scala , Nim , Julia , Rust und Bash auch ihre Sprachen zur Schau stellen können.
Bestenliste
- n = 33 (45 Sekunden. 64 Sekunden für n = 34). Ton Hospel in C ++ mit g ++ 5.4.0.
- n = 32 (32 Sekunden). Dennis in C mit gcc 5.4.0 unter Verwendung der gcc-Flags von Ton Hospel.
- n = 31 (54 Sekunden). Christian Sievers in Haskell
- n = 31 (60 Sekunden). primo in rpython
- n = 30 (26 Sekunden). Ezrast in Rust
- n = 28 (49 Sekunden). xnor mit Python + pypy 5.4.1
- n = 22 (25 Sekunden). Shebang mit Python + Pypy 5.4.1
Hinweis . In der Praxis variieren die Timings für Dennis und Ton Hospel aus mysteriösen Gründen stark. Zum Beispiel scheinen sie schneller zu sein, nachdem ich einen Webbrowser geladen habe! Die angegebenen Zeiten sind die schnellsten in allen Tests, die ich gemacht habe.