Golfscript, 68 67 62 61 caracteres
[.]({[.2@{1$1$%{)}{\1$/1$}if}*;;].,*0+{+}*.2$?@@.@+\@)!}do;,(
Esta es una expresión: toma nla pila y deja el resultado en la pila. Para convertirlo en un programa que tome nde stdin e imprima el resultado en stdout, reemplace el encabezado [con~
El corazón de esto es [.2@{1$1$%{)}{\1$/1$}if}*;;](28 caracteres) que toma el número superior en la pila y (mediante un algoritmo increíblemente ineficiente) genera una lista de sus factores primos. Pseudocódigo de estilo C equivalente:
ps = [], p = 2;
for (int i = 0; i < n; i++) {
if (n % p == 0) {
ps += p;
n /= p;
}
else p++;
}
Lo 0+justo antes {+}*es manejar el caso especial n==1, porque a Golfscript no le gusta doblar una operación binaria sobre la lista vacía.
Uno de los puntos de fijación no primos es 27; Encontré esto sin usar el programa al considerar el mapeo (p a -> a 2 p), que es un punto de referencia si a == p (a-1) / 2 , y probar pequeño a. ( a==1da la fijación de primos).
Al buscar con el programa aparece un segundo punto fijo: 30 = (2 + 3 + 5) * 3
Apéndice: prueba de que solo hay dos puntos de fijación no primos
Notación: sopfr(x)es la suma de factores primos de x, con repetición (A001414). Omega(x)es el número de factores primos de x(A001222). Entonces la función sucesora de Higley esh(x) = sopfr(x) Omega(x)
Supongamos que tenemos un punto fijo N = h(N)que es un producto de n=Omega(N)primos.
N = p_0 ... p_{n-1} = h(N) = n (p_0 + ... + p_{n-1})
Teoría básica de números: se ndivide en p_0 ... p_{n-1}, por lo que w=Omega(n)esos primos son los factores primos de n. Wlog los llevaremos a ser los últimos w. Entonces podemos dividir ambos lados entre ny obtener
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)
Dado que todos los números primos p_0a p_{n-w-1}son mayores que 1, el aumento de cualquiera de ellos aumenta la LHS más que el RHS. Entonces, para un determinado n, podemos enumerar todas las soluciones candidatas.
En particular, no puede haber soluciones si el LHS es mayor que el RHS configurando todos los primos "libres" a 2. Es decir, no hay soluciones si
2^{n-w} > 2 (n-w) + sopfr(n)
Como sopfr(n) <= n(con igualdad solo para n = 4 o n primo), podemos hacer la afirmación más débil de que no hay puntos de fijación si
2^{n-w} > 3 n - 2 w
Manteniendo wfijo podemos seleccionar diferentes valores de nsatisfacción w=Omega(n). El más pequeño nes 2^w. Tenga en cuenta que si 2^{n-w}es al menos 3 (es decir n-w>1, si , lo cual es cierto si n>2), entonces aumentar nmientras se mantiene wconstante aumentará el LHS más que el RHS. Tenga en cuenta también que para w>2y tomando la menor cantidad posible, nse satisface la desigualdad y no hay puntos de fijación.
Eso nos deja con tres casos: w = 0 y n = 1; w = 1y nes primo; o w = 2y nes semi-prime.
Caso w = 0. n = 1, así Nes cualquier primo.
Caso w = 1. Si n = 2entonces N = 2py requerimos p = p + 2, que no tiene soluciones. Si n = 3entonces tenemos pq = p + q + 3y dos soluciones, (p=2, q=5)y(p=3, q=3) . Si es n = 5así 2^4 > 3 * 5 - 2 * 1, entonces no hay más soluciones con w = 1.
Caso w = 2. Si n = 4entonces N = 4pqy requerimos pq = p + q + 4. Esto tiene solución enterap=2, q=6 , pero no tiene soluciones principales. Si es n = 6así 2^4 > 3 * 6 - 2 * 2, entonces no hay más soluciones con w = 2.
Todos los casos están agotados, por lo que los únicos puntos de fijación no primos son 27 y 30.
highley(1) == 1? Uno no tiene factores primos, por lo que la lista resultante en 4) es[1, 0], asíhighley(1) == 2como lo veo.