2022-12-12

円周率を求める (その7)

 円周率を求めるにあたり、どうしても変数に許
されるメモリー上の制限がある。これにより通常
の変数は15桁迄となっている。
 JAVAでは、その制限に対する解決策として、
BigIntegerクラスの整数型の変数が使えるので、
これを使って、より高精度な円周率を求めてみる
 これにはサチンの公式が扱いやすいので、これ
を使う。
計算結果は
 上記は1000桁迄であるが、2万桁までは手持ちの
パソコンで計算できた



2022-11-27

円周率を求める(その6)

  図形から円周率を求める事を試みてみたが、
円周率にはなっていそうだが、精度が上がらな
いようで、不満が残った。
 もっと高い精度が欲しいので、級数形式にし
たいと思い、Wikipediaを調べてみると、沢山
出てきた。数学の力を改めて感じた。
代表的なものを以下にあげる。

①のグレゴリ-・ライプニッツの公式は比較的わかり
やすいもので、マクローリン級数とx=1の時の三角
関数arctanx=π/4で、この式にたどり着けます。
但し、中々収束しません。5000万回繰返しても、
小数点以下10桁迄の精度しか有りませんでした。
ピタゴラス、アルキメデスでは24回の繰返しで
小数点以下14桁の精度でした。
②のマチンの公式では右辺の第一項及び第二項あわせ
ても16回の繰返し計算で小数点以下14桁の精度にな
りました。
③ガウス・ルジャンドルのアルゴリズムでは、3回の
繰返し計算で、小数点以下14桁の精度になりました。 

ここでは、3種類を同時に計算させるため、雑ですが
次のようにプログラムを書きました。

計算結果
小数点14桁より下は、プログラムの倍精度数値の
範囲外であるため、ここでは0と表示されたりする。

補足
グレゴリ-・ライプニッツの公式について
マクローリン級数において、x<1を考慮すると
一気に収束が早くなる。
なんと、30回程度の繰返し計算でπ関数とほぼ同じ
値を得る事が出来た。

2022-11-19

円周率を求める(その5)

 円の面積を求めれば、円周率がわかると言う事
で 積分の考え方からパイ(π)を計算してみる。

計算結果を見ると、分割数を増やしても下10桁以上
に精度は上がりそうにない

2022-11-06

円周率を求める(その4)

  精度の上でまだ中途半端な気がして仕方がない。
計算できればそれでいい事ではあったのですが、
なにか物足りない。
 そこで、パソコンが有れば、数学に詳しくなく
ても出来る方法として、乱数による解法を確かめて
みる事にした。

 以上のように、大変効率が悪かった。これも理屈
の上では円周率を求める事ができるのですがね。

 参考にプログラムを上げておきます。


2022-11-05

円周率を求める(その3)

  アルキメデスは直角三角形の相似を利用して
円周率をもとめていたので、こちらを試してみた。
ピタゴラスの定理を使うより、平方根の使用回数
が減るので、もしかしたら精度が上がるかなと思
ったのですが・・・
※この人、紀元前200年頃の人だそうです。
 現代人の私が思いつかなかった事をこんな昔に解いてたん
 だと思うと・・・。情けないです。
・考え方
・プログラム
・結果
となり、ピタゴラスの定理を使った場合の同じ値に
なった。公認されたπの値より少し大きい数値に
収束するのは、やはりプログラム上扱える数値の
桁数の影響が大きいようだ。





2022-10-24

円周率を求める(その2)

  式が出来てしまうと、プログラムは簡単です。
出力結果



円周率を求める(その1)

  円周率は、円の直径からその円の円周の長さを
求める時に、小学校の時からお世話になった係数
です。
 しかし、その円周率はどうやって求められてい
たのか普通の人は知りません。ドラム缶のような
円柱の円周を巻き尺で測って、直径で割れば出て
きますが、巻き尺の目盛は良くてmm単位ですし
測定誤差もあります。
 ここで論理的な方法を考えてみますと、先ずは
三平方の定理を使う方法が有るようです。
※直角三角形の三辺abcには
 a^2+b^2=c^2

解き方



2022-10-18

素因数分解(その2)

  Javaを意識しながら、試行錯誤して次のような
フローチャートとプログラムを考えました。

 素因数分解したい数字n1をひたすらiと言う数字
(2~n1)で割っていって割り切れる数字と割った
回数を拾い出すやり方です。iは小さい数字から使
いますので、結果的に素数で割った形になります。
 計算結果の一部を示すと、

となりました。


素因数分解(その1)

 素数以外の自然数は素数の掛け算で表現できま
すが、これが素因数分解です。
 自然数2からN迄の数字を素因数分解するプロ
グラムを増した考えて見ました。
ざっと、フローチャートを作りました。
 
 Basic言語なら、このフローチャート通りに書けば
多分目的を達成します。goto文が好きなプログラム
の行に飛びますから、矢印どうりに処理を進めてく
れるはずです。
 でもjava等のプログラム言語にはこの様な命令文
はなさそうです。
 そこで、このフローチャートをベースにjavaで使
えるフローチャートを考えなければなりません。
※他のレベルの高い人はどう書くか知りませんが、
 私の場合はこの手順で考えます。

2022-10-14

素数を求める(その5)

  今までに改良してきたプログラムは、素数か
どうか調べたい数字nをそれより小さい数字iで
割ってみて余りがあるかどうかで判定している
が、全てのiで割った後、1個以上割れる数字が
有った時に素数と判断している。
 今回はiで割る時割り切れる数字が1個見つ
かったら、すぐに次のnを調べるようにする。
 こうすれば、素数でないと分かった後の無駄
な計算をする事を省ける。
その方法は、図のようにbreak;を入れるだけ
で済む。
 これにより、2秒かかった計算が0.5秒に
なった。「素数を求める(No.1)」のプログ
ラムからの改善の結果、
N=100,000の時
 素数の数:9,592個
 処理時間:14,119 ms
 処理回数:4,999,850,001回
であったのが、今回の改善「素数を求める(その5)」
のプログラムでは、
N=100,000の時
 素数の数:9,592個
 処理時間:518 ms
 処理回数:  113,970,448回
N=1,000,000の時
 素数の数:78,498個
 処理時間:36,915 ms
 処理回数:  9,395,812,778回
にする事が出来た。

因みに、「素数を求める(No.1)」のプログラム
に、break;を入れた場合は
N=100,000の時
 素数の数:9,592個
 処理時間:1051 ms
 処理回数:227,995,678回
N=1,000,000の時
 素数の数:78,498個
 処理時間:77,986 ms
   処理回数:18,792,164,730回
であった。

尚、「素数を求める(No.1)」のプログラム
に、break;を入れなかった場合には
N=1,000,000の時
 素数の数:78,498個
 処理時間:708,240 ms (約12分)
 処理回数:249,999,000,001回

素数を求める(その4)

  「素数を求める(その3)」から更に改良します。
素数は2から始まりますが、それ以降は全て奇数の
はずです。そこで、プログラム上で調査する数値を
奇数だけにします。
 計算時間で2秒、処理回数及び処理時間が
約1/4になりました。プログラムミング初期
と比べると、1/7です。

円周率を求める (その7)

 円周率を求めるにあたり、どうしても変数に許 されるメモリー上の制限がある。これにより通常 の変数は15桁迄となっている。  JAVAでは、その制限に対する解決策として、 BigIntegerクラスの整数型の変数が使えるので、 これを使って、より高精度な円周率を求めてみる  これ...