18歳のころ西山教授に叩き込まれた対数チャートがある。数直線の上に 1, 2, 3, ... 10, 20, 50, 100 と並べて、下に log10 を書く。ただそれだけ。ただそれだけなんだけど、これが染み付くと桁感覚が変わる。
覚える数は3つだけでいい。
log2≈0.301,log3≈0.477,log7≈0.845
1から10の全整数の対数がここから出る。
対数関数 — 1, 10, 100 が等間隔の世界
なぜ3つで足りるか
1から10の整数に現れる素数は 2, 3, 5, 7 の4つ。なんだけど 5=10/2 で表すことができるから、
log5=log210=1−log2
10進対数を使っている以上、5は2の補数として自動的に決まる。独立な原子は 2, 3, 7 の3つ。
残りは対数の加法性 log(ab)=loga+logb と素因数分解でぜんぶ組み立てられる。log4=2log2=0.602。log6=log2+log3=0.778。log8=3log2=0.903。log9=2log3=0.954。log1=0 と log10=1 は自明。
一般の正整数 n に対しても同じ話で、n を素因数分解して 2,3,5,7 だけで書ける数なら三原子で完全に分解できる。こういう数を7-smooth数(Hamming number)と呼ぶ。バビロニアの60進法(60=22⋅3⋅5)で扱いやすかった数と本質的に同じ集合。
丸め誤差の構造
3桁に丸めたことの代償を定量的に見る。各原子の丸め誤差を δ で定義する。
δ2=0.301−log2=0.301−0.30103…≈−3.0×10−5
δ3=0.477−log3=0.477−0.47712…≈−1.2×10−4
δ7=0.845−log7=0.845−0.84510…≈−9.8×10−5
3つとも 10−4 以下に収まっているが、δ3 と δ7 は δ2 の3〜4倍ある。δ2 だけが突出して小さい。0.301 という丸めが log2=0.30103… に対してほとんど誤差を生まないのは、ちょっとした幸運。
7-smooth数 n=2a⋅3b⋅5d⋅7c の概算誤差は、log5=1−log2 の変換を代入すると線形結合で書ける。
Δ(n)=(a−d)δ2+bδ3+cδ7
定数項 d(log10 の回数)は整数だから丸め誤差に寄与しない。Δ(n) を見れば、どの数がどれくらいずれるか推定前に見積もれる。
冪指数 k に対する誤差の線形成長
k=10 で比較すると、10δ2≈−3.0×10−4 に対して 10δ3≈−1.2×10−3、10δ7≈−9.8×10−4。δ3 と δ7 の直線が寄り添って落ちていって、δ2 だけ水平に近い。冪が10を超えるあたりから δ3、δ7 由来の誤差は小数第3位に影響し始める。
5の補数と誤差の符号
log5=1−log2 は三原子の体系で要になる等式なんだけど、誤差の振る舞いがちょっと面白い。
1−0.301=0.699 で、真値は log5=0.69897… だから、
Δ(log5)=0.699−0.69897…=+3.0×10−5
符号がプラス。δ2≈−3.0×10−5 に対して Δ(log5)=−δ2≈+3.0×10−5。補数演算で符号が反転している。
これは偶然ではなくて、log5=1−log2 の構造から必然的に出てくる。1は整数だから丸め誤差ゼロ。log2 を引くから δ2 の符号がひっくり返る。∣δ2∣ が 3×10−5 と極めて小さいので、log2 経由で log5 を出しても精度はほぼ完璧。「5は覚えなくていい」の根拠はここにある。
log 3 を4桁にする
δ3 がボトルネックなら、そこだけ精度を上げればいい。log3≈0.4771 とすると、
δ3′=0.4771−0.47712…≈−2.1×10−5
δ2 と同じオーダーまで落ちる。暗記コストはたった1桁。0.477 → 0.4771。310 の誤差が 1.2×10−3 から 2.1×10−4 に変わるから、1桁の投資で精度が約6倍になる。
log 3 の4桁化による誤差改善
全体を均一に4桁にする必要はない。δ2 はすでに十分小さいから放っておけばいい。ボトルネックだけ叩く。工業数学のセンスはこういうところに出る。ついでに log7≈0.8451 にしておけば δ7 も −9.8×10−6 に落ちるけど、そこまでやるかは好みの問題。
7-smooth数の密度
1から100までで7-smooth数は46個。約46%。半分弱の整数が三原子だけで完全にカバーできる。
ただし7-smooth数の密度は n が大きくなると急速に減少する。n までの7-smooth数の個数は O((logn)4) で、n に比べると全然増えない。1000まで広げると密度は数%に落ちる。
じゃあ非7-smooth数はお手上げかというと、そうでもない。
第4の原子: ln 2
三原子の体系を10進対数の外に拡張するために、もうひとつだけ数を覚える。
ln2≈0.693
δln2=0.693−0.69315…≈−1.5×10−4。δ3 と同程度の丸め精度。
ln2 を第4の原子として仕込むと何が起こるかというと、まず ln10 が導出できる。
ln10=log102ln2
底の変換公式そのもの。log102 は三原子のひとつだから、ln2 さえ覚えれば ln10 は割り算ひとつで出る。
ln10≈0.3010.693≈2.302
真値は 2.30259… で、誤差 −2.6×10−4。δln2 と δ2 の両方が伝播するけど、実用には十分な精度。
非7-smooth数への拡張
ln10 が手に入ると、テイラー展開で非7-smooth数を攻められるようになる。小さい ε に対して、
log10(1+ε)≈ln10ε≈2.302ε
これは log10e≈0.4343 を掛けるのと同じこと。log10e=1/ln10=log102/ln2≈0.301/0.693≈0.4343。全部4つの原子から出てくる。
手順はこう。対象の数に近い7-smooth数を見つけて、三原子で対数を出して、残りの比率を ln10 で補正する。
log11 をやってみる。11=10×1.1 と見て、
log11=1+log(1.1)≈1+2.3020.1≈1+0.0434=1.0434
真値は 1.04139… で、誤差 +2.0×10−3。1次近似だけだとちょっと荒い。ε=0.1 は「小さい」と言い張るには少し大きすぎる。
2次まで取ると精度が跳ね上がる。log(1+ε)≈(ε−ε2/2)/ln10 だから、
log(1.1)≈2.3020.1−0.005=2.3020.095≈0.04126
log11≈1.04126。真値 1.04139… に対して誤差 −1.3×10−4。三原子本体と同等の精度圏内に入った。
テイラー近似の精度 — 2次で実用十分
log13 も同じ要領でいける。13=14×(13/14) で、log14=log2+log7=0.301+0.845=1.146。ε=−1/14≈−0.071 で2次補正すると log13≈1.1139。真値 1.11394… に対して誤差 −7.6×10−5。ε が小さいほど近似は良くなる。
近い7-smooth数が見つかるかどうかが腕の見せどころで、ここは慣れの領域。
半減期と倍増時間
ln2 には対数暗算とは別の、直接的な出番がある。
RC回路の50%減衰時間は t1/2=τln2≈0.693τ。放射性崩壊の半減期は t1/2=ln2/λ≈0.693/λ。複利の倍増時間は T=ln2/r≈0.693/r。どれも指数関数 e−λt や ert が「2倍」「半分」になる点を求める問題で、答えに ln2 が現れる。
金融で有名な72の法則(倍増年数 ≈72/r%)は ln2/r の近似にすぎない。年利7%なら ln2/0.07=0.693/0.07=9.90 年。72の法則だと 72/7=10.29 年。ln2 から直接計算したほうが正確なのは当然。
底の変換
4つの原子が揃うと、任意の底への変換が自在になる。
log2x=log10x/log102。三原子で log10x を出して、0.301 で割れば2進対数。log21024=3.010/0.301=10.00。情報理論でビット数を見積もるのに使える。
lnx=log10x×ln10。三原子で log10x を出して、2.302 を掛ければ自然対数。ln100=2.000×2.302=4.605。真値 4.60517… に対して誤差 −5×10−4。微積分に接続したい場面で使える。
逆方向も同じ話で、log10x=lnx/ln10=lnx×log10e。化学や物理で自然対数が先に出てきた場合、log10e≈0.4343 を掛ければ常用対数に戻せる。
整理すると、4つの原子の体系はこうなっている。
三原子: 常用対数の基盤log2,log3,log7+第4の原子: 底の橋渡しln2
三原子が log10 の世界をカバーして、ln2 が ln と log2 への扉を開く。ln10=ln2/log2 は独立に覚える必要がない。4つの数だけで、工学で遭遇するほぼすべての対数計算が暗算の射程に入る。
暗算してみる
log360。360=23×32×5=22×32×10。
log360=2log2+2log3+1=0.602+0.954+1=2.556
真値は 2.55630…。誤差 Δ=2δ2+2δ3≈−3.0×10−4。有効数字3桁に収まっている。
log7200。7200=25×32×52=23×32×102。
log7200=3log2+2log3+2=0.903+0.954+2=3.857
真値は 3.85733…。誤差 3δ2+2δ3≈−3.3×10−4。
log170。170は非7-smooth(170=2×5×17)。近くの7-smooth数を探すと 168=23×3×7 がある。log168=3log2+log3+log7=0.903+0.477+0.845=2.225。170/168=85/84≈1.012 だから、
log170≈2.225+2.3020.012≈2.225+0.005=2.230
真値は 2.23045…。1次補正だけで誤差 −3×10−4。三原子 + 第4の原子、合計4つの暗記でここまで出る。
log計算は暗記ゲーだ。九九みたいな感じだとおもう。まぁ数学、物理学、工学で使い分ける必要があるんだけどね。