Javaによる多桁計算

by hirokuro
updated 2019/04/17、since 2010/03/10




精度が必要なときに使ってください。7000桁まで計算できます。基本的関数、複素数も計算できます。スピードもかなりありますので、実用にたえると思います。

新しいjavaになったので、私の画像プルグラムがまったく動かなくなってしまいました。計算プログラムは動くようです。新しいjavaにあわせて画像が作れるようにしたいと思いますが、しばらくお待ちください。




多桁計算ソフトTaketa ver3.11 をダウンロードする方は、
ここをクリックしてください。


適当なところに置いてクリックすると解凍されて、デスクトップにtaketaフォルダが出来上がります。

解凍ソフトのない方は窓の社からダウンロードしてください。

              第2章  その他の使える関数


              第3章  グラフの作り方   (しばらく中止)



              第4章  零線図の描き方







第1章      多桁計算ソフトを作ったきっかけ



普通の数学の問題を解いていて、計算精度が必要になることはめったにありません。電卓は10桁程度の精度ですが、それで困ることはありません。自然科学はさらにおおざっぱです。円周率は普通3.14で計算しますが、小学生向きの算数では3として計算することが推奨されているそうです。数学者の中には反対する人もいますが、私は大賛成です。地面に円を描くなどの実際の作業では一桁の精度で充分だからです。・・・というわけで、ますます精度は必要なくなります。しかし、私の関心を持つテーマでは逆に精度がことのほか必要だったので、とても困りました。当時、電卓しかありませんでしたので、誤差を減らす工夫をしたのですが、スピードも遅く、問題の解決には至りませんでした。

しかし、幸いにもまもなくパソコンの時代になりました。これで計算できるだろうと思い、30万円も支払って、当時としては安いPCを買いましたが、やってみたところ、ひどくがっかりしました。たいして精度がよくないのです。電卓よりもましという程度のことだったからです。私の「パソコンならば・・・」という夢は無惨にも崩れ去ってしまいました。当時はBasicが幅を利かせていました。Basicは覚えやすいので、初心者にとって助かりましたが、精度が悪いのでは何のためのパソコンか? 落ち込み方も尋常ではありませんでした。

このままでは投資した意味がないという思いと、精度の良い計算が出来ないはずはないとの気持ちから、いろいろ本を漁った結果、自分でプログラムを作ればよいと言う結論になりました。幸いに、piを精度良く計算するプログラムを見つけたので、それを参考にして多桁計算が出来るプログラムをBasicで書いてみました。すると、なんとか動いてくれて、とても嬉しくなりました。

そのときのプログラムは今手元にないので、どういうものだったか詳細は忘れてしまいましたが、たしか100桁で計算するプログラムだったと思います。加減乗除、および対数計算の出来るもので、構想としては今日の私のプログラムの基礎となっています。

まもなく、さらに精度が必要となり、100桁を1000桁に変更しましたが、この変更は簡単でした。メモリーを増やして、基礎となる定数を計算しておけばよいだけだからです。このときπの計算に40分くらいかかったと思います。今では遅すぎると感じますが、当時は、凄く早いと驚いたことを覚えています。

そのうち、これでは時間がかかりすぎると感じるようになり、アッセンブラを勉強して、N88Bacic から機械語に繋がるようなプログラムを作りました。書くのは面倒でしたが、原理は同じですから、難しくは思いませんでした。これはものすごいスピードで計算してくれるので、とても助かりました。

かつての数学研究はこの程度で終わっていました。私としては何ら不満はなく、このまま級数の研究を進めるつもりでした。しかし、あるとき問題が発生しました。パソコンが古くなり、新しいのに買い換えようとしたとき、NEC機が廃止になり、みなIBM互換機に変わっていました。互換性がないので、これでは私の作ったプログラムが動きません。

他に手段はないので、やむなくAptivaを買うことにしました。使い勝手がNECとまったく違うので、ひどく戸惑い、慣れるまでに数ヶ月もかかってしまいましたが、なんとか、ネットも、ワープロも使えるようになりました。しかし、肝心の計算だけは出来ませんでした。この機械にはBasicがインストールされていなかったからです。どうしようかと悩んでいたところ、あるところで無料のBasicソフトを見つけました。これを使おうと思いましたが、このソフトには機械語に繋がる機能が無く、また、スピードが異常に遅いので使い物になりませんでした。

私は無料主義でやっている人間で、有料ソフトを買いたくはありませんでした。しかし、この際仕方がありません。やむなく、VisualBasicを買ってきて、これでプログラムを作り直すことにしました。書く内容はほとんど同じですが、NEC・Basicにない新しい概念がいくつもあり、学ぶのに時間がかかり、精神的にも疲れました。何でこんなことを勉強しなければならないのか・・・という思いがわいてきたからです。しかし、今から考えてみると、これでプログラムの初歩を学んだわけで、それさえ知らなかったということは大いに反省しなければならないと思います。

そういうわけで、プログラムは出来上がったのですが、その計算スピードは期待したほどのものではありませんでした。以前は機械語で動かしていたわけですから、投資したわりにはスピードが出ないことに不満が残り、VisualBasicには愛着を感じることが出来ませんでした。

そこで、思い切って別のソフトにトライすることにしました。当時、C,Java,Perl などの選択肢がありましたが、Cは有料で、数年前にトライしたことがありましたが、学ぶのが面倒になって挫折したことがありました。無料で手に入れて、簡単そうなので、Perlを勉強してみました。これはBasicに似ているので、すぐに理解出来て、プログラムも、書くのは面倒でしたが、なんとか完成させました。しかし、スピードがVisualBasicレベル・・・というか、もっと遅くて、すぐに諦めました。

仕方ないのでJavaにトライすることにしました。JavaはCに似ているので、取っつきにくいという先入観がありましたが、無料であることは非常に評価できます。そこで、勉強に取りかかったのですが、Perlをやったおかげで、頭がBasicから少し自由になったのでしょうか、Cのときより気分的に楽に学ぶことが出来ました。おそらく、「これしかない」という切迫感が学びを後押ししたのだろうと思います。以前は面倒に思えたクラス概念や宣言の仕方などを覚えて、何とか完成させたところ、まあまあのスピードで計算してくれました。


最初に出来たプログラムは、Javaの書き方としては綺麗なものではありませんでしたが、ちゃんと動いて、スピードもまぁまぁだったので、以後、これを修正しながらやってきています。今、ようやくJavaにも慣れて、自分なりの書き方ですが、満足できるレベルになったと思います。専門家から見れば、ひどく幼稚な書き方と言われるかもしれませんが、とにかく動いてくれるので、私としてはこれで良いと思っています。いろいろ書き直したり、構造的な修正もいくつかしているうちにバージョン3.0にまでなりました。桁についても7000桁を計算できるようにしています。

私の自慢は、計算スピードを上げる工夫をしたことです。最初に作ったプログラムは、そこそこのスピードでしたが、それより数段早く答えが出るやり方を思いつきました。おそらく、普通に書いたCのプログラムより早いのではないでしょうか。書き直すのに手間はかかりましたが、これで実用性のあるプログラムになったと思います。使っていただける方がいるなら、差し上げますので、先のところからダウンロードしてください。解凍して適当なところにフォルダをおけば使うことができます。Javaを知っていることが大前提ですが、一応、使い方については、以下のところで説明しておきます。著作権のことなど良く知らないのですが、一応、頒布は禁止しておきます。ベータ版のようなものだからです。




■      多桁計算ソフト Taketa  の使い方


ここではJavaをある程度使っている人を対象に説明します。Javaの使い方を学びたい方は、解説書を買ってくるとか、「入門Java」などのHPを参照してください。インストールの仕方とか、Pathの通し方とか、面倒ですが、慣れてくるとどうと言うことはありません。

<追加>

先日(2010/04/20)、PCを買い換えて、Javaを再インストールしました。インストールの仕方とかPathの通し方などはわかっているつもりでしたが、インストールしたのにJavaが動きませんでした。お恥ずかしい限りです。「コントロールパネル」から「パフォーマンスとメンテナンス」を開けて、「システム」、「詳細設定」、「環境変数」と順次開けてゆき、「システムの環境変数」の中に正しくPathを書き込んだつもりでしたが、奇妙なことに java 命令は動くのに javac が動きません。こんなことがあるのだろうか?と思いつつも、javaフォルダの中のbinを開けて見ると、なんとjavac がありません。これでは動くはずがありません。
   (。ー_ー。)。ο〇
なんということか?と驚きつつ、いろいろ考えたのですが、書式が変更になるとは考えられないし・・・、何か原因があるだろうと思い悩んでいると、やけに簡単にJavaをインストールできたことが気になりました。さらにJavaのHPを読んでいると、「jdkとjreの区別がある」という文章が目に留まりました。私のファイルを開けてみるとjreとなっていました。これが原因だったみたいです。さっそくjdkをダウンロードしたところ、動き出しました。どうでもいいところにも落とし穴があるのですね。こんなところで間違えるバカは私だけでしょうか。

なお、私のXP機でのPathの書き方は、変数名が「Path」で、変数値は「C:\Program Files\Java\jdk1.6.0_20\bin」となります。path ではなく、「Path」にしないと動きません。

また、今回の新しいPCではパーティションがなく、my documentsの下にtaketaフォルダを置いたので、コンソールを立ち上げるたびに 「cd\documents and settings\user\my documents\taketa」と打たなければならなくなりました。これは面倒なので、上記の命令を書いたバッチファイルを作り、これをjava/binの中に入れておきました。java/binにはpathが通っているので、これで「taketa」と打ち込むだけで移動してくれます。


まずは、ダウンローとしたtaketa.lzhを適当な場所において解凍してください。するとデスクトップに「taketa」というフォルダが出来ているはずです。名前は何でも良いので適当に変更して、適当なところに保存してください。ここでは「taketa」というフォルダ名にして、Dドライブに置いたことにしておきます。

taketaフォルダの中に5つの小フォルダと7つのファイルが入っているはずです。小フォルダにはスピード計算用のdataが入っているのでいじらないようにしてください。Javaプログラムの中の Mn.java が常に使う実行プログラムです。内容を保存したいときは、別名で保存しておき、実行したくなったら再度 Mn の名前に戻して実行します。

解凍したあと、まずはコンソール(DOS窓・コマンドプロンプト)を出して、taketaフォルダに移動します。その上で、「javac Mn.java」と打ち込んで実行します。これは準備作業なので、何も変化しません。次に「java Mn」と打ち込んで実行します。すると何やら動くはずです。数字が出るとか、文字が出れば成功です。何も反応が無いときは、javaがインストールされてないとか、Pathが通ってないと思われるので、Java解説のHPを探して、Javaが動くようにしてください。知っていると簡単なのですが、知らないと結構大変かもしれません。友人に聞くのもひとつの手です。

上記のやり方で「java Mn」が無事動いたなら、次に、TeraPad(メモ帳・notepadでもかまいません。)を使ってMn.javaを開けてみてください。intやlongの宣言部分がありますが、その先頭に int ak=100 という部分があります。ここで有効桁数を決めます。最初は100になっていますが、7000まで計算可能です。50だと表示が乱れることがあるので、なるべく50以上の数を書き入れてください。宣言部分のあとに System.out.println("main の計算"); と書かれたところがあります。ここから後が自分でプログラムを書き込むスペースです。

数字はすべて配列に格納します。配列の名前は自分で決められますが、最初に宣言をしておかなければなりません。いちいち面倒なので、ここではすでに宣言されている名前を使うことにします。 a[], b[], c[] は計算途中に使う配列とします。通常使う配列は dx[], ex[], fx[] , . . . などのように命名されています。そして、a[0]=5; という部分が 10^5 を意味しています。a[0]=1 が10で、a[0]=2 が100です。a[1]=1; が先頭の数字で、常に一桁で現わします。a[2]=2222222; の部分は7桁です。7桁に満たないときは、先頭に0があると解釈してください。つまり、a[2]=200; は 0000200 を意味しています。配列枠の数は、最初に決めた 有効桁数ak により決まってきます。つまり、ak1=ak/7; の部分が配列の大きさを示しています。ak0=-ak; は指数の最小数を示す記号で、これ以下の数は零とみなされます。つまり、a[0]=ak0; は零となります。また、a[1]=0; も零とみなされます。

たとえば、6.23を入力したいときは、a[0]=0;a[1]=6;a[2]=2300000; とします。12.53なら、a[0]=1;a[1]=1;a[2]=2530000; です。Mn.javaにはすでに hx[], ex[]が書かれているので、これを使って、6.23+12.53を計算するには、hx[0]=0:hx[1]=6;hx[2]=2300000; ex[0]=1;ex[1]=1;ex[2]=2530000; と書き込みます。次のスペースに Tk.add(hx,ex,a); と書き込みます。これが加法の記号です。hx, ex, a  は配列名で、a[] に答えが入ります。これを表示する命令が Tk.disp(a); です。これも書き入れます。これを保存して、javac Mn.java 、 java Mn とコンソールに命令を書き込んで実行すると、画面に1. 8760000 0000000 .... arh=1  と表示されるはずです。

引き算をしたいときは、Tk.sub(hx,ex,a); とします。かけ算は Tk.mlt(hx,ex,a); 、わり算は Tk.div(hx,ex,a); とします。対数は Tk2.log(hx,a); です。10^hx=a は Tk2.exp10(hx,a); です。hx^ex=a は Tk2.pow(hx,ex,a);  と書きます。 その他、使うことの出来る関数は別ページ(関数の使い方)で解説してあります。注意すべき点としては、このソフトでは0で割ると0が返るようにしてあります。エラーにはなりません。その理由は、連続して計算する場合、途中で止まっては困るからです。エラーかどうかは結果を見て、自分で判断してください。また、誤差が積み上がる場合もありますが、それも結果を見て自分で判断する必要があります。それでは困る場合は、このソフトを使わないようにしてください。

というわけで、先ほどの hx[0]=0:hx[1]=6;hx[2]=2300000; ex[0]=1;ex[1]=1;ex[2]=2530000; を使って、その続きに Tk2.pow(hx,ex,a); と書き込み保存して、javac Mn.java 、java Mn と打ち込んで実行してみましょう。すると、Tk.disp(a); のところに、9. 0143667 7595465 3114109 ... arh=9 と表示されるはずです。表示を少なくするには Tk.disp08(a) を使います。

あとは同じフォルダにある sample.java を参考にして、使い方を覚えてください。それほど難しくはないはずです。このsample.javaの5行目が「 public class sample 」 となっているので、「javac sample.java」「java sample」で動きます。これは マチンの公式を使って πを1000桁計算するプログラムで、私のPC(celeron2.30GHz)でやったところ1秒で結果が出ました。これを7000桁に変更してみたところ、5分58秒かかりました。そんなところですね。


<補足>

2.8GHzのPCで計算したところ、上記の7000桁が1分50秒で結果が出ました。3.2GHzのPCは22秒でした。ずいぶん早く計算できるのですね。




ご質問のある方は以下のところへお願いします。

      メール アイコン





数学公式


リーマン仮説(予想)証明





履歴
2010/03/28 ver 3.0 を配布開始
2010/04/05 ver 3.1 複素数の計算プログラムTk4.class にバクがあったので、変更。
2010/09/04 ver 3.8 Tk4.kaijoo(aw,cw,p3)を一部修正
2012/01/11 ver 3.9 Tk.div(a,b,c)を一部修正
2012/05/24 ver 3.10 Tk4.pow(aw,bw,cw)を一部修正
2012/06/05 ver 3.11 Tk4.div(a,b,c)を変更。以前のものはTk4.div02(a,b,c) として保存。
2013/04/25 新しいJavaをインストールしたところ画像プログラムが動かなくなったので、ダウンロードしないように警告。
2013/05/30 付録(その2)を追加
2015/09/21 零線図の描き方 を追加。巨大数はしばらく中止に。