Um dieses Problem anzugehen, habe ich das zuerst beobachtet
Wobei die Anzahl der (nicht unbedingt primären) Teiler von . Wenn die kleinste ganze Zahl ist, so dass , dann
Jetzt müssen wir so wählen , dass minimal ist. Die Auswahlmöglichkeiten für p sind trivial - sie sind nur die Primzahlen in aufsteigender Reihenfolge.
Mein erster Gedanke für die Wahl von war jedoch falsch. Ich dachte, Sie könnten einfach faktorisieren, die Faktoren in absteigender Reihenfolge sortieren und 1 subtrahieren. Meistens funktioniert dies einwandfrei, z. B. ist die kleinste ganze Zahl mit Teilern:
Dies ist jedoch falsch für :
16 = ( 1 + 1 ) ( 1 + 1 ) ( 1 + 1 ) ( 1 + 1 ) m = 2 1 3 1 5 1 7 1 = 210
Die richtige Antwort lautet:
m = 2 3 3 1 5 1 = 120
Es ist also klar, dass wir manchmal Faktoren zusammenführen müssen. In diesem Fall weil . Aber ich sehe nicht gerade eine saubere und direkte Zusammenführungsstrategie. Zum Beispiel könnte man denken, wir müssen immer in die Potenzen verschmelzen , aber das ist nicht wahr: 2
m = 2 96 3 1 5 1 7 1 11 1 > 2 96 3 3 5 1 7 1
Ich kann mir nicht sofort ein Beispiel vorstellen, aber mein Instinkt sagt, dass einige gierige Ansätze scheitern können, wenn sie zuerst die falschen Kräfte zusammenführen.
Gibt es eine einfache optimale Strategie, um diese Kräfte zusammenzuführen, um die richtige Antwort zu erhalten?
Nachtrag. Ein gieriger Algorithmus, der jede mögliche Zusammenführung überprüft und die beste auf Zusammenführungsbasis ausführt, schlägt bei fehl . Die Reihe der Einzelzusammenführungen lautet:
Die optimale Lösung ist jedoch:
quelle
Antworten:
Hier ist eine Lösung, basierend auf meinen obigen Kommentaren. Ich mache keine Ansprüche, das ist optimal.
Die Idee ist, , das wir als "kleinste positive ganze Zahl mit genau Teilern und verschiedenen Primfaktoren" definieren. Wir machen die einfachen Beobachtungen:T.( n , m ) n m
Und wir haben auch die Wiederholung:
Schließlich ist die Menge
Zu diesem Zweck finden Sie hier einen Python-Code, der mit allen oben angegebenen Zahlen übereinstimmt. Beachten Sie, dass es mit den Logarithmen funktioniert, um die Zahlen kleiner zu halten: Die tatsächlich gesuchte Ganzzahl ist also
round(2**smallest(n))
.quelle
powerset
for factor_list in powerset(factors)
in etwas ändert , das jeden einzelnen Teilern
genau einmal erzeugt. Auf diese Weise können Sie beispielsweise für , wenn Sie Lösungen betrachten, die genau die ersten Primzahlen als unterschiedliche Primfaktoren enthalten, nur nicht rekursiv anstelle von , was in exponentiell ist .multiplicative_partitions(24)
, welche (unter anderem) die Partitionen erzeugt[4, 3, 2]
und[6, 2, 2]
welche (nach Umkehrung der Reihenfolge, um dem kleinsten Primfaktor den höchsten Exponenten zu geben) den Lösungen bzw. . Der Algorithmus von Steve D wird die letztere Lösung niemals berücksichtigen, da er bereits festgestellt hat, dass die Unterlösung .Mögliche Kandidaten für "kleinste ganze Zahl mit n Teilern" sind die ganzen Zahlen der Form wobei a ≥ b ≥ c ... und (a + 1) (b + 1) (c + 1) ... = n.2ein⋅ 3b⋅ 5c. . .
Sie müssen also alle Möglichkeiten finden, um n als Produkt von ganzen Zahlen ≥ 2 in nicht aufsteigender Reihenfolge auszudrücken und die entsprechenden Kandidaten zu berechnen und zu überprüfen. Wenn zum Beispiel n = 16, 16 = 8 · 2 = 4 · 4 = 4 · 2 · 2 = 2 · 2 · 2 · 2 ist, sind die Möglichkeiten , , , , und das kleinste ist .27⋅ 3 23⋅ 33 23⋅ 3 ⋅ 5 2 ⋅ 3 ⋅ 5 ⋅ 7 23⋅ 3 ⋅ 5 = 120
Wenn n das Produkt zweier Primzahlen p · q, p ≥ q ist, sind die einzigen Kandidaten und , und letzterer ist immer kleiner .2p q- 1 2p - 1⋅ 3q- 1
Sie können eine Bedingung herausfinden, wenn es einen Faktor , indem Sie beispielsweise prüfen, ob für einige prime x das ist kein faktor. Im Beispiel n = 16 gibt es einen Faktor weil .2a b - 1 2a b - 1> 2a - 1⋅ xb - 1 23 23< 2 ⋅ 7
quelle