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 自動生成されたメソッド・スタブ
      ・・・・・・
      ・・・・・・
      ・・・・・・
  }
    }

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

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

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