Golfscript, 68 67 62 61 caratteri
[.]({[.2@{1$1$%{)}{\1$/1$}if}*;;].,*0+{+}*.2$?@@.@+\@)!}do;,(
Questa è un'espressione: prende nlo stack e lascia il risultato nello stack. Per trasformarlo in un programma che prende nda stdin e stampa il risultato su stdout, sostituisci il comando [con~
Il cuore di esso è [.2@{1$1$%{)}{\1$/1$}if}*;;](28 caratteri) che prende il numero più alto nello stack e (con un algoritmo incredibilmente inefficiente) genera un elenco dei suoi fattori primi. Pseudocodice C-style equivalente:
ps = [], p = 2;
for (int i = 0; i < n; i++) {
if (n % p == 0) {
ps += p;
n /= p;
}
else p++;
}
Il 0+poco prima {+}*è quello di gestire il caso speciale n==1, perché Golfscript non ama piegare un'operazione binaria sulla lista vuota.
Uno dei punti di fissaggio non primi è 27; Ho trovato questo senza usare il programma considerando la mappatura (p a -> a 2 p), che è un punto fisso se a == p (a-1) / 2 , e provando in piccolo a. ( a==1dà il punto fisso dei numeri primi).
La ricerca con il programma genera un secondo punto fisso: 30 = (2 + 3 + 5) * 3
Appendice: prova che esistono solo due punti fissi non primi
Notazione: sopfr(x)è la somma dei fattori primi di x, con ripetizione (A001414). Omega(x)è il numero di fattori primi di x(A001222). Quindi la funzione successore di Higley èh(x) = sopfr(x) Omega(x)
Supponiamo di avere un punto fisso N = h(N)che è un prodotto di n=Omega(N)numeri primi.
N = p_0 ... p_{n-1} = h(N) = n (p_0 + ... + p_{n-1})
Teoria dei numeri di base: si ndivide in p_0 ... p_{n-1}, quindi w=Omega(n)di quei numeri primi sono i fattori primi di n. Wlog li prenderemo per essere gli ultimi w. Quindi possiamo dividere entrambe le parti per ne ottenere
p_0 ... p_{n-w-1} = p_0 + ... + p_{n-1}
o
p_0 ... p_{n-w-1} = p_0 + ... + p_{n-w-1} + sopfr(n)
Dato che tutti i numeri primi p_0a p_{n-w-1}sono maggiori di 1, aumentando uno di essi aumenta i LHS più del destro. Quindi, per un dato momento n, possiamo elencare tutte le soluzioni candidate.
In particolare, non ci possono essere soluzioni se l'LHS è maggiore dell'RHS impostando tutti i numeri primi "liberi" su 2. Vale a dire non ci sono soluzioni se
2^{n-w} > 2 (n-w) + sopfr(n)
Poiché sopfr(n) <= n(con l'uguaglianza solo per n = 4 o n primo), possiamo rendere l'affermazione più debole che non ci sono punti fissi se
2^{n-w} > 3 n - 2 w
Tenendo wfisso possiamo selezionare diversi valori di nsoddisfacente w=Omega(n). Il più piccolo nè tale 2^w. Si noti che se 2^{n-w}è almeno 3 (cioè se n-w>1, il che è vero se n>2), aumentando ntenendo wcostante si aumenterà l'LHS più dell'RHS. Si noti inoltre che per w>2e prendendo il più piccolo possibile nla disuguaglianza è soddisfatta e non ci sono punti fissi.
Questo ci lascia con tre casi: w = 0e n = 1; w = 1ed nè primo; o w = 2ed nè semi-primo.
Caso w = 0. n = 1, quindi Nè un numero primo.
Caso w = 1. Se n = 2quindi N = 2pe richiediamo p = p + 2, che non ha soluzioni. Se n = 3poi abbiamo pq = p + q + 3e due soluzioni, (p=2, q=5)e (p=3, q=3). Se n = 5poi 2^4 > 3 * 5 - 2 * 1, quindi non ci sono ulteriori soluzioni con w = 1.
Caso w = 2. Se n = 4quindi N = 4pqe abbiamo bisogno pq = p + q + 4. Questa ha una soluzione intera p=2, q=6, ma nessuna soluzione primaria. Se n = 6poi 2^4 > 3 * 6 - 2 * 2, quindi non ci sono ulteriori soluzioni con w = 2.
Tutti i casi sono esauriti, quindi gli unici punti fissi non primi sono 27 e 30.
highley(1) == 1? Uno non ha fattori primi, quindi l'elenco risultante in 4) è[1, 0], cosìhighley(1) == 2come la vedo io.