萌えハッカーニュースリーダー

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

出典: https://gist.github.com/VictorTaelin/5776ede998d0039ad1cc9b12fd96811c
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

それは博士の願望ですよね?

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

Search