二進対数 目次 コンピューターへの応用 電卓の使用法 二進対数の算出 関連項目 脚注 案内メニューOrigins and Foundations of Computing: In Cooperation with Heinz Nixdorf MuseumsForum
解析学初等数学初等関数対数数学に関する記事
英対数指数関数逆関数二進法計算機科学情報理論ISO 80000-2常用対数二進法ビット床関数アルゴリズム解析アルゴリズムデータ構造二分検索二分探索木ランダウの記号線形対数関数電卓自然対数常用対数底の変換無限級数比較判定法収束Microsoft Visual Basic
(function()var node=document.getElementById("mw-dismissablenotice-anonplace");if(node)node.outerHTML="u003Cdiv class="mw-dismissable-notice"u003Eu003Cdiv class="mw-dismissable-notice-close"u003E[u003Ca tabindex="0" role="button"u003E非表示u003C/au003E]u003C/divu003Eu003Cdiv class="mw-dismissable-notice-body"u003Eu003Cdiv id="localNotice" lang="ja" dir="ltr"u003Eu003Cpu003Eu003Ca href="https://meta.wikimedia.org/wiki/Community_health_initiative/Partial_blocks/ja" class="extiw" title="m:Community health initiative/Partial blocks/ja"u003E部分ブロックu003C/au003Eに関する方針改訂が6月1日に行われました(u003Ca href="/wiki/Wikipedia:%E4%BA%95%E6%88%B8%E7%AB%AF/subj/%E9%83%A8%E5%88%86%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E5%B0%8E%E5%85%A5%E3%81%AE%E6%98%AF%E9%9D%9E" title="Wikipedia:井戸端/subj/部分ブロック導入の是非"u003E詳細u003C/au003E)。nu003C/pu003Eu003C/divu003Eu003C/divu003Eu003C/divu003E";());
二進対数
ナビゲーションに移動
検索に移動
二進対数 (にしんたいすう、英: binary logarithm)とは、2を底とする対数 log2x のことである。これは、指数関数 x → 2x の逆関数でもある。
目次
1 コンピューターへの応用
1.1 情報理論
1.2 計算の複雑性
2 電卓の使用法
3 二進対数の算出
3.1 整数→整数
3.2 実数→実数
4 関連項目
5 脚注
コンピューターへの応用
情報理論
二進対数は二進法と密接に関係しているため、計算機科学や情報理論でしばしば使われる。この文脈において、二進対数は「lg x」と表記されることがよくある[1]。同じ関数の別の表記としてときどき(特にドイツ語で)使われるものとして「ld x」があり、これはラテン語の Logarithmus Duālis から来ている[2]。ただし、ISO 80000-2では「lg x」は log10x すなわち常用対数を示すとされており、二進対数の略記法は「lb x」である。本稿でもこれに従う。
正整数 n の二進法における桁数(すなわちビット数)は 1 + lb n の整数部分であり、以下の床関数で表される。
- ⌊lbn⌋+1 displaystyle lfloor operatorname lb ,nrfloor +1
計算の複雑性
二進対数は、アルゴリズム解析で頻出する。1より大きな数 n を2で繰り返し割っていき、その値を1以下にするために必要な繰り返し回数は、⌊lbn⌋displaystyle lfloor operatorname lb ,nrfloor で与えられる。この発想は、多くのアルゴリズムやデータ構造の分析で使用される。例えば二分検索では、検索すべき空間の大きさは操作の繰り返しごとに半分になる。ゆえに、大きさ1の問題を得るには大まかにいって lb n 回の繰り返しが必要となり、そのあとは定数時間で終了する。同様に、n 個の要素からなる完全平衡二分探索木は、1 + lb n の高さをもつ。
しかし、アルゴリズムの実行時間は通常、定数倍の差を無視してランダウの記号で表記される。ここで、1以外の任意の正の数 k に対して log2n = logk n / logk 2(底の変換)が成り立つので、O(log2n) の実行時間をもつアルゴリズムは、1より大きな任意の底、たとえば13を用いて、O(log13n) の実行時間を持つとも表現できる[3]。したがって、O(log n) や O(n log n) といった式では、対数の底がいくつであるかは本質的な問題ではない。
ただし、対数の底を指定する必要があるケースもあるので注意が必要である。例えば、所要時間 O(2lb n) の計算と、所要時間 O(2ln n) の計算とは同等ではない。前者は O(n) と等価であり、後者は O(n0.6931...) と等価である。
O(n log n) の実行時間をもつアルゴリズムは、しばしば線形対数と呼ばれる。O(log n) や O(n log n) の実行時間をもつアルゴリズムの例としては、次のようなものがある。
クイックソート(ただしこれは平均の場合であり、最悪の場合には O(n2) となる。)- 2分探索木
- マージソート
モンジュ配列の計算
電卓の使用法
log2 のボタンがない電卓で log2n を計算するための簡単な方法は、関数電卓に一般的に存在する自然対数 "ln" または常用対数 "Log" のボタンを使うことである。この場合、次のような底の変換公式を使うことになる。
- log2n = ln n / ln 2 = Log n / Log 2
従って、
- log2n = logen × 1.442695... = log10n × 3.321928...
となる。
ところでこの式は、logen + log10n が0.6%以内の差で log2n と一致する、という興味深い結果を与える。実際のところ、logen + log10n という式は、
- e1/(1+log10e)=101/(1+loge10)=2.00813 59293 46243 95422 87563 25191…displaystyle e^1/(1+log _10e)=10^1/(1+log _e10)=2.00813 59293 46243 95422 87563 25191ldots
という底を用いて、log2.0081359...n と表現される。
二進対数の算出
整数→整数
小数点以下の切り上げ・切り捨てを行って、整数→整数の二進対数を定めることができる。これら二つ(切り上げ・切り下げ)の整数二進対数の間には、
⌊log2n⌋=⌈log2(n+1)⌉−1displaystyle lfloor log _2nrfloor =lceil log _2(n+1)rceil -1 ただし、1 ≦ n
の関係がある[4]。この左辺の関数は、⌊log20⌋=−1displaystyle lfloor log _20rfloor =-1 とおくことによって、定義域を n ≧ 0 にまで拡張できる。このように拡張した関数は、非負整数 n の m ビット符号なし二進表示における先頭の0の個数 nlz(n) との間で
⌊log2n⌋=(m−1)−nlz(n)displaystyle lfloor log _2nrfloor =(m-1)-operatorname nlz (n)[4]
の関係にある。この整数二進対数は、n の最上位ビットがどこにあるかを示している。
実数→実数
一般の正の実数に対しては、二進対数は次の2段階の手順で計算できる。
- 整数部分 ⌊lbx⌋displaystyle lfloor operatorname lb ,xrfloor を計算する。
- 小数部分を計算する。
まず、整数部分の計算は簡単である。任意の正の実数 x に対して、2n ≦ x < 2n+1 となるような整数 n が唯一に定まる[5]。この各辺を 2n で割った 1 ≦ x/2n < 2 という式を立ててもよい。これをもって、二進対数の整数部分を n と定める。そして、この n を使って、小数部分を lb (x/2n) と表記することにする。すなわち、y = x/2n と置くと、次のようになる。
lb x = n + lb y ただし、1 ≦ y < 2
小数部分 lb y は、掛け算と割り算のみを使って再帰的に計算できる。この計算手順は以下のとおりとなる。
- まず、1 ≦ y < 2 から出発する。y = 1 ならば、小数部分は0となって、その時点で終了である。
y > 1 ならば、y を繰り返し2乗して、2 ≦ z < 4 なる実数 z を得る。2乗した回数を m とすると、z=y(2m)displaystyle z=y^(2^m) となる。- この式の両辺の対数をとり、式変形を行うと次のようになる。
- lbz=2mlbylby=lb z2m=1+lb(z/2)2m=2−m+2−mlb(z/2)displaystyle beginalignedoperatorname lb ,z&=2^moperatorname lb ,y\operatorname lb ,y&=operatorname lb z over 2^m\&=1+operatorname lb (z/2) over 2^m\&=2^-m+2^-moperatorname lb (z/2)endaligned
- この m の値を記録しておく。
- 2乗する作業をやめる基準は 2 ≦ z < 4 であった。したがって、1 ≦ z/2 < 2 となっている。そこであらためて y := z/2 と置き、この新しい y の二進対数を同じ手法で計算する。
そして最終的に、lb x を次のように計算する。以下、m[i] は、アルゴリズムの i 回目の繰り返しにおいて2乗の操作を行った回数とする。
- lbx=n+2−m[1](1+2−m[2](1+2−m[3](1+⋯)))=n+2−m[1]+2−m[1]−m[2]+2−m[1]−m[2]−m[3]+⋯displaystyle beginalignedoperatorname lb ,x&=n+2^-m[1]left(1+2^-m[2]left(1+2^-m[3]left(1+cdots right)right)right)\&=n+2^-m[1]+2^-m[1]-m[2]+2^-m[1]-m[2]-m[3]+cdots endaligned
ある時点で y = 1 となった場合には、この計算は当然、そこまでで終了する。逆に、永久に y = 1 とならない場合には、この式は無限級数となるが、すべての i について m[i] ≧ 1 が成り立つので、どの項もその直前の項より小さくなっている。よって、比較判定法により、この級数が必ず収束するということがわかる。
実用上は、計算に無限の時間を費やすわけにはいかないので、計算を途中で打ち切った近似値を使うことになる。級数の i 番目の項より後ろを切り捨てた場合の誤差の上限は、(1/2)m[1]+m[2]+…+m[i] である。
しかし実際には幸いなことに、このような高コストな計算も、無限級数の切り捨ても必要とせずに、
- 値を2乗する。
- 結果が2以上であれば、2で割る。
という計算を繰り返すのみで簡単に対数を得ることができる。具体的なコードを Microsoft Visual Basic で記述すると、下記のとおりとなる。(なお、この実装ではわかりやすさのために、関数の戻り値を2進表現の文字列としてある。当然ながら、その後の計算のためには、何らかの方法で数値型のデータにしなければならない。)
Function lb(ByVal y As Double, ByVal numDigits As Integer) as String
Dim result As String
result = "0."
If y < 1 Or 2 <= y Then
lb = "1≦y<2の値を渡してください。"
Exit Function
End If
While numDigits > 0
y = y * y
If 2 <= y Then
result = result & "1": y = y / 2
Else
result = result & "0"
End If
numDigits = numDigits - 1
Wend
lb = result
End Function
例として、1.65の二進対数を4ビットの精度で計算する(すなわち、上記の関数を lb(1.65, 4)
として呼び出す)ケースを考える。このプログラムを逐次追いかけていくと次のようになる。
- まず、このプログラムでは整数位の計算が既に終わっていることを前提とする(すなわち、1 ≦ y < 2 となっていることを要求する)ので、無条件で "0." の2文字を書く。
- 与えられた y = 1.65 を2乗すると2.72となる。これは2以上なので、小数1桁目として1を書く。この2.72を2で割って1.36を得る。
- 1.36を2乗すると1.85となる。これは2より小さいので、2で割ることはせず、2桁目として0を書く。
- 1.85を再度2乗すると3.43となる。これは2以上なので、3桁目として1を書く。この3.43を2で割って1.72を得る。
- 1.72を2乗すると2.95となる。これは2以上なので、4桁目として1を書く。ほしい精度は4ビットなので、これで計算終了とする。
こうして0.1011という数字列を得たので、
- lb 1.65 ≒ 0.1011(2) = 13/16
と確定させる。このとき、誤差は1/16未満となっている。さらにもう1ビット計算すれば27/32となり、誤差は1/32未満となる。一般に、m ビットの精度がほしい(すなわち、誤差を (1/2)1+m 未満としたい)ときには、2乗の計算をちょうど m 回、2で割る計算を最大 m 回行えば必要十分である。
関連項目
- 常用対数
- 自然対数
- 二進法
- 2の冪
- 2の自然対数
脚注
^ Cormen, Thomas H.; Leiserson, Charles E., Rivest, Ronald L., Stein, Clifford (2001) [1990]. Introduction to Algorithms (2nd ed.). MIT Press and McGraw-Hill. p. 34. .mw-parser-output cite.citationfont-style:inherit.mw-parser-output .citation qquotes:"""""""'""'".mw-parser-output .citation .cs1-lock-free abackground:url("//upload.wikimedia.org/wikipedia/commons/thumb/6/65/Lock-green.svg/9px-Lock-green.svg.png")no-repeat;background-position:right .1em center.mw-parser-output .citation .cs1-lock-limited a,.mw-parser-output .citation .cs1-lock-registration abackground:url("//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Lock-gray-alt-2.svg/9px-Lock-gray-alt-2.svg.png")no-repeat;background-position:right .1em center.mw-parser-output .citation .cs1-lock-subscription abackground:url("//upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Lock-red-alt-2.svg/9px-Lock-red-alt-2.svg.png")no-repeat;background-position:right .1em center.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registrationcolor:#555.mw-parser-output .cs1-subscription span,.mw-parser-output .cs1-registration spanborder-bottom:1px dotted;cursor:help.mw-parser-output .cs1-ws-icon abackground:url("//upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Wikisource-logo.svg/12px-Wikisource-logo.svg.png")no-repeat;background-position:right .1em center.mw-parser-output code.cs1-codecolor:inherit;background:inherit;border:inherit;padding:inherit.mw-parser-output .cs1-hidden-errordisplay:none;font-size:100%.mw-parser-output .cs1-visible-errorfont-size:100%.mw-parser-output .cs1-maintdisplay:none;color:#33aa33;margin-left:0.3em.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registration,.mw-parser-output .cs1-formatfont-size:95%.mw-parser-output .cs1-kern-left,.mw-parser-output .cs1-kern-wl-leftpadding-left:0.2em.mw-parser-output .cs1-kern-right,.mw-parser-output .cs1-kern-wl-rightpadding-right:0.2em
ISBN 0-262-03293-7.
^ 例えば、次を参照。Bauer, Friedrich L. (2009), Origins and Foundations of Computing: In Cooperation with Heinz Nixdorf MuseumsForum, Springer Science & Business Media, p. 54,
ISBN 9783642029929, http://books.google.com/books?id=y4uTaLiN-wQC&pg=PA54 .
^ 1より小さな底でも対数の算出自体は当然ながら可能である。しかし、そのような底を用いると n > 1 のときに log n < 0、特に、n → +∞ のときに log n → −∞ となるため、所要時間の評価用としては実用的でない。- ^ abWarren Jr., Henry S. (2002). Hacker's Delight. Addison Wesley. pp. 215.
ISBN 978-0-201-91465-8.
^ x < 1 であっても n が定まることに注意。このときの n は負の数である。
カテゴリ:
- 解析学
- 初等数学
- 初等関数
- 対数
- 数学に関する記事
(RLQ=window.RLQ||[]).push(function()mw.config.set("wgPageParseReport":"limitreport":"cputime":"0.260","walltime":"0.346","ppvisitednodes":"value":5186,"limit":1000000,"ppgeneratednodes":"value":0,"limit":1500000,"postexpandincludesize":"value":31528,"limit":2097152,"templateargumentsize":"value":7567,"limit":2097152,"expansiondepth":"value":20,"limit":40,"expensivefunctioncount":"value":2,"limit":500,"unstrip-depth":"value":1,"limit":20,"unstrip-size":"value":11631,"limit":5000000,"entityaccesscount":"value":0,"limit":400,"timingprofile":["100.00% 254.263 1 -total"," 66.57% 169.273 1 Template:Reflist"," 53.02% 134.813 3 Template:Citation/core"," 52.61% 133.766 2 Template:Cite_book"," 36.50% 92.810 3 Template:Citation/identifier"," 34.88% 88.693 3 Template:ISBN2"," 20.89% 53.120 3 Template:Catalog_lookup_link"," 10.13% 25.767 2 Template:仮リンク"," 8.25% 20.969 1 Template:Citation"," 7.18% 18.258 65 Template:Math"],"scribunto":"limitreport-timeusage":"value":"0.016","limit":"10.000","limitreport-memusage":"value":1192409,"limit":52428800,"cachereport":"origin":"mw1306","timestamp":"20190603214854","ttl":2592000,"transientcontent":false););"@context":"https://schema.org","@type":"Article","name":"u4e8cu9032u5bfeu6570","url":"https://ja.wikipedia.org/wiki/%E4%BA%8C%E9%80%B2%E5%AF%BE%E6%95%B0","sameAs":"http://www.wikidata.org/entity/Q581168","mainEntity":"http://www.wikidata.org/entity/Q581168","author":"@type":"Organization","name":"Contributors to Wikimedia projects","publisher":"@type":"Organization","name":"Wikimedia Foundation, Inc.","logo":"@type":"ImageObject","url":"https://www.wikimedia.org/static/images/wmf-hor-googpub.png","datePublished":"2013-09-01T17:22:30Z","dateModified":"2018-08-02T06:48:49Z","image":"https://upload.wikimedia.org/wikipedia/commons/5/56/Binary_logarithm_plot.png"(RLQ=window.RLQ||[]).push(function()mw.config.set("wgBackendResponseTime":112,"wgHostname":"mw1261"););