バイナリ分割のような高速化構造が与えられた場合、Euler-Wijngaarden や sumalt などの高速化変換を並べて使用すると、どの程度うまく機能するでしょうか?
https://en.wikipedia.org/wiki/Van_Wijngaarden_transformation
sumalt 推定は、Euler の方法よりもはるかに高速であると言われています。
http://projecteuclid.org/DPubS?service=UI&version=1.0&verb=Display&handle=euclid.em/1046889587
http://cestmal.in/Books/people.zoy.org/~sam/private/jnat/プログラミング/アルゴリズム%20For%20Programmers-%20Ideas%20And%20Source%20Code.pdf (セクション 19.2)
特に、角度の余弦をできるだけ早く計算したいと考えています。
GMPY および mpmath ライブラリでうまく機能するコサインのバイナリ分割構造を以下に示します。
def fcosine_bs(terms,u,v):
u=-mpz(u)**2
v=mpz(v)**2
def bs(a, b):
if b - a == 1:
if a == 0:
Pab = Qab = mpz(1)
else:
Pab = u
Qab = (4*a-2)*a*v
Tab = Pab
else:
m = (a + b) // 2
Pam, Qam, Tam = bs(a, m)
Pmb, Qmb, Tmb = bs(m, b)
Pab = Pam * Pmb
Qab = Qam * Qmb
Tab = Qmb * Tam + Pam * Tmb
return Pab, Qab, Tab
P, Q, T = bs(0, terms)
return mpf(T)/Q
実際にゲインがある場合、Euler/Van Wijngaarden/sumalt 変換と一緒に使用すると、パフォーマンスがどのように向上するかを知りたいだけです。
私は最適でないコードを書くことを恐れているので、オプションでいくつかのメソッドの効果的な Python 実装も求めています。