Maxima で綴る数学の旅

紙と鉛筆の代わりに、数式処理システムMaxima / Macsyma を使って、数学を楽しみましょう

-その他- Maxima組込のゼータ関数のバグ

f:id:jurupapa:20201211005507j:plain

時々びっくりするようなことが起こります。

今回は、Maximaゼータ関数の数値実験をしようといくつかの計算を試していたのですが、以下のようなバグに遭遇しました!

Maxima 5.44.0 http://maxima.sourceforge.net

using Lisp SBCL 2.0.10

Distributed under the GNU Public License. See the file COPYING.

Dedicated to the memory of William Schelter.

The function bug_report() provides bug reporting information.

(%i1) zeta(%i),numer;

 

Maxima encountered a Lisp error:

 

arithmetic error DIVISION-BY-ZERO signalled

Operation was (/ 1.0 0.0).

 ただ虚数単位\(i\)でのゼータ関数の値を数値で求めようとしただけです。いきなり「ゼロ割り」エラーです。びっくりです。ソース(src/combin.lisp)を見るとゼータの数値計算用の関数float-zetaの中に、引数が純虚数だとゼロ割りを起こす部分を発見しました。

ちょっと自分では直せそうにないので、本家のメーリングリストにバグとゼロ割りを起こしている場所だけ報告したところ、実は約1ヶ月前にバグレポートが発行されている、とのことでした。いずれにしろRaymond Toyさんが直してくれるそうです。

数値計算のコードを見るのは今回初めてだったのですが、多倍長計算に対応したコーディングやアルゴリズムの選択、引数に応じて違うアルゴリズムを使う場合の整合性など気にする点が色々とあり結構難しそうなコードでした。

今回の場合、純虚数の場合にはゼータの関数等式を使って、純虚数でない場合に帰着する方法も考えたのですが、自分でやると下手なコーディングで別のバグを仕込みそうだったので、他の方にお願いした次第です。

次のバージョン(5.45.0かな)には修正が取り込まれると思います。