web-dev-qa-db-ja.com

階乗を計算するための高速アルゴリズム

このページ 階乗を計算するためのいくつかのアルゴリズムを説明していることがわかりました。残念ながら、説明は簡潔であり、アルゴリズムの背後にある基本原則を理解するためにソースコードの行を次々と調べたくはありません。

階乗を計算するためのこれらの(または他の高速な)アルゴリズムのより詳細な説明を誰かに教えてもらえますか?

編集:このページ 素因数分解の方法、すべての最高のパフォーマンスの階乗アルゴリズムに共通の手法について説明します。また、PythonのNiceサンプルコードも含まれています。著者は バイナリ分割の説明 にリンクし、Journal of Algorithms(「階乗の計算の複雑さについて」)の有望な記事を参照しています。 、手に入れることができれば。

23

これをチェックしてください 紙(PDFリンク) リチャード・フェイトマンによる。コードサンプルはLISPにありますが、いずれにしても、秘密の多くは、実行する必要のあるbi​​gnum(任意精度整数)計算の数を最小限に抑えることになります。

当然、bignumが必要ない/ない場合、それは簡単です。ルックアップテーブルまたは単純なループのいずれかで問題ありません。

EDIT:近似解を使用できる場合は、k = 2 ... nlog(k)を合計して、階乗の対数を直接計算できます。または由緒ある スターリング近似 を使用します。オーバーフローを回避するために、可能な限り対数を使用する必要があります。特に、スターリングの近似の素朴なアプリケーションは、必要のない多くの場所でオーバーフローします。

9
Pillsy

別の方法もあります。この方法の詳細 ここ 少しの足し算と引き算の掛け算の量を半分にします。あなたはおそらく最初の方法を示したいと思うでしょう、そしてあなたがそれを理解することができれば、示されている2番目の方法は興味深い読み物です。

5
user2035846