Apenas por interesse, tentei resolver um problema da categoria "Recente" do Projeto Euler ( sequência Digit Sum ). Mas não consigo pensar em uma maneira de resolver o problema com eficiência. O problema é o seguinte (na sequência de perguntas original tem duas no início, mas não altera a sequência):
A sequência da soma dos dígitos é 1,2,4,8,16,23,28,38,49 .... onde o termo da sequência é a soma dos dígitos que a precedem na sequência. Encontre o termo da sequência.
A solução ingênua não pode ser implementada porque leva muito tempo. Tentei reduzir o problema a um caso de exponenciação da matriz (que levaria um tempo ), mas não consegui criar uma recorrência tão adequada aos critérios lineares, pois a recorrência para esta sequência é bastante peculiar. Pode-se ver que a sequência é governada pela recorrência:
onde é termo da sequência é uma função que, quando recebe um número natural como entrada, retorna a soma dos dígitos do número (por exemplo, ). Minha segunda abordagem foi tentar encontrar algum padrão na sequência. Pode-se observar que os primeiros termos da sequência podem ser escritos como
a_1 = 1
a_2 = 1 + d( 1 )
a_3 = 1 + d( 1 ) + d( 1 + d( 1 ) )
a_4 = 1 + d( 1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) )
a_5 = 1 + d( 1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) ) + d( 1 + d(
1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) ) )
A partir do padrão acima, torna-se que termo da sequência pode ser gerado pelo seguinte método:
- Write é com o símbolo disso entre eles.
- Deixando o primeiro , aplique a função nos próximos termos, depois nos próximos termos, depois nos próximos termos e assim por diante.
- Em seguida, aplique o método acima recursivamente nos argumentos de cada função aplicada.
por exemplo, se n = 3, realizamos as seguintes manipulações:
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
1 + d( 1 ) + d( 1 + 1 ) + d( 1 + 1 + 1 + 1 )
1 + d( 1 ) + d( 1 + d(1) ) + d( 1 + d( 1 ) + d( 1 +d( 1 ) ) )
Pela programação dinâmica, posso gerar o termo usando o método acima no tempo , que novamente não é melhor que a solução ingênua. O ( l o g ( 2 10 15 ) )
EDIT 1
Outra coisa que pode ser observada é que . Por exemplo . Mas sou incapaz de fazer uso deste ponto. Tentei novamente encontrar uma relação de recorrência linear (para exponenciação da matriz), mas não consigo encontrá-la.d ( a 6 ) = d ( 23 ) = d ( 32 ) = 5
EDIT 2
A seguir, é apresentado o gráfico quando a sequência é plotada para um intervalo menor (os primeiros termos da sequência são plotados).
PS: Eu sei que não é aconselhável pedir soluções ao Project Euler. Mas eu só quero uma nova direção ou uma dica, pois tenho andado em círculos nos últimos dias. Se isso também é inaceitável, posso remover a pergunta, se sugerido.
You are given a106 = 31054319.
no problema original de Euler é uma dica.