Schönhage–Strassenアルゴリズムではどのように内側のリングが選択されますか?


9

私はSchönhage–Strassen整数乗算アルゴリズムを実装しようとしましたが、再帰的なステップで障害にぶつかりました。

Iは、値有するxnビットを、私は計算したい。私はもともとアイデアが選ぶことだと思ったように4 ^ K \ GEQ 2N、分割XK ^ 2と各片2 ^ {K-1}ビットモジュロ作業中に、SSAの畳み込みを適用する2 ^ {2 ^ kは} +1、値ごとに2 ^ kビットの容量を持つリング。次に、ピースを元に戻します。ただし、たたみ込みの出力には2nビットより少し多い(つまり、> 2 ^ kK 4 、K2 N X 2 、K 2 、K - 1 2 2 K + 1 2 K 2 N > 2 Kx2(mod2n+1)k4k2nx2k2k122k+12k2n>2k出力値あたりのビット数。これは、各出力値がいくつかの積の合計であるため、リングの容量よりも大きいため、これは機能しません。私は2倍のパディングを追加する必要がありました。

パディングのその2の余分な要素は、複雑さを台無しにします。それは私の再帰的なステップを高すぎます。F(n)=nlgn+nF(2n)=Θ(nlgnlglgn)アルゴリズムの代わりに、F(n)=nlgn+nF(4n)=Θ(nlg2n)アルゴリズム。

私はウィキペディアからリンクされているいくつかの参考文献を読みましたが、それらはすべて、この問題がどのように解決されるかについての詳細に光沢がないようです。たとえば、2の累乗ではないpに対して2p2k+1を法として処理することにより、余分なパディングオーバーヘッドを回避できますが、非累乗のみの場合、後でうまくいきません。 of-2要素が残り、ピースの数を2倍にしないとCooley-Tukeyを適用できません。また、p2 ^ p + 1を法とする乗法逆行列を持たない場合があります。したがって、導入されている2の強制要因はまだあります。pp2p+1

漸近的な複雑さを吹き飛ばすことなく、再帰的なステップで使用するリングを選択するにはどうすればよいですか?

または、擬似コード形式で:

multiply_in_ring(a, b, n):
  ...
  // vvv                          vvv //
  // vvv HOW DOES THIS PART WORK? vvv //
  // vvv                          vvv //
  let inner_ring = convolution_ring_for_values_of_size(n);
  // ^^^                          ^^^ //
  // ^^^ HOW DOES THIS PART WORK? ^^^ //
  // ^^^                          ^^^ //

  let input_bits_per_piece = ceil(n / inner_ring.order);
  let piecesA = a.splitIntoNPiecesOfSize(inner_ring.order, input_bits_per_piece);
  let piecesB = b.splitIntoNPiecesOfSize(inner_ring.order, input_bits_per_piece);

  let piecesC = inner_ring.negacyclic_convolution(piecesA, piecesB);
  ...

複数のサイトに同じ質問を投稿しないでください。各コミュニティは、だれもが時間を無駄にすることなく、正直に答える必要があります。2つのコピーのうち1つを削除することをお勧めします。
DW

@DW完了。csが1週間何の答えも返さなかった後、私はクロスポストしました。明らかに答えをリンクバックするつもりでした。
Craig Gidney

わかります。今後表示される場合は、投稿にモデレーターの注意を向けてフラグを付け、移行を依頼することができます。CSTheoryに移動することができます。ご理解のほどよろしくお願いいたします。
DW

3
の形式のモジュロ数を処理するアルゴリズムのバージョンがあります:。複雑な係数を持つ多項式の数値の乗算と除算のための漸近的に高速なアルゴリズム。EUROCAM '82:ヨーロッパのコンピュータ代数会議、Lect。ノートコンプ サイエンス。144、3-15。iai.uni-bonn.de/~schoe/publi39.dvi2ν2n
MarkusBläser16年

IIRCは、今削除されたCSの質問に対して部分的な自己回答がありました。それを失うのは残念だ。ここに含めてもらえますか(質問に回答済みのマークが付けられないように)。
Peter Taylor

回答:


4

この答えは、Markusがコメントでリンクした論文「数値係数と多項式の複素係数の除算のための漸近的に高速なアルゴリズム」から引用されています。


法としてビットの数値を二乗したいとします。ここではあなたが何をすべきかです:2 n + 1n2n+1

  • およびを満たすおよびを見つけます。、S 、N = P - 1 2 S S P 2 psn=(p1)2ssp2s

  • ビットを分割するピースの数と、ピースサイズの対応するパラメーターを選択します。 n2mn

    m=s/2+1s2=s/2+1p2=p/2+1

    とは引き続き不変量を満たしていることに注意してください。また、が満たされているため、入力はキャリー用のスペースに適合しています。s2p2s2p22s22m2s2p22n+m+1

  • 通常どおり、FFTベースのネガサイクリック畳み込みを部分と残りの部分に対して実行します。

つまり、これが包括的な考え方です。対数パディング係数です。次に、複雑度分析について説明します。FFTがかかりますやるべき仕事を、そして上の私たちだ再帰サイズの断片、今、私たちは漸化式WRTで非常にラフな計算を行うことができます:pnm2m(p21)2s2s

F(s)()(p1)2sm+2mF(s/2+1)()2s2s(s/2+1)+2s/2+1F(s/2+1)()s22s+22s/2F(s/2+1)()s22s+4(s/2)22s+16(s/4)22s+...()2ss2lg(s)()nlgn(lgnlgn)2lglgnlgn()nlgn(lg2n)lglgn()n(lgn)lglgn

私はそれらのステップでかなりのことを騙しましたが、それはほぼ正しいようです。

「トリック」は、基本コストがではなくになることのようです。質問で不平を言っていたように、再帰レベルごとに2による乗算はまだ2つありますが、今ではの半減が2被除数を支払い、すべてうまくいきます。次に、最後に、最初にに対して対数的に大きくすることにより、余分な係数(実際には係数)をキャンセルし。 s s s log n p ss2ssslognps

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.