Introdução
Considere uma sequência de números inteiros f definida da seguinte forma:
- f (2) = 2
- Se n é um primo ímpar, então f (n) = (f (n-1) + f (n + 1)) / 2
- Se n = p · q é composto, então f (n) = f (p) · f (q)
Não é muito difícil perceber que f (n) = n para cada n ≥ 2 e, portanto, calcular f não seria um desafio muito interessante. Vamos mudar a definição: reduza pela metade o primeiro caso e dobre o segundo caso. Temos uma nova sequência g definida da seguinte forma:
- g (2) = 1
- Se n é um primo ímpar, então g (n) = g (n-1) + g (n + 1)
- Se n = p · q é composto, então g (n) = g (p) · g (q)
A tarefa
Sua tarefa é pegar um número inteiro n ≥ 2 como entrada e produzir g (n) como saída. Você não precisa se preocupar com excesso de número inteiro, mas deve poder calcular g (1025) = 81 corretamente, e seu algoritmo deve teoricamente funcionar para entradas arbitrariamente grandes.
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence.
Exemplo
Afirmei acima que g (1025) = 81 , então vamos calculá-lo manualmente. A fatoração primária de 1025 fornece
1025 = 5*5*41 => g(1025) = g(5)*g(5)*g(41)
Como 41 é primo, obtemos
g(41) = g(40) + g(42)
Em seguida, calculamos as fatorações primárias de 40 e 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 esses pequenos números primos, obtemos
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
Isso significa que
g(41) = g(40) + g(42) = g(5) + g(3)*g(7) = 3 + 2*3 = 9
e
g(1025) = g(5)*g(5)*g(41) = 3*3*9 = 81
Casos de teste
Aqui estão os valores de g até 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
fonte
15, 21, 25, 29, 33, 41
, e mais um monte, mas não consigo encontrar nenhum padrão real para o porquê.)a(2*n) = a(n)
, ea(2*n+1) = a(n) + a(n+1)
vale se2*n+1
for primo. Para muitos outros números ímpares, as seqüências provavelmente concordam por coincidência.Respostas:
Haskell, 69 bytes
Exemplo de uso:
(#2) 1025
->81
O parâmetro
a
é contado até que se dividax
ou alcancex
(ou seja,x
é primo). É um byte mais curto para testara > x
e adicionar uma condição adicional (a < x
) ao teste do módulo, em vez de testara == x
, porque o primeiro se ligaa
ax+1
, o que ajuda na chamada recursiva. Comparar:fonte
Gelatina , 18 bytes
Experimente online!
Isso é basicamente apenas uma tradução direta da especificação. (Depois de pensar um pouco, suspeito que, se houver uma fórmula fechada para encontrar a sequência, seriam mais bytes do que a abordagem direta.)
Explicação
Temos duas funções recursivas mutuamente. Aqui está a função auxiliar (que calcula g (n) para primo n ):
E aqui está o programa principal, que calcula g (n) para qualquer n :
Claramente, se chamarmos o programa principal em um número primo, tudo será no-op, exceto o
Ç
, então ele retorna g (n) neste caso. O restante do programa lida com o comportamento do composto n .fonte
JavaScript (ES6), 59 bytes
Teste
Mostrar snippet de código
fonte
Python 2,
8569 bytesfonte
Gelatina , 13 bytes
Experimente online!
Como funciona
fonte
Clojure, 126 bytes
Yay! É quase o dobro do tempo que a resposta do Python!
Ungolfed e uma explicação:
fonte
(.indexOf (for [...] ...) x)
!(t 1025)
, talvez issoif
pretendesse ser:when
? Mas entãonth
da lista vazia jogaIndexOutOfBoundsException
.Mathematica, 83 bytes
Função recursiva sem nome de um argumento inteiro positivo, retornando um número inteiro. Não é tão curto assim, no final.
Tr[#0/@({#-1,#+1}/2)]
(no caso em que a entrada é primária) chama a função nos dois membros do par ordenado{(#-1)/2,(#+1)/2}
e adiciona os resultados; isso é bom, pois a função tem o mesmo valor em(#-1)/2
e#-1
, por exemplo. Da mesma forma,1##&@@#0/@Divisors@#~Part~{2,-2}
chama a função no segundo menor divisor#
e seu divisor complementar (o segundo maior divisor) e multiplica as respostas juntas.fonte
#0
a esta resposta .Clojure, 120 bytes
Usa
:when
para obter divisores den
,F
énil
se nenhum divisor for encontrado (n
é primo).fonte
Python 2 , 62 bytes
Experimente online!
fonte