Betrachten Sie für ein festes n die n mal n Toeplitz-Matrizen mit Einträgen, die entweder 0 oder 1 sind. Ziel ist es, die maximale Determinante über alle diese Toeplitz-Matrizen zu finden.
Aufgabe
Geben Sie für jede n
von 1 aufwärts die maximale Determinante über alle n mal n Toeplitz-Matrizen mit Einträgen von entweder 0 oder 1 aus. Es sollte eine Ausgabe geben n
, für die die maximale Determinante und eine Beispielmatrix vorhanden sein sollte, die sie erreicht.
Ergebnis
Ihre Punktzahl ist die höchste, die n
Ihr Code in 2 Minuten auf meinem Computer erreicht. Um ein wenig zu verdeutlichen, Ihr Code kann insgesamt 2 Minuten lang ausgeführt werden, das sind nicht 2 Minuten pro n
.
Kabelbinder
Wenn zwei Einträge die gleiche n
Punktzahl erzielen, ist der Gewinner derjenige, der n
in kürzester Zeit auf meinem Computer den höchsten Wert erreicht . Stimmen auch bei diesem Kriterium die beiden besten Einsendungen überein, ist der Gewinner die zuerst eingereichte Antwort.
Sprachen und Bibliotheken
Sie können jede frei verfügbare Sprache und Bibliothek verwenden, die Sie mögen. Ich muss in der Lage sein, Ihren Code auszuführen. Fügen Sie daher bitte eine vollständige Erklärung dazu bei, wie Sie Ihren Code unter Linux ausführen / kompilieren, wenn dies möglich ist.
Mein Computer Die Timings werden auf meinem Computer ausgeführt. Dies ist eine Ubuntu-Standardinstallation auf einem AMD FX-8350 Eight-Core-Prozessor. Dies bedeutet auch, dass ich in der Lage sein muss, Ihren Code auszuführen.
Kleine Antworten
Für n = 1..10 sollten die Ausgänge 1,1,2,3,5,9,32,56,125,315 sein
Diese Sequenz ist nicht in OEIS und daher kann der Gewinner auch dort einen neuen Eintrag vorschlagen.
Einträge bisher
n=10
n=11
von Vioz in Pythonn=9
von Tyilo in Cn=12
von Legendre in Jn=10
von Tensibai in Rn=14
von SteelRaven in C ++n=14
von RetoKoradi in C ++
n = 1..10
: ghostbin.com/paste/axkpaAntworten:
C ++ mit pthreads
Dies wird auf meinem Computer in knapp 1 Minute zu n = 14. Da es sich aber nur um einen 2-Core-Laptop handelt, hoffe ich, dass der 8-Core-Testcomputer n = 15 in weniger als 2 Minuten fertigstellen kann. Auf meinem Computer dauert es ungefähr 4:20 Minuten.
Ich hatte wirklich gehofft, etwas effizienteres zu finden. Es hat bekam einen Weg , um die bestimmten einer binären Matrix effizienter zu berechnen. Ich wollte eine Art dynamischen Programmieransatz entwickeln, bei dem die Terme +1 und -1 in der Determinantenberechnung berücksichtigt werden. Aber es ist einfach noch nicht so weit zusammengekommen.
Da das Kopfgeld bald abläuft, habe ich den Standard-Brute-Force-Ansatz implementiert:
Ich habe dies unter Mac OS getestet, habe aber zuvor unter Ubuntu ähnlichen Code verwendet. Ich hoffe, dass dies ohne Probleme kompiliert und ausgeführt werden kann:
.cpp
Erweiterung, zoptim.cpp
.gcc -Ofast optim.cpp -lpthread -lstdc++
.time ./a.out 14 8
. Das erste Argument ist das Maximumn
. 14 sollte sicher in weniger als 2 Minuten fertig sein, aber es wäre großartig, wenn Sie auch 15 versuchen könnten. Das zweite Argument ist die Anzahl der Threads. Die Verwendung des gleichen Werts wie die Anzahl der Kerne der Maschine ist normalerweise ein guter Anfang, aber das Ausprobieren einiger Variationen könnte möglicherweise die Zeiten verbessern.Lassen Sie mich wissen, wenn Sie Probleme beim Erstellen oder Ausführen des Codes haben.
quelle
J
Update: Verbesserter Code für die Suche nach mehr als der Hälfte der Werte. Berechnet jetzt
n=12
bequem innerhalb von 120 Sekunden (von 217 auf 60 Sekunden).Sie müssen die neueste Version von J installiert haben.
Führen Sie dies aus und töten Sie, wenn zwei Minuten vergangen sind. Meine Ergebnisse (MBP 2014 - 16 GB RAM):
Gesamtlaufzeit = 61,83 s.
Nur zum Spaß
Dies dauerte allein ungefähr 210 Sekunden.
quelle
n = 12
Benötigt ca. 18 GB Speicher.n=13
. Sie können das13
in der vorletzten Zeile ändern , um es berechnen zu lassen, was auch immer Sie wünschen.)Python 2
Dies ist eine sehr einfache Lösung und wird den Wettbewerb wahrscheinlich nicht gewinnen. Aber hey, es funktioniert!
Ich gebe einen kurzen Überblick darüber, was genau passiert.
n
. Inn=2
diesem Fall wird beispielsweise eine Arraylänge von 2 n + 1 generiert , wobei jede Zeile die Länge 2 n -1 hat. Es würde so aussehen:[[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
.n
mal und schneide die erstenn
Elemente ab, um die entsprechende Matrix zu generieren, undscipy
berechne die Determinante, wobei den Maximalwert verfolge. Am Ende drucke ich einfach das Maximum aus, inkrementiere esn
um 1 und fahre fort, bis 10 Minuten vergangen sind.Um dies auszuführen, muss scipy installiert sein.
Edit 1: Die Erstellung der ersten Zeilen wurde geändert, indem stattdessen itertools.product verwendet wurde, danke Sp3000!
Bearbeiten 2: Die Speicherung möglicher Startreihen wurde entfernt, um die Geschwindigkeit minimal zu verbessern.
Edit 3: Geändert zu
scipy
um mehr Kontrolle über die Funktionsweise zu habendet
.Hier einige Beispiele für die Ausgabe auf meinem Heimcomputer (i7-4510U, 8 GB RAM):
quelle
C ++
Bruteforce mit Verwendung von OpenMP zur Parallelisierung und einfachen Optimierung, um die Bewertung der Determinante für transponierte Matrizen zu vermeiden.
quelle
C
Kompilieren mit:
Laufen mit:
Kann die maximale Determinante
n = 1..10
in ~ 115 Sekunden auf meinem Computer ausgeben .Das Programm ermittelt gerade die Determinante jeder möglichen binären Toeplitz-Matrix der Größe
n
, jedoch wird jede Determinante von Matrizen der Größe5x5
oder kleiner unter Verwendung von Memoization zwischengespeichert.Anfangs habe ich fälschlicherweise angenommen, dass jede Submatrix einer Toeplitz-Matrix auch eine Toeplitz-Matrix sein wird, also musste ich mir nur
2^(2n-1)
Werte merken anstatt2^(n^2)
für jeden
. Ich habe das Programm erstellt, bevor ich meinen Fehler bemerkte, daher ist diese Übermittlung nur eine Korrektur des Programms.quelle
O(n!)
komplex, sodass Sie möglicherweise besser mit einem anderen Algorithmus umgehen können.O(n^3)
, glaube ich, kann jedoch schneller mit einigen interessanten Algorithmen erfolgen. Ich glaube, dass die meisten der hier verwendeten Builtins im Allgemeinen eine Variante der Zerlegung verwenden, um Determinanten durchzuführen.O(n^2)
Algorithmus wählen, wenn ich meine Antwort aktualisiere.O(n^2)
. Aber ich denke, der Engpass des Problems ist die Suche unter denO(4^n)
vielen 0-1n
nachn
Matrizen.R
Sie müssen R und die mit aufgelisteten Pakete installieren
install.packages("package_name")
Ich habe mit dieser Version weniger als 2 Minuten Zeit auf meinem Computer (ich muss es mit einer parallelen Modifikation versuchen)
Aufruf und Ausgabe:
Benchmark auf meiner Maschine:
Zur Information: Für einen Bereich von 1:11 werden 285 Sekunden benötigt.
quelle
PARI / GP, n = 11
Dies ist brachiale Gewalt, aber unter Ausnutzung
det(A^T) = det(A)
. Ich poste es nur, um zu zeigen, wie einfach es ist, Transponierungen zu überspringen. Das niedrigste Bit vonb1
enthält die obere linke Zelle, und die anderen Bits enthalten den Rest der oberen Reihe.b2
hält den Rest der linken Spalte. Wir setzen einfach durchb2 <= (b1>>1)
.In Bezug auf die Berechnung von Toeplitz-Determinanten in der
O(n^2)
Zeit: In meiner begrenzten Forschung bin ich immer wieder auf die Anforderung gestoßen, dass alle führenden Hauptminderjährigen ungleich Null sein müssen, damit die Algorithmen funktionieren, was ein Haupthindernis für diese Aufgabe darstellt. Zögern Sie nicht, mir Hinweise zu geben, wenn Sie mehr darüber wissen als ich.quelle
e_{k+1}
die vierfache Anzahl von Komponenten vorliegte_k
. Es gibt viele Auslassungen in der Zeitung. Eine invertierbare Matrix hat eine LU-Zerlegung, wenn alle führenden Hauptminderjährigen ungleich Null sind. (Beachten Sie die Nenner, z. B.a_0
- implizit wird garantiert, dass sie ungleich Null sind.) Die Eindeutigkeit ergibt sich aus L als Einheitsdreieck. Der Autor erwähnte auch nicht die numerische Stabilität. Für den Fall, dass der Link nicht mehr verfügbar ist, wird auf "Zur Berechnung der Determinanten von Toeplitz-Matrizen" von Hsuan-Chu Li (2011) verwiesen.