Po niedawnym udzieleniu odpowiedzi na pytanie dotyczące funkcji Ackermana, której częścią jest funkcja obliczania tetracji liczby. Co skłoniło mnie do zastanowienia się, czy jest na to skuteczniejszy sposób. Zrobiłem kilka testów na własną rękę, ale jestem ograniczony głównie tym, że nawet liczba taka jak 5 ^^ 3 = 5^3125 podana 5^3 to w przybliżeniu 10^2, co oznacza 5^3125 ~ = 10^(3125 * 2/3) około 2000 cyfr.Czy istnieje skuteczna implementacja tetration?
Funkcja ta nie nadaje się do podziału i podbijać sposobów ze względu na charakter jak potęgowanie jest wykonywana, to znaczy:
2 ^^ 2^= 5 (2^(2^(2^2)))) = 2^(2^(2^4)) = 2^(2^16) = 2^65536 ~ = 10^(65536 * 3/10), czyli około 20 tys. Cyfr ...
Natura problemu, ponieważ zaczyna się na szczycie drzewa mocy i działa w dół, uderza mnie jako czynnik. Algorytm szybkiego zasilania może być oczywiście użyty do wykonania operacji potęgowania, ale nie jestem w stanie zobaczyć sposobu zmniejszenia liczby operacji potęgowania.
W przypadku gdy ktoś jest jasne, co mówię tutaj jest wiki article istocie chociaż tetracja jest:
^^ b = a^a^A ....^A, B razy, a następnie zaczynając potęgowanie w górnym elemencie drzewa mocy i praca w dół.
Algorytm obecnie używam byłoby (chociaż używam wersji rubinowy czy faktycznie chcę wartości):
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;
}
Wszelkie myśli będą mile widziane.
Myślę, że wiele zależy od tego, jakiego rodzaju reprezentacji numerycznej potrzebujesz. Czy potrzebujesz dokładnej reprezentacji całkowitej? Czy też przybliżona reprezentacja liczbowa (zmiennoprzecinkowa) jest wystarczająca? – RBarryYoung
To czysto pytanie z ciekawości, więc chciałbym zobaczyć, jak można napisać skuteczniejszy algorytm z reprezentacją zmiennoprzecinkową. – JSchlather
Spojrzałem na to, ale szybko zdałem sobie sprawę, że problem z liczbą cyfr całkowitych (który Dave wyjaśnia poniżej) będzie również nękał wykładnik dowolnego wyjścia funkcji tetracyjnej, tylko przy jednej rekursji mniej. Zasadniczo zmiennoprzecinkowe może obsługiwać produkty potęgowania, ponieważ jest to reprezentacja w formacie LOG. IMO, aby efektywnie obsługiwać produkty tetracyjne, musiałbyś opracować format oparty na superlogach. Brzmi to trudne, ale interesujące, może nawet tezę godną (w każdym razie Masters). – RBarryYoung