見出し画像

「数学の言葉で世界を見たら」をPython で見たら… Vol.4 べき乗表示

第3話「大きな数だって怖くない」

書籍の著者 大栗博司 先生


書籍「数学の言葉で世界を見たら」第3話「大きな数だって怖くない」の Python写経活動記録 です。 

書籍の「べき乗を求める試行錯誤の方法」を Python で動かしてみます。
この記事は 10 の◯◯乗に関するべき乗表示を主に取り扱っています。

では書籍を開いて数学の旅に出発です🚀


はじめに


このブログシリーズは、書籍「数学の言葉で世界を見たら」(幻冬舎)で学んだ「数学の楽しさ」を「Python 写経の形式」でご紹介いたします。

【引用表記】
この記事は、出典に記載の書籍に掲載された文章とデータを引用し、適宜、掲載文章・データを改変して書いています。
【出典】
「数学の言葉で世界を見たら」 第3刷、著者 大栗博司、幻冬舎

2 大きな数が出てきても恐れない


学びポイント

書籍 p.86 の実質 GDP の例題のような「試行錯誤型」のロジックを Python で実装できました。

この記事で用いるライブラリをインポートします。

## インポート

# 数値計算
import numpy as np

# TeX表示
from IPython.display import Math

べき乗表示

どんな大きな数字でも $${10^n}$$ のような「指数 $${n}$$」で表示すると、小さな数字のほぼ四則演算で大きな数字(概算値)を扱えるようになります。

$$
\begin{align*}
10^n \times 10^m &= 10^{n+m} \\
10^n \div 10^m &= 10^{n-m} \\
10^0 &= 1 \\
\cfrac{1}{10^n} &= 10^{-n} \\
(10^n)^m &= 10^{n \times m} \\
\sqrt[m]{10^n} &= 10^{n/m} \\
\end{align*}
$$

テキストの数式を一部改変して引用

実質GDPをべき乗表示で

2013 年の日本の実質 GDP は $${5.2 \times 10^{14}}$$ 円(520 兆円)だそうです。
5.2 の値を含めて $${10^n}$$ で表現します。
$${n}$$ は小数点付きの数値になります。

■ 試行錯誤の方法で求める
書籍 p.86 の「試行錯誤」の方法で指数部 $${n}$$ を計算しましょう。
試行錯誤とは…
$${10^{1/2} \rightarrow 10^{3/4} \rightarrow 10^{5/8} \cdots}$$ のように半分ずつ $${n}$$ を調整して、元の数との誤差を縮めることです。

Python で while や for 文を活用すれば、試行錯誤ロジックの実装は簡単です!

1️⃣ 準備
数値を 10 のべき乗に変換する関数を定義します。

### p.86 どんな数でも10のべき乗で表す:10ⁿのnを計算する

## 数値を10のべき乗に変換する関数の定義(試行錯誤型)

def search_power10(num, threshold=1e-10):
    
    ## 仮数部(数値部分)と指数部(10のべき乗部分)に分ける
    # 整数部と小数部に分離
    sep_int_dec = str(abs(num)).split('.')
    # 指数部の算出(整数部の桁数-1)
    expon_power10 = len(sep_int_dec[0]) - 1
    # 仮数部の算出
    mantissa = num / (10 ** expon_power10)

    ## 仮数部を10のべき乗に変換する
    # 仮数部のべき乗候補を算出する無名関数の定義(下限・上限の中間値を算出)
    mantissa_power10 = lambda lower, upper: (upper + lower) / 2
    # べき乗の下限・上限の初期化
    lower, upper = 0, 1
    # 仮数部と10のべき乗の差が十分小さくなるまで繰り返し処理
    while abs(abs(mantissa) - 10**mantissa_power10(lower, upper)) >= threshold:
        # 10のべき乗が仮数部未満の場合、下限を更新
        if abs(mantissa) > 10**mantissa_power10(lower, upper):
            lower = mantissa_power10(lower, upper)
        # 10のべき乗が仮数部を超える場合、上限を更新
        elif abs(mantissa) < 10**mantissa_power10(lower, upper):
            upper = mantissa_power10(lower, upper)

    ## べき乗の合計を算出して返す
    return expon_power10 + mantissa_power10(lower, upper)

【コードの補足】
◆ 仮数部と指数部の分離
実質 GDP $${5.2 \times 10^{14}}$$ ですと、仮数部 $${5.2}$$、指数部 $${10^{14}}$$ に分離されています。
関数に与えられた数値をこのような仮数部と指数部(のべき乗の値)に分けています。
指数部のべき乗の値は、整数部の桁数-1で求まります。
仮数部は、数値を 10 のべき乗で割り算して求めています。

◆ 仮数部のべき乗値の算出
実質 GDP の例ですと $${0.72}$$ が仮数部のべき乗値に該当します。
下限値と上限値の範囲を半分づつ狭くして、べき乗値を探索しています。

2️⃣ 実質 GDP のべき乗表示を試行錯誤で求める

## p.86 日本の実質GDPは10の何乗?

# 実質GDPの数値を設定
num = 5.2 * 10**14
# 10の何乗かを求める
result = search_power10(num)
# 結果をTeX形式で表示
display(Math(f'{num} = 10 の {{{result:.10f}}} 乗'))

【実行結果】
$${5.2 \times 10^{14}}$$ はおよそ $${10^{14.72}}$$ です。

■ 対数で求める
試行錯誤しなくても、数学の「対数」を用いれば、べき乗が簡単に求まります。
対数は第3節に登場します(先取りします!)。

次の数式はべき乗と対数 $${\log}$$ の関係を示しています。

$$
\begin{align*}
100 = 10^2 &\Leftrightarrow 2 = \log_{10}100 \\
x = a^p &\Leftrightarrow p = \log_a x \\
\end{align*}
$$

$${a}$$ は「底」と呼ばれる1でない正の実数、$${x}$$ は正の実数です。
対数は指数(肩の数値)なんですね。

numpy の log10() 関数で底が 10 の対数(常用対数)を計算しましょう。
さきほどの実質 GDP を使います。

## p.86 日本の実質GDPは10の何乗?

# 実質GDPの数値を設定
num = 5.2 * 10**14
# 10の何乗かを求める
result = np.log10(num)
# 結果をTeX形式で表示
display(Math(f'{num} = 10 の {{{result:.10f}}} 乗'))

【実行結果】
試行錯誤で見つけた指数 $${14.716 \cdots}$$ が簡単に求まりました。

べき乗、対数と遊ぶ

1️⃣ さまざまな数値をべき乗で表す
$${1,2,5,10,50,100}$$ をべき乗表示にしてみましょう。

## 複数の数の「10の何乗?」

# 数値のリストを設定
nums = [1, 2, 5, 10, 50, 100]
# 10の何乗かを求める
result = np.log10(nums)
# 結果をTeX形式で表示
for num, res in zip(nums, result):
    display(Math(f'{num} = 10 の {res:.10f} 乗'))

【実行結果】
数値が大きくなるほど、指数の増加は緩やかです。

2️⃣ 対数を可視化する
$${1}$$ から $${100}$$ までの数値の常用対数を可視化しましょう。

## 対数のカーブを可視化

# 横軸 x の値を設定
x = np.linspace(1, 100, 1001)
# 縦軸 y=log10(x) の値を算出
y = np.log10(x)
# 描画
plt.plot(x, y)
plt.xlabel('$x$', fontsize=12)
plt.ylabel('$\log_{10}(x)$', fontsize=12);

【実行結果】
数値 $${x}$$ が大きくなるにつれて、対数 $${\log_{10}(x)}$$ の値が緩やかに増加している様子が分かりました。

おわり


シリーズの記事

次の記事

前の記事

目次

ブログの紹介


note で7つのシリーズ記事を書いています。
ぜひ覗いていってくださいね!

1.のんびり統計

統計検定2級の問題集を手がかりにして、確率・統計をざっくり掘り下げるブログです。
雑談感覚で大丈夫です。ぜひ覗いていってくださいね。
統計検定2級公式問題集CBT対応版に対応しています。
Python、EXCELのサンプルコードの配布もあります。

2.実験!たのしいベイズモデリング1&2をPyMC Ver.5で

書籍「たのしいベイズモデリング」・「たのしいベイズモデリング2」の心理学研究に用いられたベイズモデルを PyMC Ver.5で描いて分析します。
この書籍をはじめ、多くのベイズモデルは R言語+Stanで書かれています。
PyMCの可能性を探り出し、手軽にベイズモデリングを実践できるように努めます。
身近なテーマ、イメージしやすいテーマですので、ぜひぜひPyMCで動かして、一緒に楽しみましょう!

3.実験!岩波データサイエンス1のベイズモデリングをPyMC Ver.5で

書籍「実験!岩波データサイエンスvol.1」の4人のベイジアンによるベイズモデルを PyMC Ver.5で描いて分析します。
この書籍はベイズプログラミングのイロハをざっくりと学ぶことができる良書です。
楽しくPyMCモデルを動かして、ベイズと仲良しになれた気がします。
みなさんもぜひぜひPyMCで動かして、一緒に遊んで学びましょう!

4.楽しい写経 ベイズ・Python等

ベイズ、Python、その他の「書籍の写経活動」の成果をブログにします。
主にPythonへの翻訳に取り組んでいます。
写経に取り組むお仲間さんのサンプルコードになれば幸いです🍀

5.RとStanではじめる心理学のための時系列分析入門 を PythonとPyMC Ver.5 で

書籍「RとStanではじめる心理学のための時系列分析入門」の時系列分析をPythonとPyMC Ver.5 で実践します。
この書籍には時系列分析のテーマが盛りだくさん!
時系列分析の懐の深さを実感いたしました。
大好きなPythonで楽しく時系列分析を学びます。

6.データサイエンスっぽいことを綴る

統計、データ分析、AI、機械学習、Pythonのコラムを不定期に綴っています。
統計・データサイエンス書籍にまつわる記事が多いです。
「統計」「Python」「数学とPython」「R」のシリーズが生まれています。

7.Python機械学習プログラミング実践記

書籍「Python機械学習プログラミング PyTorch & scikit-learn編」を学んだときのさまざまな思いを記事にしました。
この書籍は、scikit-learnとPyTorchの教科書です。
よかったらぜひ、お試しくださいませ。

最後までお読みいただきまして、ありがとうございました。

いいなと思ったら応援しよう!

ネイピア DS 応援ありがとうございます。これからもがんばって記事を作成します!

この記事が参加している募集