高速に計算されます、


10

どちらがより高速に計算されるかまたはlog a cまたはbablogacabcb>cbabcです。b>1

比較にはどのようなアルゴリズムを使用しますか?それらの複雑さは何ですか?

例えば、又はC Bcabcab

この質問は、数学スタック交換質問へのコメントに触発されました。階乗へのスターリングの近似の目的は何ですか?。特に、mjqxxxxトーマスアンドリュース、そして私が残したコメント。


モデレーターは編集を承認することもできます。私は@MarkBoothの提案に同意し、彼が提案したようにそれを質問に組み込んだ。
アロンアフマディア2012年

コメントが目的を果たしたので、コメントを片付け(削除)してください。* 8 ')
Mark Booth

回答:


8

関連する問題については、この質問に対する私の回答を参照してください。

一般に、コンピューターは加算、減算、乗算、除算、およびビットシフトのみを実行できます。引数のために、聞かせてのは、あなたがしていることを前提としていない計算Bを特殊なケースには2のべき乗とあるBababその場合は、ビットシフトに減少し、簡単ゆえであるので、自然数です。

場合自然数であり、あなたが計算したいbは、あなたが使用することができるほか、チェーン累乗をbab。あなたの質問の他のすべてのケースは(一般的に)難しいです。

これらの関数を高精度に近似するために使用されるいくつかの高速アルゴリズムには、ブラックマジックが必要です。「黒魔術」の意味を理解するには、Martin Ankerlによるこのブログ投稿と、彼がNeural Computationでリンクしている関連論文ご覧くださいCORDICアルゴリズムも参照してください。

同様の種類のビットフリッピングトリックは、Hacker's Delightで説明されています(リンクは、本の関連Webサイトです)。

良い近似を計算する他の方法は、数値解析を使用します(近似理論に関するWikipediaの記事を参照してください))。これを行うための1つの悪い方法は、適切な微分方程式をリグし、オイラー法のような数値法を使用して積分することです(前述のように、悪い近似ですが、実行できます)。これを行うためのより良い方法は、系列近似を使用することです。テイラー級数の収束が遅すぎるため、代わりにパデ近似や他のタイプの高速収束級数近似(他の有理近似、チェビシェフ級など)を使用できます。

上記の関数を概算するために使用するアルゴリズムは、アーキテクチャ、速度要件、および精度要件によって異なります。

複雑さについて話す際の問題は、どのアルゴリズムでも、言及する関数の浮動小数点近似のみを計算するため、実行時間は、近似に要求する精度に確実に依存することです。それを考慮に入れても、計算の複雑さがパフォーマンスの最初の近似として適切であるとは思いません。あなたの入力の大きさ、すなわち(ビット単位で測定されようとしている、ビット数は、それが表現するのにかかる、B、およびCをabc)、数値入力自体の大きさに依存するのではなく、精度に依存します。実用的な目的のために、数値の数値表現の精度はそれほど大きく変化することはなく(単精度、倍精度、4倍精度)、通常は、スカラー関数の計算の複雑さの見積もりに基づいてその精度を使用することを決定しません。 。最も関連する指標は実時間であり、特別なアーキテクチャ(組み込みシステム)を使用していないか、アプリケーションが本当に高速な指数関数を必要としない限り(ブログ投稿のリンクと上記のニューラル計算のリンクを参照)、選択した言語でおそらく十分です。


4

数値アルゴリズムとパフォーマンスを理解することは、効果的な計算科学者になるための重要な前提条件であるため、これは良い質問です。同時に、提起された制約が意味のある答えを与えるのに十分な資格を与えていないので、それは悪い質問です。

3つの計算のパフォーマンスは、最終結果で必要な精度と、オペランドを表すために必要な最小精度に強く依存します。b、およびcを正の実数として修飾ますが、それらを正確に表すために必要な2進数d nの数も知る必要があります。一般的な実数のパフォーマンスに関する考慮事項を理解するには、最初にコンピューターが整数を表す方法と、浮動小数点数を使用して実数を近似する方法を理解する必要があります。abcdn

コンピュータが整数で動作する場合、必要な2進数の数は明らかに、整数の大きさのlog 2に加えて、符号を処理するための追加ビットに等しくなります。M2

log 2 | M | + 1dn=2|M|+1

たとえば、数値-8は4桁の2進数で表すことができます。パフォーマンスとスペース効率のために、最新の処理装置での整数の数値計算を担当する算術論理演算装置(ALU)は、固定サイズまでの整数の計算を処理するように設計されています。 64。ALUは、コンピューターのようなx86プロセッサーだけでなく、今日の電子社会に遍在するコンピューターアーキテクチャの基本的なビルディングブロックです。ビデオゲームコンソールに精通している場合は、サイズ(ビット単位)にちなんで名付けられたビデオゲームシステムであるニンテンドー64を覚えているかもしれません。

算術論理演算ユニットでの整数の加算、減算、乗算は非常に効率的であり、通常、計算に数サイクルしか必要としません。除算はパフォーマンスが低く、最新のプロセッサでは数十ものサイクルが必要になる場合があります。パフォーマンスは、処理装置のアーキテクチャー(および算術論理演算装置の対応する実装)とその周波数の両方に依存します。64ビットプロセッサは、通常、ビットのオペランドに対して、1〜64の範囲のxに対して同じ速度で演算を実行できることに注意してください。xx

一般的な計算では、特に科学計算では、整数計算は多くの計算にとって扱いにくく、数値の別の表現、いわゆる「浮動小数点」表現が必要です。浮動小数点数は、最新のマイクロプロセッサの動作(ビットの塊でデータを移動する)と、固定基数b(通常b = 2またはb = 10)、2つの整数、仮数(一部の円では仮数)s、および指数eを使用して数値を表します。所定数のXnbb=2b=10sex 次に、おおよそ次のように表されます。

x=sbe

私はそれが明らかでなければならないので、約言うことなども、簡単な有理数は、標準ベースの浮動小数点数として正確に表すことはできません。有効桁数に応じた桁数により、数値の精度が決まります。これは、それ自体の大きさを基準にしています。IEEE 754標準のいくつかの重要な値について指定仮数および仮数の範囲(及び対応する範囲と精度)を含む浮動小数点数は、動作するように期待されている方法のための規則の数、Dnは数値計算が内再現性であるように、ある程度の許容範囲。浮動小数点数の動作にはかなりの微妙な点がありますが、この回答では把握することはできません。良い紹介として、「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」をお勧めします13dn

過去50年間にわたって、算術浮動小数点演算を効率的に計算するためのプロセッサ機能の向上に多大な労力が費やされてきました。最新のプロセッサでは、これらの計算は1つ以上の浮動小数点ユニット(FPU)によって処理されます。これは、浮動小数点数で算術演算を実行するように設計され、通常はIEEE 754仕様の両方を処理するように設計された算術論理ユニットのより高度なバージョンです。 -bit浮動小数点数(しばしば「floats」と呼ばれる)と64ビット浮動小数点数(しばしば「doubles」と呼ばれる)。算術論理演算装置と同様に、浮動小数点演算装置は、加算、減算、乗算を数サイクルで計算できることがよくありますが、除算では通常、少し多くの演算が必要です。

ほとんどの場合、IEEE 754 64ビット浮動小数点「ダブルス」は数値計算のために十分なので、私たちがいると仮定しましょう、B、及びCは、それぞれ64ビットの倍精度として表現されている、とあなたはのパフォーマンスに興味がありますx87浮動小数点命令サブセットを使用したIntel Nehalemアーキテクチャでのスカラー演算としての3つの計算。つまり、forループまたは一連のデータでこれらの演算を計算する必要がなく、ベクトル拡張を使用したくない。命令レイテンシ情報は、Agner Fogの Intel / AMDアーキテクチャ向けの一連の優れた命令リファレンステーブルから収集されます。abc

  1. ab
  2. ログCをac
  3. c1b

1一般的なべき乗は、多くの場合、次のIDで実装されます。

ab=βalogβb

ここで、2またはeのいずれかです(この場合、私はβ = 2を使用しています)。結果の一部の精度を破棄することをいとわない場合(x87ユニットは80ビットの精度で計算を行いますが、これはabの特定の範囲の値には不十分です)、この計算はFYL2Xハードウェア命令で実行できます計算するためにT = ログイン2 B算出すると(いくつかのスケーリング助けを借りて)F2XM1ハードウェア命令2 Tを。スケーリングの処理に約20サイクルを想定します。β2eβ=2abt=alog2b2t

FYL2X + F2XM1 +〜20 = 80 + 51 +〜20 =〜151サイクル

2これは、基底アイデンティティの変更により、2つの対数と1つの除算に変換でき、正確な結果を得るために再スケーリングする必要はありません。

2 * FYL2X + FDIV = 2 * 80 +(7から27)= 167から187サイクル

[3]これは、除算の後に指数が続くのと同じであるため、[1]にFDIVを加えたもので、最大175サイクルです。


0

私が質問を言い換えることができるかどうか見てみましょう:

abloga(c)a

回答:それは、cがaに依存しているかどうか、およびaとbの比較方法(より大きい、より小さい、または等しい)に依存します。

cba

cloga(c)=ln(c)/ln(a)loga(c)abaab=ω(loga(c))

c=abloga(ab)=bbabloga(c)ab=ω(loga(c))

cababc=Θ(ab)

loga(c)c1/b

abc

cc1/bbc1/b=o(loga(c))

c=abloga(c)=ac1/b=aloga(c)=Θ(c1/b)

cababc

c1/bab

cc1/babc1/b=o(ab)

c=abc1/b=ab>1abc1/b

abc


コメントをスタイルとコンテンツの2つの部分に分割します。文体的に、あなたはあなたの投稿に方程式を含めたことを感謝します。それらが適切にレンダリングされるように、MathJaxを使用するように再フォーマットしてください(たとえば、投稿された質問のように)。MathJaxを利用するには、方程式を書くときにLaTeX表記を使用します。LaTeXで数学を書くための入門書については、Wikibooksのこのガイド、またはAmerican Mathematical Societyによるこの短いガイドを参照してください。
Geoff Oxberry、2013年

ablogca
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.