fftとバイナリ分割法を使用して、非常に大きな n (最大 100 万)の階乗を計算するプログラムをCで実装しようとしています。
任意精度の integerを表す単純なライブラリを実装しました。fftとifftを計算するには、「C の数値レシピ」のtwofft.cとfour1.cルーチンを使用します。
特定の n まではすべてうまくいきますが、数値 (浮動配列) が大きすぎると、正規化と丸めの後のifft (four1 で計算) の値が正しくなくなります。
たとえば、40 個のゼロで終わる 2000 桁の 2 つの数値があり、それらを (fft を使用して) 互いに乗算する必要がある場合、ifft を計算すると、いくつかの末尾のゼロが「1」になります。これは、この「ゼロ」の 1 つ (たとえば 0,50009) を丸めたときに、「1」になったために発生します。さて、私の実装が間違っているのか、それともこの数値を別の方法で丸める必要があるのか わかりません。バイナリ分割法と素因数分解の両方を使用しようとしましたが、n >= 9000の場合、結果は間違っています。
これを解決する方法はありますか?ご清聴ありがとうございました。下手な英語で申し訳ありません。