Betrachten Sie die folgende algorithmische Aufgabe:
Eingabe: eine positive ganze Zahl zusammen mit ihrer Primfaktorisierung.
Finden: positive ganze Zahlen , die minimieren , vorbehaltlich der Einschränkung, dassx , y , z x y + y z + x z x y z = n
Wie komplex ist dieses Problem? Gibt es einen Polynom-Zeit-Algorithmus? Ist es NP-schwer?
Grundsätzlich stellt sich das Problem: Von allen rechteckigen Körpern, deren Volumen und deren Dimensionen alle ganze Zahlen sind, welche hat die geringste Oberfläche?
Dieses Problem wurde von Dan Meyer unter dem Titel Das Mathematikproblem, das 1.000 Mathematiklehrer nicht lösen konnten, gestellt . Bisher hat keiner der Mathematiklehrer, mit denen er zusammengearbeitet hat, einen sinnvollen Algorithmus für dieses Problem gefunden. In seinem Kontext ist die Definition von "vernünftig" etwas ungenau, aber als Informatiker können wir eine genauere Frage zur Komplexität dieses Problems stellen.
Der naheliegende Ansatz besteht darin, alle Möglichkeiten für , dies benötigt jedoch exponentielle Zeit. Kommentatoren auf Dan Meyers Blog haben viele effiziente Kandidatenalgorithmen vorgeschlagen, die sich leider alle als falsch erwiesen haben. Martin Strauss schlägt vor, dass dieses Problem vage an 3-Partitionen erinnert , aber ich sehe keine Reduktion.
Lassen Sie mich auch einige Missverständnisse aufklären, die ich in den Kommentaren / Antworten gesehen habe:
Sie können die Anzahl der Partitionen von 3 nicht reduzieren, indem Sie einfach jede Zahl durch ihre Potenz ersetzen , da die Zielfunktionen der beiden Probleme unterschiedlich sind. Die offensichtliche Reduzierung funktioniert einfach nicht.
Es ist nicht wahr, dass die optimale Lösung darin besteht, eines von , um der nächste Teiler von zu . Ich sehe mehrere Leute, die davon ausgehen, dass dies der Fall ist, aber tatsächlich ist das nicht richtig. Dies wurde bereits im Dan Meyer-Blogpost widerlegt. Betrachten Sie zum Beispiel ; , und 4 teilt 68, so dass Sie vielleicht denken, dass mindestens eines von 4 sein sollte; das ist jedoch nicht richtig. Die optimale Lösung ist , , . Ein anderes Gegenbeispiel ist , , aber die optimale Lösung istn 3 √ n=683 √x,y,zx=2y=2z=17n=2223 √x=37 , , . (Es kann sein, dass für alle die optimale Lösung darin besteht, mindestens einen von gleich dem kleinsten Teiler von größer als oder dem größten Teiler vonz = 2x , y , z n 3 √ kleiner zu machen als - Ich habe derzeit kein Gegenbeispiel - aber wenn Sie der Meinung sind, dass diese Aussage wahr ist, müsste sie bewiesen werden. Sie können absolut nicht davon ausgehen, dass es wahr ist.)
" gleich groß machen" scheint nicht in allen Fällen die optimale Antwort zu liefern; Siehe Dan Meyers Blogpost für Gegenbeispiele. Oder zumindest für einige vernünftige Interpretationen des Ausdrucks "ungefähr gleich groß machen" gibt es Gegenbeispiele, die zeigen, dass diese Strategie tatsächlich nicht optimal ist. Wenn Sie eine Strategie dieser Art ausprobieren möchten, stellen Sie sicher, dass Sie die Behauptung genau angeben, und legen Sie dann einen sorgfältigen mathematischen Beweis vor.
Eine Laufzeit von ist kein Polynom. Damit dieses Problem in P auftritt, muss die Laufzeit in der Länge der Eingabe ein Polynom sein . Die Länge der Eingabe ist ungefähr lg n , nicht n . Der offensichtliche Brute-Force-Algorithmus kann in O ( n 3 ) oder O ( n 2 ) ausgeführt werden, aber das ist in lg n exponentiell und zählt daher als Exponentialzeit-Algorithmus. Das ist also nicht hilfreich.
Antworten:
Hier ist eine modifizierte Version eines "Choose Divisor Near Cube Root" -Algorithmus. Es muss immer noch viele Fälle brutal erzwingen, daher bin ich mir nicht sicher, wie viel eine echte Verbesserung in Bezug auf die Aufzählung aller Fälle ist. Ich habe es jedoch als Korrektur für den Algorithmus in OEIS eingereicht (der falsche Ergebnisse generiert hat), da ich der Meinung bin, dass er zumindest korrekt sein sollte.
Hier ist der Algorithmus zum Finden (s1, s2, s3) und der Oberfläche eines rechteckigen Prismas bei gegebenem Volumen n:
Dieser Algorithmus zählt einige der Tripel auf (s1, s2, s3), muss aber nur die Divisoren unter der Kubikwurzel testen. (Da nicht alle drei Teiler über der Kubikwurzel liegen können). In ähnlicher Weise muss s2 nur die Teiler von n / s1 unter der Quadratwurzel von n / s1 testen, da nicht beide Teiler über der Quadratwurzel liegen dürfen.
Ein Hinweis zu Schritt 3: Wenn die Kubikwurzel ein Divisor ist, dann ist n ein Kubik und wir können dort mit minimaler Oberfläche 6 * s1 ^ 2 aus der Box (s1, s1, s1) anhalten.
Python:
quelle
Das Problem würde natürlich mit der Faktorisierung der Komplexität zusammenhängen, wenn keine Primzerlegungen angegeben würden. Angesichts der Faktoren und der Protokollierung aller Primfaktoren scheint dieses Problem in etwa so zu sein, als würde man die Abweichung von Teilungssummen vom Mittelwert minimieren (Übung, vielleicht analytisch oder experimentell, um herauszufinden, wie genau diese intuitive Annäherung an die Problem hält).k
Hier ist dies der 3-Wege-Fall (Partitionssummen sind ). Der 2-Wege - Fall wird umfangreich untersucht worden und ist schwer NP (1 st ref). (Dieser 2-Wege - Fall ist nicht ganz dasselbe wie das bekannte NP-vollständig 2-Wege - Partition Problem , wo Partition Summen gleich sind. Hinweis gleich Partition Summen impliziert 0 Abweichung in Teilungs Summen und umgekehrt. ) Die 2 nd ref Studien 3- Art und Weise und n -Wege - Partitionierung, teilweise empirisch, wo es nicht so viel Studie als 2-Wege - Fall ist.log(x),log(y),log(z) n
Das einfachste schwierige Problem: Zahlenpartitionierung / Mertens
Multi-Way Number Partitioning / Korf
quelle
Bearbeiten
Hier ist ein informelles Argument dafür, warum es wahrscheinlich keinen schnellen Algorithmus gibt. Dieser Satz hat sich nicht geändert, aber ich habe herausgenommen, was früher hier war, weil er zu sehr wie der formale Beweis im nächsten Abschnitt aufgebaut war und die Diskussion auf ihre Fehler ablenkte, von denen ich einige selbst und einen bemerkte wovon DW mich freundlich darauf hingewiesen hat. Lassen Sie mich stattdessen versuchen, die Intuition dahinter auszudrücken.
Was passiert, wenn wir dieselben Schritte in eine andere Algebra übersetzen, z. B. Addition und Subtraktion statt Multiplikation und Division? Wir wissen (siehe Lemma unten), dass unser Algorithmus eine 3-Partition findet, deren Produkte gleich sind, falls eine existiert, oder dass keine solche 3-Partition existiert. Wenn wir also die gleichen Techniken in die additive Gruppe übersetzen könnten, könnten wir eine 3-Partition finden, deren Summen gleich sind, oder feststellen, dass keine solche Partition existiert. Mit anderen Worten, wir könnten 3-Partitionen in Polynomzeit lösen. Das ist nicht sehr plausibel.
Warum funktioniert ein solcher Algorithmus für die Multiplikation und kann nicht addiert werden? Ein möglicher Grund ist, dass jede Ganzzahl unter Multiplikation eine eindeutige Primfaktorisierung aufweist, unter Addition jedoch zyklisch ist. Eine andere ist, dass Multiplikation einen Ring mit Addition bildet, sodass Sie eine andere Menge von Operationen haben, die Sie verwenden können. Ein weiterer Grund ist, dass Sie den Algorithmus verallgemeinern müssen, um für Nicht-Primzahlen zu arbeiten. Dies hängt möglicherweise von deren Primalität ab. Der eine DW wies darauf hin, dass die spezifische Übersetzungsmethode die Größe Ihrer Eingaben exponentiell erhöhen könnte. Und vielleicht doch P = NP.
Aber wenn dies die Schlupflöcher sind, die einen schnellen Algorithmus funktionieren lassen, ist es meines Erachtens immer noch nützlich zu wissen, da dies vorschlägt, wo wir unsere Anstrengungen konzentrieren sollten. Wir sollten nach etwas suchen, das kaputt geht, wenn wir versuchen, es auf ein NP-vollständiges Problem anzuwenden. Ein Ansatz, der sich auf andere Algebren verallgemeinern würde, ist wahrscheinlich, den falschen Baum zu bellen. Ich vermute jedoch, dass die Multiplikation nicht wirklich unterschiedlich genug ist, um zu funktionieren, aber das ist nur eine Vermutung.
Lemma
Proof: We see immediately from the restrictionxyz=N that any arbitrary solution has this form.
Its weight is(am)(bm)+(am)(mab)+(bm)(mab)=abm2+m2b+m2a=(ab+1a+1b)m2 .
Letf(a,b)=ab+1a+1b . To minimize this function, we take the partial derivatives δfδa=b−1a2 and δfδb=a−1b2 . The critical point where these partial derivatives are zero comes where a=b2,b=a2 , and therefore, since a and b must be real numbers greater than 0, a=b=1 . We see from the matrix of second-order partial derivatives that this is a global minimum.
My immediate motivation to prove this was to fill in a hand wave in my proof above that, if a perfect-cube solution exists, it is optimal. However, this formula could be useful for pruning the search tree.
Assorted Thoughts
I don’t see any obvious symmetry except the interchangeability of x, y and z, which only gives us at best a constant factor of 6. We do have some speedups for the 2-partition that basically say we’d want both terms to be as close to each other as possible, but I don’t immediately see an application to this problem.
Off the top of my head, simply taking the log of all the numbers immediately reduces this to a classic 3-partition problem using addition, or equivalently, taking some number to the power of the numbers in any 3-partition addition problem turns it into a multiplication problem such as this. That implies this problem should not be any easier. We do have here the prime factorization, whereas that factorization would not be prime, but does that help us?
Graphically, the surface xyz = 0 would look like the union of the xy-, yz- and xz-planes, and for any positive n, the equation would look like y = n/xz, so each slice along a coordinate plane would be a hyperbola. We can generally say that the quantity we’re trying to minimize is lowest at the origin and grows most rapidly along the line where x = y = z. If we can search only along this manifold, we might be able to reduce to a two-dimensional problem.
quelle