1違うのは仕方がないにしても、3違うのは許容範囲を超える原因がありそうだ。Tweet円周率を延々と求めることが延々と行われてきた。効率的に計算するための公式が次々と考案されてきた。桁数を上げようとすると、急激に計算量が増えてしまうのだった。そのあたりを説明するときりがないので、詳しくは円周率(Wikipedia)を見よ。最近は非常に効率のよい公式が見つかっているようだ。この収束は、2の10n乗分の1のペースのようだ。桁数nが増えても桁数に比例する程度の時間でしか計算量が増えないように思われる、なかなか画期的な公式だ。この公式の導き方を知りたい場合は、次を読もう。1997この公式を利用して、円周率を求めるPythonの関数を作ってみた。項の加算を打ち切る限界は、桁数から決めた。小数点以下50桁(全体で51桁)を求めてみた。3.14159265358979323846264338327950288419716939937511大丈夫なようだ。桁数を増やしてみよう。'45648566923460348610454326648213393607260249141274'300桁も問題なく動いているようだ。続けて、400桁も確かめてみよう。last)しかし、400桁まで計算してみようとしたら、いつまで経っても、うんともすんとも言わないのでCtrl-Cで強制終了した。Tweet前回は、円周率を100万桁、とても効率的というか、インチキというか、そういう方法で求めた。今回は、真面目に円周率を計算する方法を考えてみよう。円周率は、随分前から計算するための公式が分かっており、wikipediaにたくさん載っている。昔から有名なのは、次のマチンの公式であろう。これに基づいて計算すると、この程度の精度は出る。3.1415926535897936しかし、これでは単に計算しただけに過ぎない。精度を上げる工夫をしよう。3.1415926535897935600871733186068013310432434082031これで50桁表示できたようだ。前回のpiと比較してみよう。3.1415926535897932384626433832795028841971693993751ということで、全然一致していない。数式を計算してから、evalfで高精度にしても無駄のようだ。数式のままにしておいて、evalfの中で値を指定してみよう。3.1415926535897932384626433832795028841971693993751これで一応50桁は一致したようだ。先の桁まで比較してみよう。小数点以下100万桁に挑戦。'56787961303311646283996346460422090106105779458151'これで100万桁、ちゃんと計算できたようだ。思いたいところだが、単にatanを使って、桁数指定して計算しただけなので、やっぱりインチキ感は否めない。Tweet前回、SymPyでの連分数を作る関数list_to_frac(A,B)を定義した。これを利用して計算してみよう。連分数は、有理数だけではなく、無理数、超越数なども表せる。練習として、2の平方根を求めてみよう。これから、2つのリストを[1,2,...]と[1,1,...]を作ることで2の平方根が求まる。1.414213562373095では、円周率を求めてみよう。Wikipediaに載っていた式をπについて整理すると次式を得る。これを元に円周率は簡単に計算できる。3.141592653589793なので、精度がちょっと足りないので、25段にしてみよう。3.141592653589793ちゃんと計算できているようだ。効率の良い計算方法がいろいろ発表されているが、連分数では効率が良くないので、これ以上深入りしない。それでは不満だろうから、ちょっと円周率を100万桁求められる方法を書いて終わりにする。3.1415926535897932385これで、evalf()で桁数を指定すると、その桁まで表示される。整数部(3.)の部分も含まれるので、小数点以下何桁というのと照合するときは桁数を1加える必要がある。これを利用すると、1万桁でも、100万桁でも簡単に求まる。以下では、最後の50桁だけ示した。'56787961303311646283996346460422090106105779458151'円周率100万桁までの本としては、以下の本が一部では非常に有名です。Tweet連分数は数学の中でもとりわけ美しい魅惑的な分野だ。分数の計算は面倒というのが小学校以来ある。それを、SymPyで解決してしまおう。こんな数式を扱いたいのである。右のpprint(f)のfは連分数の式で、それをpprint(f)で美しくprintした。この形の再帰形式になっている分数を連分数という。全て1の場合を正則というそうだ。aとbの数列を与えて連分数を生成する関数は以下のようになる。分母のAの方が、分子のBより1つだけ長い。b4/a4)))symbols()を使うことで、まとめて数列の添字付変数を作っている。list_to_frac()に与える分母、分子の数列であるが、これはリストでもタプルでも構わない。pprint()を用いると美しい分数形式で表示されるのだが、単にprint()とかの場合には、カッコだらけのベタッとした感じに表示される。BACKSに以下の入門書がある。TweetPythonを使うと、いろいろな計算、数式処理などができることは、『Pythonからはじめる数学入門』で触れたが、実際にどのように行うのか何も書かなかった。いうライブラリを使うためにインポートする。シンボルとして扱うことを宣言する。このやり方では、シンボルの数が増えると面倒なので、もっと横着な方法を使う。z)これにより、英小文字1文字はシンボルとして扱えるようになる。y)ということで、こんな感じにどんどん因数分解の宿題ができてしまう。Identity(ソフィージェルマンの恒等式)で、非常に美しい因数分解公式として知られている。フェルマーの定理にも出てくるが、日本ではあまり知られていないようである。検索このアーカイブについてこのページには、2016年11月に書かれたブログ記事が新しい順に公開されています。前のアーカイブは2016年10月です。次のアーカイブは2016年12月です。最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。