Dopo aver recentemente rispondendo ad una domanda che coinvolge la funzione parte Ackerman di che ha coinvolto una funzione per il calcolo del tetrazione di un numero. Il che mi ha portato a riflettere se esistesse un modo più efficiente per farlo. Ho fatto alcuni test da sola, ma ho limitato principalmente per il fatto che anche un numero, ad esempio 5 ^^ 3 = 5^3125 data 5^3 è circa il 10^2, che significa 5^3125 ~ = 10^(3125 * 2/3) circa 2000 cifre.Esiste un'implementazione efficiente della tetration?
La funzione non si presta a dividere e conquistare metodi a causa della natura di come l'esponente è ottenuto, ossia:
2 ^^ 5 = 2^(2^(2^(2^2)))) = 2^(2^(2^4)) = 2^(2^16) = 2^65536 ~ = 10^(65536 * 3/10) quindi circa 20k cifre ...
La natura del problema, dal momento che inizia nella parte superiore dell'albero del potere e funziona in basso, mi sembra fattoriale. Un algoritmo di potenza veloce può essere utilizzato per eseguire l'operazione exponentiation ovviamente, ma non sono stati in grado di vedere un modo per ridurre il numero di operazioni di elevazione a potenza.
Nel caso qualcuno non è chiaro che cosa sto parlando qui è la wiki article, in sostanza, se tetrazione è:
un ^^ b = a^a^A ....^a, b volte e poi a partire l'esponenziazione nell'elemento più in alto dell'albero di potere e in giù.
L'algoritmo Attualmente sto usando sarebbe (anche se sto utilizzando una versione rubino se io in realtà voglio valori):
long int Tetration(int number, int tetrate)
{
long int product=1;
if(tetrate==0)
return product;
product=number;
while(tetrate>1)
{
product=FastPower(number,product);
tetrate--;
}
return product;
}
Ogni pensiero sarebbe apprezzato.
Penso che molto dipenda dal tipo di rappresentazione numerica di cui hai bisogno. Hai bisogno di una rappresentazione intera esatta? O è sufficiente una rappresentazione numerica approssimativa (virgola mobile)? – RBarryYoung
E 'puramente una domanda per curiosità, così sarei curioso di vedere come si potrebbe scrivere un algoritmo più efficiente con galleggianti rappresentazione in virgola. – JSchlather
ho guardato in questo, ma presto si rese conto che il problema lunghezza cifre intere (che Dave spiega qui di seguito) sarà anche affliggere l'esponente di qualsiasi emissione di funzioni tetrazione, proprio in un ricorsione meno. Fondamentalmente, la virgola mobile può gestire i prodotti di esponenziazione perché è una rappresentazione formattata LOG. IMO, per gestire in modo efficiente i prodotti di tetration, è necessario sviluppare un formato basato su superLog. Sembra difficile ma interessante, forse anche una tesi degna (maestri comunque). – RBarryYoung