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です。

素数を求める(その3)

 N=100,000迄の素数一覧です

一覧表

2022-10-12

素数を求める(その2)

  さて、「素数を求める(その1)」で、N=100
とし、100迄の素数を求めました。その時25個の
素数があったわけですが、Nをより大きな数字にし
たらどうなるか?を考えてみました。
N= 10,000の時
 素数の数:1,229個
 処理時間:  164 ms
 処理回数:   49,985,001回
N= 20,000の時
 素数の数:2,262個
 処理時間:  617 ms
 処理回数: 199,970,001回
N= 50,000の時
 素数の数:5,133個
 処理時間: 3,468 ms
 処理回数:1,249,925,001回
N=100,000
 素数の数:9,592個
 処理時間:14,119 ms
 処理回数:4,999,850,001回

 と言うようにNが10万程度でも素数はちゃんと
拾いだせるのですが、計算ループ部分の処理回数
が50億回位になって、処理時間は14秒以上も掛
かってきます。
 
 そこで、もっと短い時間で処理できるように
プログラムの改善を考えてみます。
 nと言う数字が素数か調べるためにn-1迄の
数字で割っていますが、nはn/2以上の数字で
割っても、2以下にしかなりませんので、
n-1迄の数字ではなく、n/2迄の数字で割れば
十分です。
 但し、n-1⇒n/2ではプログラム上nを整数
であるintと定義しているので、例えば3/2=1.5
でなく1、5/2=2.5でなく2となるので、念の為
にn-1⇒n/2+1としてみます。
 変更後、処理時間及び処理回数が半分になりました。

2022-10-09

eclipse操作(No.6)

  プログラミングのために、eclipses操作 No4に
戻ります。
 立上げ時の画面は「ワークベンチ」と呼ばれま
すが、その中にいくつかの作業スペースが並んで
います。
・エディター
 プログラムを書き込む領域
・パッケージエクスプローラ
 ワークスペースにあるプログラムのツリー
・コンソール
 プログラム実行結果等が表示されます


 この画面(ワークベンチ)で、如何にプログラミ
ング作業をするのかと言うと、
1)エディター内の
  package pakkeeji01;
   public class Kurasu01 {
     public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
    *************
     }
  }
  ***********の行に実行する内容を書き込む
2)今回は、もっとも簡単な実行文として
  System.out.println("じゃ~ばじゃば");
 と入れて見る。
3)これで、「じゃ~ばじゃば」とeclipse上で
   プリントアウトするプログラムが完成した

4)次に、このプログラムを実行してみる
     下の絵の①→②の順にクリックする
  ※もしくは、直接○の三角マークをクリックする
5)すると、下のように命令が実行された事が解る

 以上が、eclipseでのjavaプログラミングの
流れと、作業方法になる。
 最後に、javaプログラミング言語について、
簡単な説明をする。

2022-10-04

eclipse操作(No.5)

  さて、前回迄でプログラミングできる直前まで
到達できたのですが、私の場合は年齢的に小さな
文字が見え難いので、テキストの文字サイズを大
きくしたいと思います。別に小さくても良いと思
う人は、処理する必要は有りません。

1)以下の絵のように操作するとテキストサイズの
  変更設定画面に到達します。
 ①から順に選択してください。
 2)次にフォントサイズの変更です。
   今回はサイズ10を12にしてみます。
  ⑥から順に選んで下さい。すると、破線の丸枠で囲んでいる
  ように、文字が大きくなります。

 前にも言ったように、気にならない人は無理にサイズ変更する
必要は有りません。

2022-10-01

eclipse操作(No.4)

 次にクラスを作成し、プログラム作成の直前まで
の準備をします。

1)先ず、前回(プロジェクト作成)迄の画面です。
  このようになっていると思います。

2)ではクラスを作成します。
  プログラム作成と同じように、左上の「ファイル」
  をクリックし、「新規」→「クラス」と順に選びます。
3)すると、クラス作成のための表が出てきますので、
  それに書き込みます。
  ここでは、パッケージ名を「pakkeji01」、
  クラス名を「Kurasu01」と仮に設定しました。
  勿論好きな名前(分類しやすい名前)でいいです。

  この時、
  Public static void main(String[]args)
  の前の□にチェックを入れて下さい。後が少し
  楽になります。

  最後に「完了」をクリックします。

4)ここまでやると、次のような画面になっています。
   これで、プログラム作成の準備が全て終わりました。

   javaでは

    package pakkeeji01;
    public class Kurasu01 {
     public static void main(String[] args) {
   // TODO 自動生成されたメソッド・スタブ
      ・・・・・・
      ・・・・・・
      ・・・・・・
  }
    }

   の中の・・・・・・の部分にプログラムを書き
   込むことで、任意のプログラムを作成できます。

2022-09-30

eclipse操作(No.3)

 eclipseでプログラムを作成するにはどうしたら
いいか?基本的な操作手順です。

1)操作前の画面
  画面背景を白にした時と同じ画面です。

2)javaの場合、先ずプログラムの開発単位として
  最初にプロジェクトを作成します。
  次の絵のように、「ファイル(F)」をクリックし
  「新規(N)」→「javaプロジェクト」と進みます。

3)すると下の絵の左側のような枠が表示されま
  すので、右側のように任意のプロジェクト名
  を入力します。この時大文字のアルファベット
  で書くのが慣例のようです。
  ここでは「Hazimete01」としてみました。
   入力が終わったら、下の「次へ」をクリック
  すれば、プロジェクト(フォルダ)が出来ます。
  最後に下の絵の「完了」をクリックして下さい。

3)ここまででプロジェクトが作成できました。
   プロジェクトは、ある大きなプログラムを
  作る時、にいくつかの小さなプログラムを入
  れる容器みたいなものです。
   プログラム1個で構成される場合でも必ず
  必要です。この段階まででの画面は、

2022-09-27

eclipse操作(No.2)

  eclipseがうまく使えるように、少し
触ってみます。ここは、本人が気にならなければ
このままでもOkなのですが・・・
※尚、黄色文字は私が書き加えたコメントです
 1)立上げ直後の画面

  尚、このままでは背景が暗くて見難いので
  私は少し、設定を変えました。
  背景を白くします。
   Ⅰ)画面の上から2段目「ウィンドウ(W)」をクリックし、
     プルダウンメニューの「設定(P)」を選んで下さい。

  Ⅱ)設定をクリック後、「一般」の前の「⋗」 → 「外観」
   と選び、ルック&フィールの項をダークからクラシック
   に変えて「適応」を選ぶと
    eclipseが再起動する。

 1)その結果、次のように画面背景が白くなる。 
   ※以前のeclipseのバージョンはこの背景

2022-09-24

eclipse操作(No.1)

 eclipseを初めて起動するとどうなるかと言うと、

 1)起動タイトルの表示
   最新版では次のようなタイトルがまず表示されます。

 2)次に作成されるプログラムの保管場所の確認
       のため、以下のような表示がされます。

    ※これは、pleiadesフォルダの本バージョン用フォルダーである2022-09の中に
     eclipseフォルダーと並んでworkspaceと言う名前のフォルダ-として設定されます。
     これはしょきちですので、別の場所に変えたければ、ワークスペース(W)の後ろの
     参照(B)をクリックする事で、変更できます。

  問題なければ、下の起動(L)をクリックして、
  次に進みます。

 3)すると、eclipseのホーム画面が表示されます。
    以下がその画面です。

以上で立上げ完了です。

プログラミング支援ソフトの導入

  まず最初に、プログラミングをする環境から準備
します。
 私は素人ですので、詳しいことは判りませんから、
インターネット等で調べてみると、eclipse という
ソフトウェアが良さそうだったのでこれにしました。

(インストール手順)

 1)以下のwebサイトを検索します。
   https://mergedoc.osdn.jp/
   ※上記は、eclipseを日本語で使うためのソフト
          等全てをセットで入手でき、更にダウンロード
          後解凍するだけで使用可能になる優れものです。

 2)以下の画面になったら、赤丸の位置の枠をクリックします。

 3)上記クリックすると以下のページが開きますので
   下図の赤丸を選んで、これをクリックすると
   ダウンロード画面に移動します。

  https://mergedoc.osdn.jp/

   更に、ダウンロードするファイル名が表示され
       ますのでこれもクリックすると、ダウンロード
       が始まります。

  尚、上記はwindowsの場合です。Macは最初の図の赤丸の
  下の段のDownLoadを選ぶととになると思います。

 4)ダウンロードが終了すると、パソコンのダウンロード
  フォルダーに
   pleiades-2022-09-java-win-64bit-jre_20220914
  という圧縮ファイル型のアプリケーションが出来ていま
  すのでこれをクリックして実行すれば、パソコンにeclipse
  のインストールが出来ます。




 5) 後は、windows(C:)フォルダーの中に作成された
  pleiadesフォルダーを探してその中のeclipseフォルダー
  内にあるeclipseアプリケーションをダブルクリックすれば
  eclipseが立ち上がります。

  ※尚立上げ初回は、これから自作するプログラムを保管する
   workスペースフォルダーの作成場所等の、初期設定が要求
   されます。この作業は後日とします。

 今日はここまで・・・












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

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