Beal's Conjecture hat einen Millionen-Dollar-Preis, wenn Sie es beweisen / widerlegen.
Es heißt, wenn A, B, C, x, y und z positive ganze Zahlen mit x, y, z> 2 sind, dann haben A, B und C einen gemeinsamen Primfaktor.
Die Herausforderung besteht darin, ein Programm zu schreiben, das nach einem Gegenbeispiel sucht, um dies zu widerlegen!
Regeln
- Schreiben Sie ein Programm, das nach einem Gegenbeispiel für Beals Vermutung sucht
- Sie können eine umfassende Suche durchführen (dh alle möglichen Zahlenkombinationen, die zu dieser Form passen) oder einige Optimierungen verwenden (z. B. sind A und B symmetrisch).
- Sie müssen Ganzzahlen mit beliebiger Genauigkeit verwenden.
Anmerkungen
- Dies ist ein Beliebtheitswettbewerb, sei kreativ!
- Geschwindigkeit ist nicht notwendig, macht es aber interessanter. Optimieren!
- Ich bin auch daran interessiert, den kürzesten Code zu sehen. Du bekommst eine +1 von mir!
- Ich starte das Gewinnerprogramm auf einem Supercomputer, auf den ich Zugriff habe!
- Diese Vermutung wird als wahr angesehen, aber das heißt nicht, dass wir es nicht versuchen können!
- Peter Norvig von Google hat dieses Problem ebenfalls versucht. Sie können seine Seite als Anleitung verwenden. Er hat ein kurzes Python-Programm, das Sie als Beispiel verwenden können.
- Ein anderer Typ (der zufällig auch bei Google arbeitet) hat Norvigs Ansatz stark verbessert. Seine Seite (mit Quellcode) finden Sie hier .
- Meine SO-Frage dazu vor zwei Jahren könnte ebenfalls hilfreich sein: Fin all A ^ x in einem bestimmten Bereich .
popularity-contest
math
Austin Henley
quelle
quelle
Antworten:
Ich bin pathetisch faul (Wortspiel beabsichtigt), aber warum nicht ... scheint die Regeln zu erfüllen.
Haskell, 204
Dies gibt 1 alle Kombinationen aus, die die Gegenbeispieleigenschaft erfüllen. Ich habe das Control-Monad-Omega-Paket zum Diagonalisieren von ising 6 verwendet . Aber da jemand später eine APL-Antwort posten wird, in der all dieses Zeug in die Sprache eingebaut ist (oder nicht?), Gebe ich nicht zu viel darüber ab ...
Natürlich ist das Programm viel zu langsam (naive Erschöpfung und verknüpfte Listen als Datenstruktur), um tatsächlich ein Gegenbeispiel zu liefern, aber Haskell selbst kann tatsächlich eine anständige Leistung erzielen.
1 Da die Tupel in Listenformat druckt, das heißt in einer Zeile, müssen Sie Ihre Terminals Pufferung ausgeschaltet oder Sie werden nicht sehen , wenn ein Ergebnis kommt. Alternativ können Sie ersetzen
print
mit ,mapM_ print
so dass Sie eine neue Zeile nach jedem Ergebnis erhalten, Leeren eines leitungsgepufferten Terminals.Wenn Sie das Programm testen möchten, wechseln Sie
each[3..]
zu.each[2..]
Als Ergebnis erhalten Sie einfach alle nicht koprimen pythagoreischen Tupel.quelle
C #, keine Schleifen
OK, ich habe ein paar dieser Links überflogen, aber um ehrlich zu sein, sie waren ein bisschen langweilig. Ich bin nicht daran interessiert, das Ganze mit Hash-Tabellen und so weiter zu optimieren. Warum sollte ich brauchen? Du hast einen verdammten Supercomputer!
Verdammt, ich möchte mich nicht einmal mit Schleifen beschäftigen! Diese Lösung folgt der No-Loops-Regel .
Bitte beachten Sie, dass der Code, den ich gerade schreibe, kein guter Code ist oder die Art von Code, die ich im wirklichen Leben schreibe (falls potenzielle Arbeitgeber dies zufällig lesen). Dieser Code betont die Kürze und die Fähigkeit, in einer Erzählung zu arbeiten, und betont die richtigen Konventionen und Rituale und Schleifen und so weiter.
Um zu demonstrieren, wovon ich spreche, beginnen wir mit einer schockierenden Klasse mit öffentlichen Feldern, um die Operanden der Gleichung zu speichern:
OK, wir beginnen mit der wahrscheinlich schwierigsten Herausforderung. Wir müssen einen Weg finden, durch jede Kombination dieser Operanden zu permutieren. Es gibt zweifellos Möglichkeiten, dies effizienter zu tun, als jede Permutation zu überprüfen, aber ich kann mich nicht darum kümmern, sie herauszufinden. Und warum sollte ich Wir haben einen verdammten Supercomputer!
Hier ist der Algorithmus, den ich mir ausgedacht habe. Es ist unglaublich ineffizient und geht immer wieder dieselben Operanden durch, aber wen interessiert das? Supercomputer!
Wie geht das alles ohne Schleifen? Einfach! Implementieren Sie einfach ein
IEnumerable
und das zugehörigeIEnumerator
, um die Permutationen abzupumpen. Später werden wir LINQ verwenden, um es abzufragen.Jetzt sind wir im Geschäft! Alles, was wir tun müssen, ist eine Instanz von aufzählen
BealOperandGenerator
und ein Gegenbeispiel von Beals Vermutung zu finden.Unser nächstes großes Problem ist, dass es keinen eingebauten Weg zu geben scheint, um a
BigInteger
zur Macht von a zu erhebenBigInteger
. Es gibtBigInteger.Pow(BigInteger value, int exponent)
,BigInteger.ModPow(BigInteger value, BigInteger exponent, BigInteger modulus)
aber keine Methode, um eine Modulo-UnendlichkeitBigInteger
zur Macht einer anderen zu erhebenBigInteger
.Was für ein glänzender Nagel für ein Problem! Es sieht aus wie es gemacht wurde mit unserem zu lösenden
IEnumerable
/IEnumerator
Hammer!Jetzt haben wir eine Erweiterungsmethode
Pow
, die für a aufgerufen werdenBigInteger
kann und einenBigInteger
Exponenten und keinen Modul annimmt .OK, lass uns zurücktreten. Wie können wir feststellen, ob ein bestimmtes
BealOperands
Objekt ein Gegenbeispiel für Beals Vermutung ist? Nun, zwei Dinge müssen stimmen:Wir haben das, was wir brauchen, um die erste Bedingung zu überprüfen. Und es stellt sich heraus, dass die zweite Bedingung viel einfacher zu überprüfen ist als es sich anhört.
BigInteger
bietet eine schöneGreatestCommonDivisor
Methode, mit der wir den ganzen Albtraum, dies ohne Schleifen umzusetzen, bequem umgehen können.Wir sind also bereit, eine Methode zu schreiben, um zu überprüfen, ob a
BealOperands
ein Gegenbeispiel ist. Hier geht...Und schließlich können wir alles mit dieser ziemlich raffinierten
Main
Methode zusammenbringen:quelle
Es gibt keine Gegenbeispiele mit C ^ Z <= 1.0E27.
Ab Februar 2019 überprüfe ich C ^ Z <= 1.0E29 unter der Annahme, dass entweder der Exponent "X" und / oder "Y"> = 5 sein muss.
Die aktuelle Version dieses Programms („X“ und / oder „Y“> = 5) benötigt auf einem AMD 2920X weniger als 1 Sekunde, um alle Lösungen für C ^ Z <= 1.0E15 zu finden. (Aber alle gcd (A, B, C) sind> = 2)
Details unter http://www.durangobill.com/BealsConjecture.html
Ich kann den aktuellen Code (verwendet "C" und OpenMP) über diese Grenzen hinaus ändern, benötige jedoch mehr als 128 GB RAM, um ihn auszuführen. (Hunderte von CPUs würden auch helfen. Tausende von CPUs wären noch besser.) (Wenn Sie freien Zugang zu so etwas haben, kontaktieren Sie mich bitte.)
Meine E-Mail-Adresse befindet sich auf meiner Homepage unter http://www.durangobill.com
quelle
Die zweite Variante des Beal-Suchprogramms ist beendet. Die Ergebnisse sind:
Details unter: http://www.durangobill.com/BealsConjecture.html
Die nächsten beiden Fragen lauten: 1) Kann ein Supercomputer die Suche ausweiten? 2) Wenn ein Supercomputer die Suche erweitern könnte, wäre es praktisch?
1) Um eine der oben genannten Suchvorgänge auf 1.0E30 zu erweitern, sind 300 GB RAM pro Kern erforderlich, es sei denn, Kerne können die 300 GB gemeinsam nutzen. Für jede weitere inkrementelle Erhöhung der Exponentialleistung über 1,0E30 hinaus erhöht sich die Menge des erforderlichen Arbeitsspeichers um einen Faktor von mindestens 2,2.
2) Die Menge an Rechenleistung, die für jede weitere inkrementelle Erhöhung des Exponenten auf und über 1,0E30 benötigt wird, multipliziert die kombinierte CPU-Zeit mit etwa 3,8. Die Suche nach 1.0E29 dauerte mit 12 Kernen 2 Wochen. Die Supercomputer-Zeit ist im Allgemeinen nicht "frei", und es gibt kaum Aussichten, dass es Gegenbeispiele gibt.
Als Anhaltspunkt für die Effizienz des Codes unter durangobill.com/BealE29code.txt betrug jeder der 12 Kerne für die innere Schleife durchschnittlich 220 Millionen Schleifeniterationen pro Sekunde. (Der Durchschnitt gilt für die Dauer von zwei Wochen.) (Eine Erhöhung des RAM-Speichers über den von mir angegebenen Wert hinaus würde diese Durchschnittsgeschwindigkeit um den Faktor 2 erhöhen.)
Ich lasse Austin 1) und 2) beantworten, da er Zugang zu einem Supercomputer hat und ich nicht. (Wenn zufällig 1) und 2) ein "go" sind, kann ich den "C" -Code mit der Einschränkung angeben, dass ich mit Multithread-Anweisungen für große Supercomputer-Cluster nicht vertraut bin.)
quelle
Musste dies in 2 Kommentare setzen, um es zu passen.
Die Hauptfelder sind wie folgt zugeordnet:
(Für diese Arrays benötigen Sie 128 GB RAM.)
mit:
"Base" benötigt tatsächlich 33 Bits (
cbrt(1.0E29)
) - das zusätzliche Bit wird in "Power" (das nur 7 Bits benötigt) gestopft.Die Arrays funktionieren ähnlich wie eine Hash-Tabelle. Da sie jedoch nach PRIME1 sortiert sind und nur als Nachschlagetabellen verwendet werden, benötigen Sie die verknüpften Listen nicht, um darauf zuzugreifen. Das Ergebnis ist somit eine sehr schnelle lineare Zeitsuche, um festzustellen, ob ein Versuch A ^ X + B ^ Y = irgendein C ^ Z ist.
Somit sind Anweisungen in der innersten Schleife nur zwei Schleifen tief.
"Pragma" -Anweisungen steuern die Anzahl der verwendeten Mehrprozessorkerne (in diesem Fall 12) - alle können auf die einzelne Kopie der Arrays zugreifen.
Hier ist der "Haupt" -Code (in "C") (Ich hoffe, die Kommentare passen zur angegebenen Zeilenlänge. Wenn nicht, kopieren Sie sie heraus und fügen Sie den Code in ein Dokument mit einer längeren Zeilenlänge ein.)
quelle