następującą linię w kodzie jest realizowane n
razy dla każdego wezwania do zipf()
:
sum_prob = sum_prob + c/pow((double) i, alpha);
Szkoda, że konieczne jest, aby wywołać funkcję pow()
ponieważ wewnętrznie tej funkcji sumuje nie jedną, ale dwie serie Taylora [z uwzględnieniem pow(x, alpha) == exp(alpha*log(x))
]. Jeśli alpha
jest liczbą całkowitą, oczywiście, możesz znacznie przyspieszyć kod, zastępując pow()
prostym mnożeniem. Jeśli alpha
jest liczbą wymierną, to możesz w mniejszym stopniu przyspieszyć kod, kodując iterację Newtona-Raphsona, aby zastąpić dwie serie Taylora. Jeśli ostatni warunek jest spełniony, proszę doradzić.
Na szczęście zaznaczyłeś, że alpha
się nie zmienia. Czy nie możesz dużo przyspieszyć kodu, przygotowując tabelę o numerze pow((double) i, alpha)
, a następnie pozwalając zipf()
wyszukać numery w tabeli? W ten sposób zipf()
nie musiałby w ogóle dzwonić pod numer pow()
. Podejrzewam, że zaoszczędziłoby to dużo czasu.
Możliwe są dalsze ulepszenia. Co się stanie, jeśli uwzględnisz funkcję sumprob()
z zipf()
? Czy nie możesz przygotować jeszcze bardziej agresywnego stołu przeglądowego do korzystania z sumprob()
?
Może niektóre z tych pomysłów popchną Cię w dobrym kierunku. Zobacz, czego nie możesz z nimi zrobić.
Aktualizacja: Widzę, że twoje pytanie, które teraz zostało zmienione, może nie być w stanie wykorzystać tej odpowiedzi. Od tego momentu twoje pytanie może rozwiązać pytanie w skomplikowanej teorii zmiennych. Takie pytania często nie są łatwe, jak wiesz. Możliwe, że wystarczająco sprytny matematyk odkrył stosowną relację lub jakiś trik, taki jak technika Box-Muller dystrybucji, ale jeśli tak, to nie jestem zaznajomiony z tą techniką. Powodzenia. (To prawdopodobnie nie ma znaczenia dla ciebie, ale na wszelki wypadek późna książka N. N. Lebiediewa z 1972 r. Funkcje specjalne i ich zastosowania jest dostępna w rosyjskim tłumaczeniu na język angielski w niedrogiej wersji z miękką okładką.Jeśli naprawdę jesteś zainteresowany, naprawdęchciałeś rozwiązać ten problem, możesz przeczytać Lebiediewa dalej - ale, oczywiście, jest to desperacka miara, prawda?)
robi 'alpha' mieć inną wartość dla każdego wywołania' Zipf() ', czy też ma taką samą wartość za każdym razem dzwonisz do funkcji? – thb
Parametr alpha ma tę samą wartość za każdym razem, gdy wywołuję funkcję. –
Czy nadal interesuje Cię bardziej efektywne rozwiązanie tego problemu? – cardinal