<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE page SYSTEM "../../com/dtd/myml.dtd">
<?xml-stylesheet type="text/xsl" href="../Trans_xml.xsl"?>
<page>


<head>
	<filename>index</filename>
	<belong>Archives program</belong>
	<title>巨大数演算</title>
	<description>電卓では計算しきれない桁数の数字をJavaScriptで計算するプロジェクト。</description>
	<directory>../../</directory>
	<archives>../</archives>
	<date_making year="2005" month="05" day="03" />
	<date_update year="2011" month="01" day="22" />
	<xmlversion type="def" ver="1.0" />
	<pageid>B22L1pSYIuRb</pageid>
</head>


<navigation>
	<direct isArchives="yes" isXML="yes" href="../index">Archives program</direct>
	<direct>巨大数演算</direct>
</navigation>



<body>


<section>

<h2>Ver.0.6(最新)</h2>
<ul>
  <li><a href="../0x00c_HugeFloat/index" isXML="yes">Huge Float Library</a></li>
</ul>
<p>FFTを導入し、巨大数演算と分離した新しいページで開発開始。Ver.0.5より桁違いに高速なライブラリ。</p>
</section>
<section>
<h2>Ver.0.5</h2>
<ul>
  <li><a href="0-5/index.html">Ver.0.5開発日記</a></li>
</ul>
<p>Ver.0.4をより合理的に整理したバージョン、alpha版で停止。</p>
</section>
<section>
<h2>Ver.0.4</h2>
<ul>
  <li><a href="0-4/index.html">Ver.0.4開発日記</a></li>
</ul>
<p>Ver.0.3より桁違いに高速なライブラリ。</p>
</section>
<section>
<h2>Ver.0.3以前のプログラム</h2>
<div class="menus">
<ul>
  <li><a href="#c0.3-alpha9">Ver.0.3-alpha9[加算/乗算高速化]</a>(最新版)</li>
  <li><a href="#c0.3-alpha8">Ver.0.3-alpha8[除算のバグを修正]</a></li>
  <li><a href="#c0.3-alpha7">Ver.0.3-alpha7[平方根高速化(ざっと10倍速)]</a></li>
  <li><a href="#c0.3-alpha6">Ver.0.3-alpha6[マイナーチェンジ]</a></li>
  <li><a href="#c0.3-alpha5">Ver.0.3-alpha5[乗算の速度が桁違いにUP]</a></li>
  <li><a href="#c0.3-alpha4">Ver.0.3-alpha4[除算強化]</a></li>
  <li><a href="#c0.3-alpha3">Ver.0.3-alpha3[累乗の剰余追加]</a></li>
  <li><a href="#c0.3-alpha2">Ver.0.3-alpha2[2進変換追加]</a></li>
  <li><a href="#c0.3-alpha1">Ver.0.3-alpha1[本格的な平方根追加]</a></li>
  <li><a href="#c0.3-alpha0">Ver.0.3-alpha0[マイナーチェンジ]</a></li>
  <li><a href="#c0.2-beta3">Ver.0.2-beta3[乗算強化]</a></li>
  <li><a href="#c0.2-beta2">Ver.0.2-beta2[階乗強化]</a></li>
  <li><a href="#c0.2-beta1">Ver.0.2-beta1[除算,円周率]</a></li>
  <li><a href="#c0.1-beta1">Ver.0.1-beta1[除算]</a></li>
  <li><a href="#c0.1-alpha6">Ver.0.1-alpha6[階乗計算速度UP]</a></li>
  <li><a href="#c0.1-alpha5">Ver.0.1-alpha5[掛け算の演算速度UP]</a></li>
  <li><a href="#c0.1-alpha4">Ver.0.1-alpha4[足し算,掛け算の演算速度UP]</a></li>
  <li><a href="#c0.1-alpha3">Ver.0.1-alpha3[足し算,掛け算の演算速度UP]</a></li>
  <li><a href="#c0.1-alpha2">Ver.0.1-alpha2[2進展開を用いた累乗関数]</a></li>
  <li><a href="#c0.1-alpha1">Ver.0.1-alpha1[加算速度15倍,乗算速度36倍→64倍]</a></li>
  <li><a href="#c0.0.3">Ver.0.0.3[小数点対応・掛け算計算速度36倍]</a></li>
  <li><a href="#c0.0.2">Ver.0.0.2[+掛け算]</a></li>
  <li><a href="#c0.0.1">Ver.0.0.1[足し算・引き算]</a></li>
  <li><a href="#c0.0.0">Ver.0.0.0[経緯]</a></li>
</ul>
</div>
<section>
<h3>詳細</h3>
<dl>
  <dt id="c0.3-alpha9"><a href="0-3alpha9/index.html">Ver.0.3-alpha9</a></dt>
  <dd>加算と乗算の桁上げ処理を速くした他、桁揃えやゼロ削除専用の関数を追加。</dd>
  <dt id="c0.3-alpha8"><a href="0-3alpha8/index.html">Ver.0.3-alpha8</a></dt>
  <dd>除算に含まれていたバグを修正。全ブラウザで414桁以上の平方根の計算が保障されます(多分)。ついでに求めた桁数をそのまま出力するのか、指定した桁数に整形して出力するのかを選択する機能を追加。</dd>
  <dt id="c0.3-alpha7"><a href="0-3alpha7/index.html">Ver.0.3-alpha7</a></dt>
  <dd>平方根の計算時に、最初から目標桁数で計算するのではなく演算精度ギリギリで計算します。結果的に10倍以上高速化。ガウス・ルジャンドルで円周率を求めることができるぐらいの速度になった。</dd>
  <dd>※平方根の計算は現時点ではIE以外でバグが発生します。現在デバグ中。</dd>
  <dt id="c0.3-alpha6"><a href="0-3alpha6/index.html">Ver.0.3-alpha6</a></dt>
  <dd>マイナーチェンジ。使用ファイル数がやたら多かったので全てを1つにまとめた。</dd>
  <dt id="c0.3-alpha5"><a href="0-3alpha5/index.html">Ver.0.3-alpha5</a></dt>
  <dd>今までは乗算計算の際、掛ける2数の長さをそれぞれAとBとした場合、AB/56回加算関数を呼び出していたが、筆算を応用しA/7回の呼び出しで計算を終了させられるようになった。</dd>
  <dd>これによって、乗算関数・階乗関数の計算速度が桁違いに上がった。配列云々と言っていたが、これは配列でいかに高速化しようと考えた末に考えた手法で、配列で行っても良かったのだがそのまま現在の文字列型に組み込んだ。配列ならゼロを追加する処理が不要なのでさらに加速できそうだ。</dd>
  <dt id="c0.3-alpha4"><a href="0-3alpha4/index.html">Ver.0.3-alpha4</a></dt>
  <dd>除算計算時の余分なゼロ減算を省いた結果、計算速度が2倍にアップ。</dd>
  <dt id="c0.3-alpha3"><a href="0-3alpha3/index.html">Ver.0.3-alpha3</a></dt>
  <dd>累乗の剰余を求める関数を追加。これは素数判定やRSAなど用途色々。この辺りから除算関数の低速性が浮き彫りになってきた。数百桁の素数を判定しようと考えているので、除算は今後重要になるだろう。</dd>
  <dd>乗算の高速化と同じ手法で除算も解決したい考え。</dd>
  <dt id="c0.3-alpha2"><a href="0-3alpha2/index.html">Ver.0.3-alpha2</a></dt>
  <dd>巨大な10進数を2進数に変換する関数を追加。手元のマシンでは100桁の10進数を0.2秒で2進数に変換。</dd>
  <dd class="comment">※36進数に変換するデモがありましたが、理論的に問題があったので削除しました。本当に36進数に変換されているかどうか検証したのち、復活させます。</dd>
  <dt id="c0.3-alpha1"><a href="0-3alpha1/index.html">Ver.0.3-alpha1</a></dt>
  <dd>本格的な平方根関数を追加、10桁区切り関数を再構成、バグ修正</dd>
  <dt id="c0.3-alpha0"><a href="0-3alpha0/index.html">Ver.0.3-alpha0</a></dt>
  <dd>マイナーチェンジ。</dd>
  <dt id="c0.2-beta3"><a href="0-2beta3/index.html">Ver.0.2-beta3</a></dt>
  <dd>乗算時に呼び出される加算関数を乗算専用のものに変更。階乗と累乗の計算速度が飛躍的に上昇した。</dd>
  <dd>1000!の計算に10秒もかからない。</dd>
  <dt id="c0.2-beta2"><a href="0-2beta2/index.html">Ver.0.2-beta2</a></dt>
  <dd>階乗計算時に、たかが100かけるのに巨大数演算のライブラリを使わなくていいようにした。</dd>
  <dt id="c0.2-beta1"><a href="0-2beta1/index.html">Ver.0.2-beta1</a></dt>
  <dd>巨大数演算による円周率計算のデモの動作速度を改善。余りを出力する割り算関数を追加。</dd>
  <dt id="c0.1-beta1"><a href="0-1beta1/index.html">Ver.0.1-beta1</a></dt>
  <dd>
  <p>円周率最優先のため、不完全であるが除算を実装。不完全なのでデモはなし。完全に実装でき次第演算デモをつける予定。また、引き算関数のバグを修正。(円周率が最優先なので、スクリプトには円周率を求めるものが含まれているが、これも最適化されていない)</p></dd>
  <dt id="c0.1-alpha6"><a href="0-1alpha6/index.html">Ver.0.1-alpha6</a></dt>
  <dd>階乗計算時に出てくる末尾の0は計算時には余計なループを増やすだけなので0が増え次第削除しループ回数を抑えた。</dd>
  <dd>100!を求めるのにかかった時間(Win32-MSIE6)</dd>
  <dd>
  <table summary="100!を求めるのにかかった時間(Win32-MSIE6)">
    <caption>100!を求めるのにかかった時間(Win32-MSIE6)</caption>
    <thead>
      <tr><th abbr="Version">Version</th><th abbr="秒数">秒数</th></tr>
    </thead>
    <tbody>
      <tr><td>Ver.0.0.2</td><td>32.454sec</td></tr>
      <tr><td>Ver.0.0.3</td><td>02.484sec</td></tr>
      <tr><td>Ver.0.1-alpha1</td><td>00.515sec</td></tr>
      <tr><td>Ver.0.1-alpha2</td><td>00.516sec</td></tr>
      <tr><td>Ver.0.1-alpha3</td><td>00.156sec</td></tr>
      <tr><td>Ver.0.1-alpha4</td><td>00.140sec</td></tr>
      <tr><td>Ver.0.1-alpha5</td><td>00.078sec</td></tr>
      <tr><td>Ver.0.1-alpha6</td><td>00.062sec</td></tr>
    </tbody>
  </table>
  </dd>
  <dd class="comment">(これらの時間には微妙な誤差がある。)</dd>
  <dt id="c0.1-alpha5"><a href="0-1alpha5/index.html">Ver.0.1-alpha5</a></dt>
  <dd>掛け算の右の0を代入するループ処理を減らし速度アップ</dd>
  <dd>
  <table summary="100!を求めるのにかかった時間(Win32-MSIE6)">
    <caption>100!を求めるのにかかった時間(Win32-MSIE6)</caption>
    <thead>
      <tr><th abbr="Version">Version</th><th abbr="秒数">秒数</th></tr>
    </thead>
    <tbody>
      <tr><td>Ver.0.0.2</td><td>32.454sec</td></tr>
      <tr><td>Ver.0.0.3</td><td>02.484sec</td></tr>
      <tr><td>Ver.0.1-alpha1</td><td>00.515sec</td></tr>
      <tr><td>Ver.0.1-alpha2</td><td>00.516sec</td> </tr>
      <tr><td>Ver.0.1-alpha3</td><td>00.156sec</td></tr>
      <tr><td>Ver.0.1-alpha4</td><td>00.140sec</td></tr>
      <tr><td>Ver.0.1-alpha5</td><td>00.078sec</td></tr>
    </tbody>
  </table>
  </dd>
  <dd class="comment">(これらの時間には微妙な誤差がある。)</dd>
  <dd>また、ルートXの平方根を求めるプログラムを追加したが方法がかなり古臭いのであまり期待しないでほしい。</dd>
  <dt id="c0.1-alpha4"><a href="0-1alpha4/index.html">Ver.0.1-alpha4</a></dt>
  <dd>最後に計算結果に含まれる余分な0を削除するためのwhileループの総数を削減しわずかに加速。</dd>
  <dd>
  <table summary="100!を求めるのにかかった時間(Win32-MSIE6)">
    <caption>100!を求めるのにかかった時間(Win32-MSIE6)</caption>
    <thead>
      <tr><th abbr="Version">Version</th><th abbr="秒数">秒数</th></tr>
    </thead>
    <tbody>
      <tr><td>Ver.0.0.2</td><td>32.454sec</td></tr>
      <tr><td>Ver.0.0.3</td><td>02.484sec</td></tr>
      <tr><td>Ver.0.1-alpha1</td><td>00.515sec</td></tr>
      <tr><td>Ver.0.1-alpha2</td><td>00.516sec</td></tr>
      <tr><td>Ver.0.1-alpha3</td><td>00.156sec</td></tr>
      <tr><td>Ver.0.1-alpha4</td><td>00.140sec</td></tr>
    </tbody>
  </table>
  </dd>
  <dd class="comment">(これらの時間には微妙な誤差がある。)</dd>
  <dd>また計算とは直接関係ないが詳細なデバッグを装備させた。</dd>
  <dt id="c0.1-alpha3"><a href="0-1alpha3/index.html">Ver.0.1-alpha3</a></dt>
  <dd>eval()で文字列を数値化する際、文字列の先頭に0が入ると文字列を10進数で数値化できなかった。
  この問題を解決するため先頭の0を削除するwhileループを加えていたが、eval()の代わりにparseFloat()を用いて先頭に0があっても10進数に強制変換。
  whileループ処理をカットした。結果、加算・減算・乗算の演算速度が平均2倍以上上がった。
  又一部のwhileループをswitchに変更した。</dd>
  <dd>
  <table summary="100!を求めるのにかかった時間(Win32-MSIE6)">
    <caption>100!を求めるのにかかった時間(Win32-MSIE6)</caption>
    <thead>
      <tr><th abbr="Version">Version</th><th abbr="秒数">秒数</th></tr>
    </thead>
    <tbody>
      <tr><td>Ver.0.0.2</td><td>32.454sec</td></tr>
      <tr><td>Ver.0.0.3</td><td>02.484sec</td></tr>
      <tr><td>Ver.0.1-alpha1</td><td>00.515sec</td></tr>
      <tr><td>Ver.0.1-alpha2</td><td>00.516sec</td></tr>
      <tr><td>Ver.0.1-alpha3</td><td>00.156sec</td></tr>
    </tbody>
  </table>
  </dd>
  <dd class="comment">(これらの時間には微妙な誤差がある。)</dd>
  <dd>四則演算プログラムの最適化は最終的に大きな速度アップにつながる。 これ以外の変更点として、8桁×8桁の掛け算に発生する誤差を防ぐため、8桁×7桁にした。
  掛け算の演算速度は数％ダウンするが止む終えない処置。</dd>
  <dt id="c0.1-alpha2"><a href="0-1alpha2/index.html">Ver.0.1-alpha2</a></dt>
  <dd>
  <ul>
    <li>10桁区切りプログラムのバグを修正</li>
    <li>累乗計算プログラムを追加</li>
  </ul>
  </dd>
  <dd>足し算・掛け算のプログラムはほとんどalpha1のまま。 唯一whileループをswitchに変えた個所があるのみ。
  alpha2のメインは累乗計算で、2<sup>100</sup>を手元のMSIE6では0.001秒以下で行います。 関数はAのB乗を計算する<code>Invo(A,B);</code></dd>
  <dt id="c0.1-alpha1"><a href="0-1alpha1/index.html">Ver.0.1-alpha1</a></dt>
  <dd>階乗のみを計算するプログラムだけ。具体的な変更は</dd>
  <dd>
  <ul>
    <li>加算関数を15桁区切りで計算→速度1500％アップ</li>
    <li>乗算関数を6桁→8桁区切りで計算→速度56％アップ</li>
    <li>階乗関数の動作を100!ごとに区切る→速度300％以上アップ</li>
  </ul>
  <p>また、微細ではあるがforループ100万回とwhileループ100万回ではwhileのほうがわずかに速かったので、関数に使用される一部のforループをwhileに変更した。
  alpha1.jsに内蔵されている関数についてはalpha1.js参照。</p></dd>
  <dt id="c0.0.3"><a href="0-0-3/index.html">Ver.0.0.3</a></dt>
  <dd>
  <ul>
    <li>足し算再構成</li>
    <li>引き算再構成</li>
    <li>小数点対応</li>
    <li>掛け算,演算速度36倍</li>
    <li>階乗計算専用プログラム</li>
  </ul>
  </dd>
  <dd>6桁同時計算で計算速度を6<sup>2</sup>、つまり36倍に上昇させた。(100!の計算時間は34sec→2.5sec)実験したい方はMath.jsをダウンロードし外部JSファイルから適当なHTMLに読み込む。</dd>
  <dd>足し算・引き算　<code>Addition(A,B);</code></dd>
  <dd>掛け算　<code>Multiplication(A,B);</code></dd>
  <dd>Factorial.jsには階乗計算　<code>Factorial(A);</code>　が内蔵されている。</dd>
  <dt id="c0.0.2"><a href="0-0-2/index.html">Ver.0.0.2</a></dt>
  <dd>デモには100!を計算するものがありますが手元で33秒かかったので注意してください。</dd>
  <dt id="c0.0.1"><a href="0-0-1/index.html">Ver.0.0.1</a></dt>
  <dd>
  <ul>
    <li>足し算実装</li>
    <li>引き算実装</li>
  </ul>
  </dd>
  <dd>小数点未対応。負の数も扱える。</dd>
  <dd>
  <ol>
    <li>2数の符号を判断</li>
    <li>符号から加算プログラムを使うか減算プログラムを使うかを判定</li>
    <li>1桁ずつループ計算</li>
    <li>余分な行を削り符号をつける</li>
  </ol></dd>
  <dt id="c0.0.0">Ver.0.0.0</dt>
  <dd>そもそも<a href="../../arch_acade/elf003_pai/index" isXML="yes">円周率を求める</a>でJavaScriptで計算できる桁数に限界があったことから挑戦は始まった。</dd>
  <dd>&lt;計画&gt;</dd>
  <dd>
  <ul>
    <li>足し算実装</li>
    <li>引き算実装</li>
    <li>掛け算実装</li>
    <li>割り算実装</li>
    <li>累乗計算実装</li>
    <li>階乗計算実装</li>
    <li>小数点対応</li>
  </ul>
  </dd>
  <dd>etc(とりあえずJavaScriptの全てのメソッドを独自のものに置き換える)</dd>
</dl>
</section>
</section>

</body>
</page>
