Introducción
Considere una secuencia de enteros f definida como sigue:
- f (2) = 2
- Si n es un primo impar, entonces f (n) = (f (n-1) + f (n + 1)) / 2
- Si n = p · q es compuesto, entonces f (n) = f (p) · f (q)
No es muy difícil ver que f (n) = n por cada n ≥ 2 , y por lo tanto calcular f no sería un desafío muy interesante. Hagamos un giro a la definición: reducir a la mitad el primer caso y duplicar el segundo caso. Obtenemos una nueva secuencia g definida de la siguiente manera:
- g (2) = 1
- Si n es un primo impar, entonces g (n) = g (n-1) + g (n + 1)
- Si n = p · q es compuesto, entonces g (n) = g (p) · g (q)
La tarea
Su tarea es tomar un número entero n ≥ 2 como entrada y producir g (n) como salida. No tiene que preocuparse por el desbordamiento de enteros, pero debería poder calcular g (1025) = 81 correctamente, y su algoritmo debería funcionar teóricamente para entradas arbitrariamente grandes.
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana.
Ejemplo
Afirmé anteriormente que g (1025) = 81 , así que calculemos a mano. La factorización prima de 1025 da
1025 = 5*5*41 => g(1025) = g(5)*g(5)*g(41)
Como 41 es primo, obtenemos
g(41) = g(40) + g(42)
A continuación, calculamos las factorizaciones primas de 40 y 42 :
40 = 2*2*2*5 => g(40) = g(2)*g(2)*g(2)*g(5) = g(5)
42 = 2*3*7 => g(42) = g(2)*g(3)*g(7) = g(3)*g(7)
Para estos pequeños primos obtenemos
g(3) = g(2) + g(4) = 1 + 1 = 2
g(5) = g(4) + g(6) = 1 + 2 = 3
g(7) = g(6) + g(8) = 2 + 1 = 3
Esto significa que
g(41) = g(40) + g(42) = g(5) + g(3)*g(7) = 3 + 2*3 = 9
y
g(1025) = g(5)*g(5)*g(41) = 3*3*9 = 81
Casos de prueba
Aquí están los valores de g hasta 50 .
2 -> 1
3 -> 2
4 -> 1
5 -> 3
6 -> 2
7 -> 3
8 -> 1
9 -> 4
10 -> 3
11 -> 5
12 -> 2
13 -> 5
14 -> 3
15 -> 6
16 -> 1
17 -> 5
18 -> 4
19 -> 7
20 -> 3
21 -> 6
22 -> 5
23 -> 7
24 -> 2
25 -> 9
26 -> 5
27 -> 8
28 -> 3
29 -> 9
30 -> 6
31 -> 7
32 -> 1
33 -> 10
34 -> 5
35 -> 9
36 -> 4
37 -> 11
38 -> 7
39 -> 10
40 -> 3
41 -> 9
42 -> 6
43 -> 11
44 -> 5
45 -> 12
46 -> 7
47 -> 9
48 -> 2
49 -> 9
50 -> 9
fuente
15, 21, 25, 29, 33, 41
, y un montón más, pero no puedo encontrar ningún patrón real de por qué.)a(2*n) = a(n)
, y sea(2*n+1) = a(n) + a(n+1)
mantiene si2*n+1
es primo. Para muchos otros números impares, las secuencias probablemente coinciden por coincidencia.Respuestas:
Haskell, 69 bytes
Ejemplo de uso:
(#2) 1025
->81
El parámetro
a
se cuenta hasta que se dividex
o alcanzax
(x
es decir, es primo). Es un byte más corto para probara > x
y agregar una condición adicional (a < x
) a la prueba de módulo en lugar de probara == x
, porque el primero se unea
ax+1
, lo que ayuda en la llamada recursiva. Comparar:fuente
Jalea , 18 bytes
Pruébalo en línea!
Esto es básicamente una traducción directa de la especificación. (Después de pensarlo un poco, sospecho que si hay una fórmula cerrada para encontrar la secuencia, sería más bytes que el enfoque directo).
Explicación
Tenemos dos funciones recursivas mutuamente. Aquí está la función auxiliar (que calcula g (n) para primo n ):
Y aquí está el programa principal, que calcula g (n) para cualquier n :
Claramente, si llamamos al programa principal en un número primo, todo es un no-op excepto el
Ç
, por lo que devuelve g (n) en este caso. El resto del programa maneja el comportamiento para el compuesto n .fuente
JavaScript (ES6), 59 bytes
Prueba
Mostrar fragmento de código
fuente
Python 2,
8569 bytesfuente
Jalea , 13 bytes
Pruébalo en línea!
Cómo funciona
fuente
Clojure, 126 bytes
¡Hurra! ¡Es casi el doble que la respuesta de Python!
Ungolfed y una explicación:
fuente
(.indexOf (for [...] ...) x)
!(t 1025)
, ¿tal vez esoif
estaba destinado a ser:when
? Pero luegonth
de la lista vacía tiraIndexOutOfBoundsException
.Mathematica, 83 bytes
Función recursiva sin nombre de un argumento entero positivo, que devuelve un entero. No tan corto, al final.
Tr[#0/@({#-1,#+1}/2)]
(en el caso donde la entrada es primo) llama a la función en ambos miembros del par ordenado{(#-1)/2,(#+1)/2}
y agrega los resultados; Esto está bien ya que la función tiene el mismo valor en(#-1)/2
y#-1
, por ejemplo. Del mismo modo,1##&@@#0/@Divisors@#~Part~{2,-2}
llama a la función en el segundo divisor más pequeño#
y su divisor complementario (el segundo divisor más grande) y multiplica las respuestas juntas.fuente
#0
en esta respuesta .Clojure, 120 bytes
Usos
:when
para obtener divisores den
,F
esnil
si no se encuentra dicho divisor (n
es primo).fuente
Python 2 , 62 bytes
Pruébalo en línea!
fuente