Erstellen Sie eine Funktion, einen Ausdruck oder ein Programm, das Folgendes ausführt:
- Nehmen Sie die Primfaktoren einer beliebigen Zahl und addieren Sie sie. Zum Beispiel sind die Primfaktoren von 28 2 2 7, summiert zu 11.
- Multiplizieren Sie das Ergebnis mit der Anzahl der Primfaktoren für die angegebene Anzahl. ZB hat 28 3 Primfaktoren, die sich zu 11 summieren. 11 * 3 ist 33.
- Wiederholen Sie den Vorgang rekursiv und speichern Sie die resultierende Liste (die mit der ursprünglichen Nummer beginnt), bis Sie eine Nummer erreichen, die bereits in der Liste enthalten ist. Halten Sie an, ohne diese endgültige Nummer hinzuzufügen, damit die Liste keine Duplikate enthält. Die Progression für 28 ist 28 33, weil 33 wieder 28 ergibt.
- Zählen Sie die Elemente in der resultierenden Liste. Im Fall von 28 lautet die Antwort 2.
Hier sind die Ergebnisse für 0<n<=10
, damit Sie Ihren Algorithmus überprüfen können.
2 1 1 10 1 11 1 9 5 10
(Wie Balpha hervorhob, higley(1)
lautet die Antwort für 2 aus der Liste 1 0. Ich hatte ursprünglich 1 aufgrund eines Fehlers in meinem ursprünglichen Algorithmus, der in J geschrieben wurde.)
Da ich ein eingebildeter SOB bin und dies bei OEIS nicht gefunden habe , nennen wir dies die "Higley-Sequenz", zumindest für die Dauer dieser Runde Code-Golf. Als zusätzlichen Bonus finden Sie die ersten beiden n
mit dem niedrigsten, higley(n)
wo n
nicht prim und ist n>1
. (Ich denke, es gibt nur zwei, aber ich kann es nicht beweisen.)
Dies ist Standard-Code-Golf, daher gewinnen wie üblich die wenigsten Tastenanschläge, aber ich bitte Sie, kluge Antworten in anderen Sprachen zu bewerten, auch wenn sie ausführlich sind.
highley(1) == 1
? Man hat keine Primfaktoren, also ist die resultierende Liste in 4)[1, 0]
so,highley(1) == 2
wie ich es sehe.Antworten:
J,
4745Es ist möglich, dass dies ohne Verwendung viel kürzer wäre
^:_
, aber mein Gehirn ist bereits ausreichend gebraten.Bearbeiten: (47-> 45) Doppelcoupon-Tag.
Verwendungszweck:
quelle
#@((~.@,((+/*#)@:q:)@{:)^:_)`2:@.(=&1)
38 Zeichen.{
,{.
und{:
alle Mittel verschiedenen Dinge, aber{-
(zum Beispiel) auf jeden Fall eine Folge von zwei Dingen ist,{
und-
.Golfscript,
68 67 6261 ZeichenDies ist ein Ausdruck: Er nimmt
n
den Stapel an und belässt das Ergebnis auf dem Stapel. Um daraus ein Programm zu machen, dasn
von stdin übernommen und das Ergebnis nach stdout gedruckt wird, ersetzen Sie das führende[
durch~
Das Herzstück ist
[.2@{1$1$%{)}{\1$/1$}if}*;;]
(28 Zeichen), das die oberste Zahl auf dem Stapel nimmt und (durch einen unglaublich ineffizienten Algorithmus) eine Liste seiner Primfaktoren generiert. Pseudocode-Äquivalent im C-Stil:Die
0+
kurz vor{+}*
ist der Sonderfall zu behandelnn==1
, weil Golfscript nicht wie eine binäre Operation über die leere Liste zu falten.Einer der nicht primären Fixpunkte ist 27; Ich fand dies, ohne das Programm zu verwenden, indem ich das Mapping (p a
->
a 2 p), das ein Fixpunkt ist, wenn a == p (a-1) / 2 ist , und versuchte es kleina
. (a==1
gibt die Fixpunktgenauigkeit von Primzahlen an).Bei der Suche mit dem Programm wird ein zweiter Fixpunkt angezeigt: 30 = (2 + 3 + 5) * 3
Anhang: Beweis, dass es nur zwei Nicht-Prim-Fixpunkte gibt
Notation:
sopfr(x)
ist die Summe der Primfaktoren vonx
mit Wiederholung (A001414).Omega(x)
ist die Anzahl der Primfaktoren vonx
(A001222). Die Higley-Nachfolgerfunktion ist alsoh(x) = sopfr(x) Omega(x)
Angenommen, wir haben einen Fixpunkt,
N = h(N)
der ein Produkt vonn=Omega(N)
Primzahlen ist.N = p_0 ... p_{n-1} = h(N) = n (p_0 + ... + p_{n-1})
Grundlegende Zahlentheorie:
n
teilt sich inp_0 ... p_{n-1}
, so dassw=Omega(n)
von diesen Primzahlen die Primfaktoren von sindn
. Wlog wir nehmen sie als die letztenw
. So können wir beide Seiten durch teilenn
und bekommenp_0 ... p_{n-w-1} = p_0 + ... + p_{n-1}
oder
p_0 ... p_{n-w-1} = p_0 + ... + p_{n-w-1} + sopfr(n)
Da alle der Primzahlen
p_0
bisp_{n-w-1}
größer als 1 sind , die Erhöhung einer von ihnen erhöht sich die LHS mehr als die RHS. Für eine gegebenen
können wir also alle Kandidatenlösungen aufzählen.Insbesondere kann es keine Lösungen geben, wenn die LHS größer als die RHS ist und alle "freien" Primzahlen auf 2 gesetzt werden. Dh es gibt keine Lösungen, wenn
2^{n-w} > 2 (n-w) + sopfr(n)
Da
sopfr(n) <= n
(mit Gleichheit nur für n = 4 oder n Primzahl) können wir die schwächere Aussage treffen, dass es keine Fixpunkte gibt, wenn2^{n-w} > 3 n - 2 w
Wenn
w
wir dies festhalten, können wir verschiedene Werte für dien
Befriedigung auswählenw=Omega(n)
. Das kleinste davonn
ist2^w
. Beachten Sie, dass wenn2^{n-w}
mindestens 3 ist (dh wennn-w>1
, was wahr ist, wennn>2
), das Erhöhenn
beiw
konstantem Halten die LHS mehr als die RHS erhöht. Beachten Sie auch, dass fürw>2
und unter Berücksichtigung der kleinstmöglichenn
die Ungleichung erfüllt ist und es keine Fixpunkte gibt.Damit bleiben uns drei Fälle:
w = 0
undn = 1
;w = 1
undn
ist primitiv; oderw = 2
undn
ist semi-prime.Fall
w = 0
.n = 1
, soN
ist jede Primzahl.Fall
w = 1
. Wennn = 2
dannN = 2p
und wir benötigenp = p + 2
, hat das keine Lösungen. Wennn = 3
dann haben wirpq = p + q + 3
und zwei Lösungen,(p=2, q=5)
und(p=3, q=3)
. Wennn = 5
dann2^4 > 3 * 5 - 2 * 1
, so gibt es keine weiteren Lösungen mitw = 1
.Fall
w = 2
. Wennn = 4
dannN = 4pq
und wir benötigenpq = p + q + 4
. Dies hat eine ganzzahlige Lösungp=2, q=6
, aber keine primären Lösungen. Wennn = 6
dann2^4 > 3 * 6 - 2 * 2
, so gibt es keine weiteren Lösungen mitw = 2
.Alle Fälle sind erschöpft, daher sind die einzigen nicht primären Fixpunkte 27 und 30.
quelle
n
vor dem Zählen erzeugt wurden , gibt esn
nach 49 eine Nicht-Primzahl, für die diese Folge nicht mit 28 endet?n
deren Grenzenhigley(n)
oben liegen. (Dies würde eine erhebliche Vereinfachung der Schleife ermöglichen - einfach dief(n)
Zeiten wiederholen und dann Duplikate verwerfen).Ruby, 92 Zeichen
Diese Lösung geht davon aus, dass Higley (1) tatsächlich 2 und nicht 1 ist (siehe Balphas Kommentar oben):
quelle
Oktave - 109 Zeichen
quelle
MATL , 19 Bytes
Probieren Sie es online aus!
quelle