Appena per interesse ho cercato di risolvere un problema dalla categoria "Recenti" di Project Euler ( sequenza di cifre ). Ma non sono in grado di pensare a un modo per risolvere il problema in modo efficiente. Il problema è il seguente (nella sequenza di domande originale ne ha due all'inizio, ma non cambia la sequenza):
La sequenza della somma delle cifre è 1,2,4,8,16,23,28,38,49 .... dove il termine della sequenza è la somma delle cifre che la precedono nella sequenza. Trova il termine della sequenza. 10 15 t h
La soluzione ingenua non può essere implementata perché richiede molto tempo. Ho cercato di ridurre il problema a un caso di esponenziazione della matrice (che richiederebbe tempo) ma non sono riuscito a trovare una tale ricorrenza che si adattava ai criteri lineari come la ricorrenza per questa sequenza è abbastanza strano. Si può vedere che la sequenza è governata dalla ricorrenza:
dove è termine della sequenza e è una funzione che quando viene dato un numero naturale come input restituisce la somma delle cifre del numero (es. ). Il mio secondo approccio è stato quello di cercare di trovare uno schema nella sequenza. Si può vedere che i primi termini della sequenza possono essere scritti come
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 ) ) ) )
Dal modello sopra diventa che termine della sequenza può essere generato con il seguente metodo:
- Scrivi con il simbolo di aggiunta tra di loro.
- Lasciando il primo , quindi applicare la funzione sui termini successivi, quindi sui termini 2 ^ {1} successivi, quindi sui termini 2 ^ {2} successivi e così via.
- Quindi applicare il metodo sopra ricorsivamente sugli argomenti di ciascuna funzione applicata.
ad esempio se n = 3 eseguiamo le seguenti manipolazioni:
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 ) ) )
Tramite la programmazione dinamica posso generare il termine usando il metodo sopra nel tempo , che di nuovo non è migliore della soluzione ingenua. O ( l o g ( 2 10 15 ) )
EDIT 1
Un'altra cosa che si può osservare è che . Ad esempio . Ma non sono in grado di sfruttare questo punto. Ho di nuovo provato a trovare una relazione di ricorrenza lineare (per esponenziazione di matrice), ma non riesco a trovarla.d ( a 6 ) = d ( 23 ) = d ( 32 ) = 5
MODIFICA 2
Di seguito è riportato il grafico quando la sequenza viene tracciata per un intervallo più piccolo ( vengono tracciati i primi termini della sequenza).
PS: So che non è consigliabile chiedere soluzioni al Progetto Euler. Ma voglio solo una nuova direzione o un suggerimento, poiché mi sono spostato in cerchio negli ultimi giorni. Se anche questo è inaccettabile, posso rimuovere la domanda se suggerito.
You are given a106 = 31054319.
nell'originale problema di Eulero è un suggerimento.