0どうも、木村(@kimu3_slime)です。2.718\dots\)は、円周率\(\pi\)に並び、数学において重要な定数です。x\)の底に利用されるだけでなく、複素関数に関するオイラーの公式、統計学における正規分布(ガウス分布)など、幅広く使われています。今回は、\(e\)をPythonによるプログラムで、100桁以上計算する方法を紹介します。(数学定数に関してはmath,numpyモジュールがありますが、今回はそれらを用いず1から計算します)目次floatによる素直な計算decimalで桁を増やして計算こちらもおすすめfloatによる素直な計算\(e\)には複数の定義があります。\frac{1}{n})^n\]です。これでも計算はできますが、収束が遅く、計算する桁\(n\)が大きすぎる割に精度ある値が求まりません。収束がより早く計算しやすいのが、\(e^x\)の冪級数展開(テイラー展開)です。単振り子を例にわかりやすく解説、テイラー展開の展開式の覚え方、導き方、証明これに\(x=1\)を代入すれば、\(e\)が求まります。素直にPythonのプログラムを書いてみましょう。seriesさて、ここで「print(series1(10,1)),print(series1(100,1))」を実行します。e」と照らし合わせると、前者は小数点以下7桁、後者は15桁一致しています。桁を求めたいものです。float)は、デフォルトで17桁までの数値しか扱えません。Pythonドキュメントdecimalで桁を増やして計算より多くの桁を計算するために役立つのが、計算精度を任意に指定できるdecimalモジュールです。「decimal.Decimal(1.000)」とすれば0が省略されることなく、有効数字を保ったまま数値を扱えます。Pythonドキュメントこれを使って\(e\)を計算してみましょう。e」と照らし合わせても表示されている桁はすべて一致し、小数点以下100桁求められたことになります。僕が最初に計算しようとして、間違えたことがあります。関数定義式の方にdecimal.Decimalを使い、「print(series1(100,1))」を実行してしまったことでした。これだと結果が20桁くらいまでは正確に求められるのですが、それ以降はいくら\(n\)を増やしても精度が増さないのです。問題は、関数に「1」を代入していることです。これはfloatの1として扱われるので、計算のうちに誤差が生じてしまうのです。decimalの1を代入すべきだった、というわけですね。^{20}\)であっても、小数20桁ぐらいまでしか一致しません。級数の方が小さい値(100)の代入で精度良い値が出てきますね。ちなみに、当たり前ですが、級数による定義だから収束が早いというわけではありません。円周率を求めるなら、ライプニッツの公式は級数として計算できますが、収束が遅いです。ガウス=ルジャンドルのアルゴリズムと呼ばれる方法が、単純かつ早いようですね。僕は最近Pythonを勉強し始めたばかりなのですが、16桁くらいしかないfloatの計算だけでは、ネイピア数の100桁も求められないじゃないかと不満がありました。今回、decimalの扱いを知り、精度の良い計算が素早くできたので満足です。計算方法によって、真の値への収束の速さ、結果の精度が大きく変わってくることは、理論数学と違い、コンピュータならではのことして意識しなければならないなと思いました。木村すらいむ(@kimu3_slime)でした。木村すらいむ(木村一輝)趣味で数学をしています。1992年・群馬生まれ、茨城在住。ご連絡はTwitter(@kimu3_slime)のDMへお願いします。木村すらいむ(木村一輝)趣味で数学をしています。1992年・群馬生まれ、茨城在住。ご連絡はTwitter(@kimu3_slime)のDMへお願いします。