累乗と対数

回 2-1 分野 2 関数と対数

対数 (log) は、底を何回掛けるとその数になるかを表す数です。2 を 3 回掛けると 8 なので、log2 8 = 3 と書きます。プログラミングでは、log2 n は n を何回半分にすると 1 になるかの回数で、100 万件の並んだデータから二分探索で探すと、約 20 回で見つかります。

累乗と対数を行ったり来たりしながら、二分探索、桁数、ビット数、計算量の log を、数を数えて確かめます。

100 万件から探すのに、なぜ 20 回で足りるのか

100 万を半分にし続けると、20 回で 1 になるからです。この「何回半分にできるか」の数が、対数 (log) です。

名前の順に並んだ 100 万人の名簿から、1 人を探します。真ん中を見て、探す名前が前か後ろかを決め、残りの半分を捨てます。これを繰り返す探し方を二分探索と呼びます。1 回で 50 万人、2 回で 25 万人と減り、20 回で 1 人まで絞れます。

逆から見ると、2 を 20 回掛けた数 2^20 は 1,048,576 で、100 万を少し超えます。半分にする回数と、2 を掛ける回数は、同じ数を反対の向きから見た物です。2 を何回も掛けることを累乗、その回数を答える数を対数と呼びます。

この回では、累乗と対数を行ったり来たりしながら、二分探索の回数、数の桁数、ビット数、計算量の log を、数を数えて確かめます。

累乗と対数の関係

累乗

同じ数を何回か掛けることを累乗と呼び、2 を 3 回掛けた数を 2³ と書きます。この頁では、文の中で 2^3 とも書きます。プログラミングでよく出る 2 の累乗は、次の通りです。

k2^k出てくる場面
82561 バイトで表せる数の個数
101,024およそ 1000。キロの目安
1665,5362 バイトで表せる数の個数
201,048,576およそ 100 万。メガの目安
301,073,741,824およそ 10 億。ギガの目安
324,294,967,2964 バイトで表せる数の個数

2^10 がおよそ 1000 なので、2 を 10 回掛けるたびに、桁が 3 つ増えると見積もれます。

対数

2 を何回掛けると 8 になるかの答えは 3 です。これを log2 8 = 3 と書き、「2 を底とする 8 の対数」と読みます。

  • 底 (てい) は、掛ける数。log2 8 の 2
  • 真数 (しんすう) は、作りたい数。log2 8 の 8
  • 対数は、掛ける回数。log2 8 の答えの 3

2^3 = 8 と log2 8 = 3 は、同じ関係を 2 通りに書いた物です。累乗は回数から数を、対数は数から回数を出します。

底は 1 ではない正の数、真数は正の数と決まっています。底が 1 だと、何回掛けても 1 のままで回数が決まりません。底が正なら、何回掛けても正の数にしかならないので、真数も正の数に限ります。

基本の値と公式

どの底でも成り立つ値と公式は、次の通りです。a は底、x と y は正の数、k は数です。

書き方意味2 を底にした例
log_a 1 = 00 回掛けると 1log2 1 = 0
log_a a = 11 回掛けると alog2 2 = 1
log_a (x × y) = log_a x + log_a y掛け算は回数の足し算log2 32 = 2 + 3
log_a (x ÷ y) = log_a x − log_a y割り算は回数の引き算log2 4 = 5 − 3
log_a (x^k) = k × log_a x累乗は回数の掛け算log2 64 = 2 × 3
log_a x = log_b x ÷ log_b a底の変換log2 1000 = log10 1000 ÷ log10 2

公式が成り立つ理由は、累乗の数え方にあります。2^2 × 2^3 は、2 を 2 回掛けた数に、さらに 2 を 3 回掛けた数なので、2 を 5 回掛けた 2^5 です。掛け算が回数の足し算になるので、対数の世界では足し算になります。

底の変換を使うと、電卓や Python にある log10 や自然対数から、好きな底の対数が出せます。log2 1000 は 3 ÷ 0.30103 で、約 9.97 です。

自然対数と常用対数と、底を書かない log

よく使う底は 3 つです。

  • 常用対数 (底 10)。log10 x。10 進数の桁数と結びつく
  • 二進対数 (底 2)。log2 x。半分にする回数、ビット数と結びつく
  • 自然対数 (底 e、約 2.718)。ln x とも書く。成長や確率の式に出る

底を書かない log は、分野で意味が違います。高校の数学では底 10、大学の数学と Python の math.log(x) では底 e、計算量の O(log n) では底を気にしません。底を変えても、値は決まった数を掛けた分しか変わらないからです。log2 n は、どんな n でも log10 n の約 3.32 倍です。O 記法は係数を落とすので、底を書く意味がありません。

対数の伸び方

真数を 10 倍にするたびに、log10 は 1 ずつ増えます。真数がどれだけ大きくなっても、対数はゆっくりしか伸びません。

nlog2 n (約)log10 n
103.31
1,00010.03
1,000,00019.96
1,000,000,00029.99

10 億件でも、半分にする回数は 30 回ほどです。データが増えても手間が少ししか増えない処理が強いのは、この伸び方のためです。

動かして確かめる

1 本目は、n を半分にし続けて 1 になるまでの回数を数え、math.log2 と並べます。

動かす 半分にする回数と log2

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

8
 半分 3
 log2 3.0
1000
 半分 9
 log2 9.97
1000000
 半分 19
 log2 19.93
1000000000
 半分 29
 log2 29.9

数えた回数は、log2 n の小数を切り捨てた数です。100 万は 19 回で 1 になり、log2 は 19.93 です。二分探索では、最後に 1 件を確かめる 1 回が足されるので、20 回と数えます。

2 本目は、桁数とビット数を対数で出します。10 進の桁数は log10 n の小数を切り捨てて 1 を足した数、2 進の桁数 (ビット数) は log2 n の小数を切り捨てて 1 を足した数です。

動かす 桁数とビット数

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

9
 桁 1 1
 ビット 4 4
10
 桁 2 2
 ビット 4 4
255
 桁 3 3
 ビット 8 8
256
 桁 3 3
 ビット 9 9
65535
 桁 5 5
 ビット 16 16

式で出した数と、文字の長さ (len(str(n))) やビットの長さ (bit_length()) で数えた数がそろいました。255 は 8 ビットで、256 になると 9 ビットに増えます。1 バイトで 0 から 255 までしか表せない理由です。

3 本目は、上の表の公式を Python で確かめます。

動かす 対数の公式を確かめる

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

積 5.0
   5.0
商 2.0
   2.0
累乗 6.0
     6.0
底の変換
9.9658
9.9658

積は足し算、商は引き算、累乗は掛け算になりました。log2 1000 は、log10 で割って出しても 9.9658 で同じです。

対数の計算はどこで外れるか

小数の誤差で、桁数が 1 つずれる

math.log(x, 10) で 1000 の常用対数を出すと、ちょうど 3 になりません。

動かす 小数の誤差で切り捨てがずれる

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

2.9999999999999996
3 桁?
3.0
4 桁

math.log(1000, 10) は 2.9999999999999996 で、切り捨てると 2 になり、桁数を 3 と言ってしまいます。小数は 2 進数で正確に表せず、自然対数で割る途中で小さな誤差が入るからです。Python の公式文書も、math.log10 と math.log2 は math.log(x, 10) や math.log(x, 2) より正確なことが多い、と書いています。

整数の桁数やビット数がほしいときは、対数を使わずに len(str(n)) と n.bit_length() で数えるのが確かです。

小さな確率を掛け続けると 0 になる

機械学習では、たくさんの確率を掛け合わせた数 (尤度、ゆうど) を大きくするように学習します。確率をそのまま掛けると、小数で表せる下限を下回り、0 になってしまいます。

動かす 掛け算を対数の足し算にする

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

掛けた数 0.0
log10 の和 -400.0

0.01 を 200 回掛けた本当の値は 10^−400 ですが、小数では 0.0 になります。対数の足し算にすれば −400 と正しく持てます。掛け算を足し算に変える積の公式は、機械学習の損失 (交差エントロピー) が log を使う理由の 1 つです。

仕事とコンテストでどう使うか

対数で見積もる場面は、次の通りです。

  • 二分探索の回数。n 件なら約 log2 n 回。並べてから探す処理を選ぶ根拠になる
  • 計算量。O(log n) は二分探索、O(n log n) は速いソート。データが 1000 倍で log2 は約 10 増えるだけ
  • 木の高さ。1 つの節から 2 つに分かれる釣り合った木に n 個入れると、高さは約 log2 n
  • ビット数。n 通りを区別するには約 log2 n ビット要る。100 万通りなら 20 ビット
  • 桁数。答えが何桁になるかを log10 で先に見積もり、整数の上限 (2^63 など) を超えないかを確かめる

競技プログラミングでは、n が 10^5 なら O(n log n) は約 170 万回、O(n²) は 100 億回です。log を見積もれると、どの手順なら時間に間に合うかを、書く前に決められます。

よくある問い

log とは何の略ですか

英語の logarithm (ロガリズム) の略です。日本語では対数と訳します。

対数と指数は何が違いますか

同じ関係を反対の向きから書いた物です。2^3 = 8 の 3 が指数 (掛ける回数を肩に書いた物) で、log2 8 = 3 は、8 から 3 を出す書き方です。指数は回数から数を、対数は数から回数を出します。

Python で log を計算するには

math.log2(x) が底 2、math.log10(x) が底 10、math.log(x) が底 e (自然対数) です。ほかの底は math.log(x, 底) で出せますが、誤差が入りやすいので、底 2 と底 10 は専用の関数を使います。整数の桁数とビット数は、対数を使わずに len(str(n)) と n.bit_length() で数えます。

自然対数の e とは何ですか

約 2.71828 の数で、ネイピア数とも呼びます。利息を細かく何回も付けたときに増える倍率の上限として出てくる数で、成長や確率の式が e を底にすると簡単な形になります。プログラミングでは、Python の math.log(x) が e を底にしていることだけ覚えておけば足ります。

確認クイズ

答えだと思う選択肢を押すと、その場で正誤と理由が開きます。3 問すべてに正しく答えると、この回は修了で、石が緑に変わります (この端末のブラウザに残ります)。間違えた問いは、あとから解き直せます。

1 問目

並んだ 1000 件のデータから、二分探索で 1 件を探します。最悪で何回見れば見つかりますか。

2 問目

log2 32 の値として正しいのはどれですか。

3 問目

O(log n) の log の底について、正しいのはどれですか。

説明課題

「100 万件の並んだデータから二分探索で探すと、約 20 回で見つかるのはなぜか」を、累乗と対数の言葉を使って 3 文で説明してください。書いたら、下の模範解答を開いて比べてください。

模範解答

自分の説明を書いてから開いて、比べてください。

この回の先の一歩

データが 1000 倍になっても手間が 10 回ほどしか増えない処理を見分けられると、遅い処理の直し方の当たりが付けられます。いまの自分が転職までの道のどの段にいるかは、転職診断で確かめられます。

もっと深く

この回の続きを、ゆめさくのコースの章や道具で深められます。頁の中の確認クイズに答えたあと、手を動かす量を増やしたいときに使ってください。

一次資料

どれも 2026年10月30日に開いて、題と中身を確かめました。

次へ

次の回 2-2関数の形とオーダー一次、二次、指数、対数の伸び方準備中

分野 2 関数と対数の回

  1. 2-1累乗と対数log は何回掛けるか、何回半分にできるかこの回
  2. 2-2関数の形とオーダー一次、二次、指数、対数の伸び方準備中

分野 2 の頁へ戻るほかの分野を見る