Golfscript, 68 67 62 61 caracteres
[.]({[.2@{1$1$%{)}{\1$/1$}if}*;;].,*0+{+}*.2$?@@.@+\@)!}do;,(
Esta es una expresión: toma n
la pila y deja el resultado en la pila. Para convertirlo en un programa que tome n
de 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==1
da 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 n
divide 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 n
y 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_0
a 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 w
fijo podemos seleccionar diferentes valores de n
satisfacción w=Omega(n)
. El más pequeño n
es 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 n
mientras se mantiene w
constante aumentará el LHS más que el RHS. Tenga en cuenta también que para w>2
y tomando la menor cantidad posible, n
se satisface la desigualdad y no hay puntos de fijación.
Eso nos deja con tres casos: w = 0
y n = 1
; w = 1
y n
es primo; o w = 2
y n
es semi-prime.
Caso w = 0
. n = 1
, así N
es cualquier primo.
Caso w = 1
. Si n = 2
entonces N = 2p
y requerimos p = p + 2
, que no tiene soluciones. Si n = 3
entonces tenemos pq = p + q + 3
y dos soluciones, (p=2, q=5)
y(p=3, q=3)
. Si es n = 5
así 2^4 > 3 * 5 - 2 * 1
, entonces no hay más soluciones con w = 1
.
Caso w = 2
. Si n = 4
entonces N = 4pq
y requerimos pq = p + q + 4
. Esto tiene solución enterap=2, q=6
, pero no tiene soluciones principales. Si es n = 6
así 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) == 2
como lo veo.