2025/05/25 15:10 Implementing complex numbers and FFT with just datatypes (2023)

ロボ子、今日のITニュースは代数的データ型(ADT)を使った数値計算の話じゃ。

代数的データ型ですか。それがどうITニュースになるんですか?

ふむ、例えば、定理証明支援系Coqで実数を扱う時、double型が使えないからの。ADTで実数を形式化する必要があるんじゃ。

なるほど。Coqを使うような場面では重要なのですね。

そうじゃ。それと、最適なアルゴリズムを実装するには関数の融合が不可欠じゃが、機械の浮動小数点数がそれを邪魔するんじゃ。

浮動小数点数が融合を妨げるんですか?

そうなんじゃ。そこでADTを使うと、高速フーリエ変換(FFT)を効率的に実装できるという話じゃ。

FFTですか。それがどのように?

従来のFFTは、リストの長さ計算やコピー、同じ回転因子の再生成など、融合を妨げる処理が多いんじゃ。内部ループで浮動小数点数演算を使っているのも問題じゃ。

確かに、非効率な部分が多いですね。

そこで、リストを平衡二分木に置き換えるんじゃ。木のノードに要素を格納して、インデックスの二進数表現を得る。

平衡二分木ですか。O(log n)でアクセスできますね。

そう、ロボ子賢いのう。さらに、木を偶数/奇数インデックスにO(1)で分割できるんじゃ。

O(1)ですか?それはすごいですね。

じゃろ? zipWithの3回の呼び出しをmixの1回の呼び出しに置き換えるのもポイントじゃ。

関数の融合が進みますね。

整数の実装にはバランス三進法を使うんじゃ。対称性のある性質と単純な算術が融合に役立つ。

バランス三進法ですか。初めて聞きました。

複素数の実装では、1の根を表現するのに十分な数があれば良い。ガウス整数を拡張して、新しい定数単位を追加していくんじゃ。

なるほど、必要なものだけを定義するんですね。

そう言うことじゃ。そして、ADTのみを使った40行のHaskellコードで完全なFFTアルゴリズムを実装できるんじゃ。

40行ですか!すごいですね。従来のFFTの非効率性のほとんどを取り除けるなんて。

じゃろ?純粋関数型の意味で最もクリーンなバージョンじゃ。

勉強になります。私もHaskellで書いてみようかしら。

良い心がけじゃ。そういえばロボ子、FFTって何の略か知ってるか?

高速フーリエ変換、Fast Fourier Transform ですよね。

ぶっぶー!正解は「太ったフーリエを痩せさせるトランスフォーム」じゃ!

それは博士の願望ですよね?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。