バシク行列計算機に実装されているバシク行列の最新バージョンは、バシクさんのオリジナル定義ではバージョン2です。それぞれの定義はユーザー:Kyodaisuu/バシク行列のバージョンにまとめました。バージョン2の後もユーザーブログ:BashicuHyudora/BASIC言語による巨大数のまとめでは定義が更新されているようなので、そろそろ計算機に入れようかと考えています。

バシクさんの定義

ユーザーブログ:BashicuHyudora/BASIC言語による巨大数のまとめの 21:32, June 12, 2018 に更新されたバージョンが、このブログ執筆時点での最新バージョンです。これを以下にコピーしました。

Yabasic への翻訳

まずは BASIC の文法チェックをするために、Yabasic に翻訳しました。いくつかの文法エラーを直しました。それが以下のプログラムです。

変更した箇所は、

  1. Dim の中の∞を有限の値にしました。とりあえず文法チェックを通すための暫定です。
  2. 配列の [] を () にしました。例:B[1,E] → B(1,E)
  3. & を and にしました。
  4. | を or にしました。
  5. L.39: 計算順序を確定するために () を加えました。
  6. L.26, 39: endif を加えました。

これで文法エラーはなくなりました。配列を有限にしているので配列が足りないというエラーになります(Redim で定義し直すこともできますが、結局メモリが足りなくなるだけなのでこのままでは計算は終了しません)。

計算過程の表示

上の直訳プログラムでは計算の様子が見えないので、計算過程表示プログラムにしました。

このプログラムでは

  1. 入力されたバシク行列の計算過程を表示する
  2. n = constant とする
  3. Maxmum length of sequence を 30 とする

という設定で計算をします。(0,0,0)(1,1,1)(1,1,0)[2] を入力した時の計算結果は、このようになりました(最初はバグっていましたが、バシクさんのデバッグで動くようになりました)。

(0,0,0)(1,1,1)(1,1,0)[2]
(0,0,0)(1,1,1)(1,0,0)(2,1,1)(2,0,0)(3,1,1)[2]
(0,0,0)(1,1,1)(1,0,0)(2,1,1)(2,0,0)(3,1,0)(4,2,0)[2]
(0,0,0)(1,1,1)(1,0,0)(2,1,1)(2,0,0)(3,1,0)(4,1,0)(5,1,0)[2]
(0,0,0)(1,1,1)(1,0,0)(2,1,1)(2,0,0)(3,1,0)(4,1,0)(5,0,0)(6,1,0)(7,1,0)(8,0,0)(9,1,0)(10,1,0)[2]
(0,0,0)(1,1,1)(1,0,0)(2,1,1)(2,0,0)(3,1,0)(4,1,0)(5,0,0)(6,1,0)(7,1,0)(8,0,0)(9,1,0)(10,0,0)(11,1,0)(12,0,0)(13,1,0)[2]
(0,0,0)(1,1,1)(1,0,0)(2,1,1)(2,0,0)(3,1,0)(4,1,0)(5,0,0)(6,1,0)(7,1,0)(8,0,0)(9,1,0)(10,0,0)(11,1,0)(12,0,0)(13,0,0)(14,0,0)[2]
(0,0,0)(1,1,1)(1,0,0)(2,1,1)(2,0,0)(3,1,0)(4,1,0)(5,0,0)(6,1,0)(7,1,0)(8,0,0)(9,1,0)(10,0,0)(11,1,0)(12,0,0)(13,0,0)(13,0,0)(13,0,0)[2]
(0,0,0)(1,1,1)(1,0,0)(2,1,1)(2,0,0)(3,1,0)(4,1,0)(5,0,0)(6,1,0)(7,1,0)(8,0,0)(9,1,0)(10,0,0)(11,1,0)(12,0,0)(13,0,0)(13,0,0)(12,0,0)(13,0,0)(13,0,0)(12,0,0)(13,0,0)(13,0,0)[2]
(0,0,0)(1,1,1)(1,0,0)(2,1,1)(2,0,0)(3,1,0)(4,1,0)(5,0,0)(6,1,0)(7,1,0)(8,0,0)(9,1,0)(10,0,0)(11,1,0)(12,0,0)(13,0,0)(13,0,0)(12,0,0)(13,0,0)(13,0,0)(12,0,0)(13,0,0)(12,0,0)(13,0,0)(12,0,0)(13,0,0)[2]
(0,0,0)(1,1,1)(1,0,0)(2,1,1)(2,0,0)(3,1,0)(4,1,0)(5,0,0)(6,1,0)(7,1,0)(8,0,0)(9,1,0)(10,0,0)(11,1,0)(12,0,0)(13,0,0)(13,0,0)(12,0,0)(13,0,0)(13,0,0)(12,0,0)(13,0,0)(12,0,0)(13,0,0)(12,0,0)(12,0,0)(12,0,0)[2]

次のステップですが、まずは BM1, BM2, BM3 の計算結果をまとめて比較するスクリプトを書いてなにが変わっているのかを調べてから C の移植に入ろうと思います。

BM2 との違い

この数列については、すべて最初の2ステップの計算が BM2 と最新バージョンで同じになります。

最新バージョンは、バシク行列バージョン2と同じなのでしょうか?もし違うのだとすれば、計算結果が変わる例を教えてください。

バシクさんに教えてもらいました。

(0,0,0)(1,1,1)(2,1,0)(1,1,1)[2]

の計算結果が、次のように変わります。

BM1とBM2

(0,0,0)(1,1,1)(2,1,0)(1,1,1)[2]
(0,0,0)(1,1,1)(2,1,0)(1,1,0)(2,2,1)(3,2,0)(2,2,0)(3,3,1)(4,3,0)[2]
(0,0,0)(1,1,1)(2,1,0)(1,1,0)(2,2,1)(3,2,0)(2,2,0)(3,3,1)(4,2,0)(5,3,1)(6,2,0)(7,3,1)[2]

BM3

(0,0,0)(1,1,1)(2,1,0)(1,1,1)[2]
(0,0,0)(1,1,1)(2,1,0)(1,1,0)(2,2,1)(3,1,0)(2,2,0)(3,3,1)(4,1,0)[2]
(0,0,0)(1,1,1)(2,1,0)(1,1,0)(2,2,1)(3,1,0)(2,2,0)(3,3,1)(4,0,0)(5,1,1)(6,1,0)(5,1,0)(6,2,1)(7,1,0)(6,2,0)(7,3,1)(8,0,0)(9,1,1)(10,1,0)(9,1,0)(10,2,1)(11,1,0)(10,2,0)(11,3,1)[2]

これで、計算がどのように変わるかがわかったので、このバージョンを「バージョン3」として、バシク行列計算機への移植を開始します。

変数一覧

BASIC C 意味
A num バシク行列の引数の自然数
B(x,y) S[y+x*nr] バシク行列 (nr は行数)
C(y) Delta[y] バシク行列システムの計算ルールに書かれているΔ
E row バシク行列の行数 - 1 (= nr-1)
F n バシク行列の列数 - 1
G k ピボット列
H l
I bad 悪い部分の列数

J, K, L, M はループカウンター。Cでも同じ変数名を使う。

計算機への実装

実装しました。これがバージョン3で変わる例です。

計算例

この数列については、Yabasic のコードとCのコードで結果が一致することを確認しました。もし、なにか動きがおかしいところがありましたら教えてください。

特に記載のない限り、コミュニティのコンテンツはCC-BY-SA ライセンスの下で利用可能です。