多倍長演算でn元連立一次方程式を解きます「連次朗 v.00」

1.n元連立一次方程式を解きます

a(0,0) * x(0) + a(0,1) * x(1) + a(0,2) * x(2) + ,,, a(0,n-1) * x(n-1) + a(0,n)   = 0
a(1,0) * x(0) + a(1,1) * x(1) + a(1,2) * x(2) + ,,, a(1,n-1) * x(n-1) + a(1,n)   = 0
a(2,0) * x(0) + a(2,1) * x(1) + a(2,2) * x(2) + ,,, a(2,n-1) * x(n-1) + a(2,n)   = 0
,,,
a(n-1,0)*x(0) + a(n-1,1)*x(1) + a(n-1,2)*x(2) + ,,, a(n-1,n-1)*x(n-1) + a(n-1,n) = 0
未知数の個数はn個。
a(i,j)が係数、x(i)が解(i=0~n-1, j=0~n)

2.機能・性能

(1)CSV形式のn元連立一次方程式の係数項目ファイルを読み込んで多倍長演算で解を求めます。
(2)計算精度は京^-mで(m=1~1024)の範囲で指定できます。(京=10000000000000000=10^16)
  凡例)m=2の時は0.00000000000000000000000000000001(小数点以下32桁)の精度で演算します。
(3)1計算項目当たりの項目サイズは6クワード以上。(1クワード=8バイト)
  計算精度に比例して1計算項目当たりの項目サイズは大きくなる。
  補足)項目サイズ設定値の目安はm<6未満のときは8、m≧6のときはm+2
(4)計算可能な未知数の個数は、項目サイズ=8、計算精度=4の条件では
  計算項目の確保サイズ(65536*4095)/項目サイズ(8)→確保できる項目数(33546240)
  n * (n+1) < 33546240 を満たす最大のn → 5791
  計算時間の制限がなければ最大5791元連立一次方程式の解を求めることができます。
  補足)5791元の場合の所要時間は35時間程度と予想されます
(5)解の算出~検算の所要時間(項目サイズ=8、計算精度=4 Intel(R) Core(TM) i5-8500での実測値)
    n        所要時間
   100          1秒360
   200         10秒102
   300         37秒232
   400      1分21秒882
   500      2分40秒094
   600      4分42秒411
  1000     21分54秒038
  2000    171分20秒511
  2000超  未実施
  補足)所要時間はnが2倍になると2^3倍、計算精度を2倍にすると2倍になります。

3.実行環境

WINDOWS 10/11(稼働確認した環境です)のコマンドプロンプトから実行します。
エクセルで作成した係数項目をCSV形式保存したテキストファイル入力を想定しています。

4.ダウンロード

をダウンロードしてreadme.txtを参照の上利用してください。
連次朗v00.zip    ←クリック
(102kb)
zipの解凍結果    内容
linear.exe       プログラム本体
ren4ng.csv       サンプルデータ(未知数4個で一意解がないケース)
ren4.csv         サンプルデータ(未知数4個)
ren100.csv       サンプルデータ(未知数100個)
go.bat           サンプルデータ実行用バッチファイル
readme.txt       インストール、使い方解説
連次朗.txt       利用説明書
トップへ

★参考(アルゴリズム)

係数項目a(i,j)をCSV形式で作成したテキストファイルを読み込んでガウスの消去法で解きます
 
step1.係数ファイルを 配列a(0~n-1 ,0~n)へ読込
a(0,0)    a(0,1)    a(0,2)    ,,,    a(0,n-1)     a(0,n)
a(1,0)    a(1,1)    a(1,2)    ,,,    a(1,n-1)     a(1,n)
a(2,0)    a(2,1)    a(2,2)    ,,,    a(2,n-1)     a(2,n)
,,,
a(n-1,0)  a(n-1,1)  a(n-1,2)  ,,,    a(n-1,n-1) a(n-1,n)
 
step2.前進消去(部分ピボット選択を採用します)
 (1) (2) を i = 0,1,,,n-2 の順に実行
   (1)ピボット選択
     a(i,i)~a(n-1,i)から絶対値が最大となるa(x,i)を求める
     a(x,i)=0の時は一意解がない→処理終了
     x≠i の時はi行とx行を総入替する
   (2)a(i,i)の行下部の削除および列右側の係数再計算
     ①~③をj = i+1,i+2,,,n-1の順に実行
       ①α←a(j,i)
       ②a(j,i)←0
       ③列右側の係数再計算(y = i+1,i+2,,,n の順に実行)
         a(j,y) ← a(j,y) - (α * a(i,y)) / a(i,i)
 
step3.後退代入
 (1) (2) を i = n-1,n-2,,,0 の順に実行
   (1) a(i,n) に a(i,j) * x(j) を加える[ただし、j=n-1,n-2,,,i+1]
   (2) x(i) ← -1 * a(i,n) / a(i,i)
 (3)  解(x(i))をCSV形式でファイル出力
 
step4.検算
 (1) 係数項目の再読み込み
 (2) 解を代入して式の計算(i=0,1,,,n-1の順に実行)
    a(i,0) * x(0) + a(i,1) * x(1) + a(i,2) * x(2) + ,,, a(i,n-1) * x(n-1) + a(i,n)

特記事項

(1)ソフトの実行結果について作者は十分に検証していますが
他者が実行した結果については保証しません。
利用者の責任において実行してください。
 
(2)ソフトが不要になった場合
インストール先のフォルダを全て削除すればアンインストールされます。
履歴
2022.11.19(大安) 新規掲載

2022.11.19(大安) by BJ(Boke-Jiisan)