19 暑いので ChatGPT にプログラムを書かせてみる

プログラム作成を ChatGPT にやらせたら、今回はちゃんとできた(みたい)、 という話を書く。 ちなみに少し前に出て来た GPT-5 を使ったわけであるが、 古いのでやってどうなるかまでは、試してみてない。


(プログラミングについては、 ChatGPT はこんなこともやってくれる、自分の仕事が減ってしまった、 という話を聞く一方で、なかなか上手くいかない、という人もいて、 こちらとしては、やってくれれば嬉しいので、 やり方を身につけるためにも、ときどき試しにやらせてみている。 今回もその一貫。 暑いので自分でプログラムを書く気力がなかった、という面もある。)


古い本に載っていたアルゴリズムが良く分からない。説明が納得いかない。 言葉遣い自体(数学用語の使い方)が少し変なので、 読んで分からなくても仕方がないのかも(実は説明が出来ていない)、 という気もする。

せめて計算手順だけでも省略せずに書いてくれればいいのになあ。 計算手順だけなら、著者が使い慣れない数学用語を使わなくても済むだろうに。

今回は、幸い、プログラムが提供されていた。 プログラムならば少なくとも計算手順はちゃんと書かれているはずだ、 というわけで解読にかかる。

こういうとき、プログラムが実行できると、とても助かる。 色々途中の計算結果を出力させられるので。 というわけで、こういうときは、 プログラムの実行を実現するためにそれなりに労力をさくことにしている。

あれ?書かれていないサブルーチン呼び出しをしている。 なんだろう、これは?富士通SSL? あ、大型計算機用に提供されていた数値計算ライブラリィか。 (聞いたことはあるけれど、使ったことはない。私はギリギリで、 大型計算機文化にはふれずに済んでしまった人間である。) ネットで検索したところ、そういう名前のライブラリィがあることは確認できたが、 使用しているサブルーチンの仕様までは見つけることが出来なかった。

まあ、大体の仕様は推察できたので、 ChatGPT にやらせてみることにした。

古いFortranプログラムを解読しようとしていて、 そのために実行しようとしています。 中でライブラリィ・サブルーチンをcallしていて、 それがないためにコンパイル・リンクできません。

call GAUELS (AB, LDAB, N, NN, EPS, ILL)

GAUELS は富士通のSSLという数値計算ライブラリィに含まれるものらしいですが、 詳しい仕様は分かりません。

目的は連立1次方程式 AX=B を解くことです。

Aは密行列で、対称性もない、いわゆる一般の正則行列です。 変数として REAL AB(LDAB,整数) と宣言されている。 LDAB は leading dimension of AB ということでしょう。

Nは未知数の個数、あるいは係数行列 A の次数です。当然 N<=LDAB です。

Bはベクトルをいくつか並べてできた行列です。 内容的にはN次元ベクトルがm個並んだもの。 こちらが求めたいものは A^-1 B を計算するということになります。

NNは N+m を指定する。私が走らせたいプログラムでは、 m=1 なので、NNはN+1という値を指定しています。

EPS の意味は良く分かりませんが、1.0E-5 という値をセットしています。 考えられるのは、A の条件数の見積もりが 1/EPS より大きくなったら、 解の精度が十分でないので、正常に実行できないと判定することでしょうか。 単精度なので 1.0E-5 という値は納得できるものです。

ILL は終了コードらしく、正常に実行できた場合は0, そうでなければ0でない値を返すようです。

次のどちらか(あるいは両方)をしてください。

(1) GAUELS() の Fortran コードを作る。 アルゴリズムを理解するためのテスト実行ができればよいので、 性能やエラー対処はほどほどで結構です。

(2) LAPACK は使えるので、 LAPACK の適当なサブルーチンを call するいわゆるラッパーを作る。

よろしくお願いします。

あまりきちんと説明できていないような気がするが (人間相手にこんな雑なリクエストはしないと思う)、 幸い ChatGPT にはうまく伝わったようで、 (1), (2) ともプログラムが出来た。

gfortran nantoka.f gaules.f

gfortran nantoka.f gaules-using-lapack.f -llapack

どちらも何の警告もなくコンパイルできて、 実行結果も末尾1桁がところどころ1ずれるくらいで、 ほぼ同じになった。とりあえずは、大丈夫そうで、先に進んでも良さそうだ。


よく出来ました。


では、出来たプログラムを C++ にトランスレートしてください…



桂田 祐史