Golfscript, 68 67 62 61 Zeichen
[.]({[.2@{1$1$%{)}{\1$/1$}if}*;;].,*0+{+}*.2$?@@.@+\@)!}do;,(
Dies ist ein Ausdruck: Er nimmt nden Stapel an und belässt das Ergebnis auf dem Stapel. Um daraus ein Programm zu machen, das nvon 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:
ps = [], p = 2;
for (int i = 0; i < n; i++) {
if (n % p == 0) {
ps += p;
n /= p;
}
else p++;
}
Die 0+kurz vor {+}*ist der Sonderfall zu behandeln n==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 klein a. ( a==1gibt 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 von xmit Wiederholung (A001414). Omega(x)ist die Anzahl der Primfaktoren von x(A001222). Die Higley-Nachfolgerfunktion ist alsoh(x) = sopfr(x) Omega(x)
Angenommen, wir haben einen Fixpunkt, N = h(N)der ein Produkt von n=Omega(N)Primzahlen ist.
N = p_0 ... p_{n-1} = h(N) = n (p_0 + ... + p_{n-1})
Grundlegende Zahlentheorie: nteilt sich in p_0 ... p_{n-1}, so dass w=Omega(n)von diesen Primzahlen die Primfaktoren von sind n. Wlog wir nehmen sie als die letzten w. So können wir beide Seiten durch teilen nund bekommen
p_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_0bis p_{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 gegebene nkö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, wenn
2^{n-w} > 3 n - 2 w
Wenn wwir dies festhalten, können wir verschiedene Werte für die nBefriedigung auswählen w=Omega(n). Das kleinste davon nist 2^w. Beachten Sie, dass wenn 2^{n-w}mindestens 3 ist (dh wenn n-w>1, was wahr ist, wenn n>2), das Erhöhen nbei wkonstantem Halten die LHS mehr als die RHS erhöht. Beachten Sie auch, dass für w>2und unter Berücksichtigung der kleinstmöglichen ndie Ungleichung erfüllt ist und es keine Fixpunkte gibt.
Damit bleiben uns drei Fälle: w = 0und n = 1; w = 1und nist primitiv; oder w = 2und nist semi-prime.
Fall w = 0. n = 1, so Nist jede Primzahl.
Fall w = 1. Wenn n = 2dann N = 2pund wir benötigen p = p + 2, hat das keine Lösungen. Wenn n = 3dann haben wir pq = p + q + 3und zwei Lösungen, (p=2, q=5)und (p=3, q=3). Wenn n = 5dann 2^4 > 3 * 5 - 2 * 1, so gibt es keine weiteren Lösungen mit w = 1.
Fall w = 2. Wenn n = 4dann N = 4pqund wir benötigen pq = p + q + 4. Dies hat eine ganzzahlige Lösung p=2, q=6, aber keine primären Lösungen. Wenn n = 6dann 2^4 > 3 * 6 - 2 * 2, so gibt es keine weiteren Lösungen mit w = 2.
Alle Fälle sind erschöpft, daher sind die einzigen nicht primären Fixpunkte 27 und 30.
highley(1) == 1? Man hat keine Primfaktoren, also ist die resultierende Liste in 4)[1, 0]so,highley(1) == 2wie ich es sehe.