トゥーム・クック法(トゥーム3法とも呼ばれる)は、低複雑度という特徴を持つ新しいアルゴリズムを導入したアンドレイ・トゥームと、その記述を整理したスティーブン・クックにちなんで名付けられた、大きな整数に対する乗算アルゴリズムである。
2 つの大きな整数aとbが与えられた場合、Toom–Cook アルゴリズムはaとbをそれぞれ長さlのk個の小さな部分に分割し、各部分に対して演算を実行します。kが大きくなるにつれて、多くの乗算サブ演算を組み合わせることができ、アルゴリズム全体の計算複雑度が低減されます。乗算サブ演算は、Toom–Cook 乗算を使用して再帰的に計算でき、以下同様です。「Toom-3」と「Toom–Cook」という用語は、誤って互換的に使用されることがありますが、Toom-3 はk = 3 の場合の Toom–Cook アルゴリズムの単一のインスタンスにすぎません。
Toom-3 は 9 つの乗算を 5 つに減らし、一般的に、Toom-走る、 どこ、は部分乗算に費やした時間であり、は、小さな定数による加算と乗算に要する時間です(Knuth、p. 296)。カラツバアルゴリズムは、数を2つの小さな数に分割するToom-2アルゴリズムと同等です。4回の乗算を3回に減らすため、動作時間は。
指数はを増やすことで、1に任意に近づけることができる関数の定数項は非常に急速に増加する。[ 1 ] [ 2 ]混合レベルのToom–Cookスキームの成長率は、2005年時点ではまだ未解決の研究課題であった。[ 3 ] Donald Knuthによって記述された実装は、時間計算量を達成する。[ 4 ]
オーバーヘッドがあるため、Toom–Cook は小さな数での長い乗算よりも遅く、そのため通常は漸近的に高速なSchönhage–Strassen アルゴリズム(複雑度は )の前に中規模の乗算に使用されます。実用的になる。
トゥームは1963年にこのアルゴリズムを初めて記述し、クックは1966年に博士論文で改良された(漸近的に同等の)アルゴリズムを発表した。[ 5 ]
このセクションでは、任意のkの値に対して Toom- kを実行する方法を正確に説明しており、Marco Bodrato によって記述された Toom-Cook 多項式乗算の説明を簡略化したものです。[ 6 ]このアルゴリズムには 5 つの主要なステップがあります。
一般的な大きな整数の実装では、各整数は位取り記数法による桁の並びとして表され、基数または底は(通常は大きな)値bに設定されます。この例ではb = 10000 を使用する ため、各桁は 4 桁の 10 進数に対応します(コンピュータの実装では、b は通常 2 のべき乗になります)。乗算される 2 つの整数が次のようになっているとします。
これらは、トゥーム・クック法で通常処理されるものよりもはるかに小さい(小学校の掛け算の方が速い)が、アルゴリズムを説明するのに役立つだろう。
Toom- kでは、因子をk 個の部分に分割します。
最初のステップは、基数B = b iを選択することです。基数Bにおけるmとnの桁数がどちらも最大でk 桁(例えば、Toom-3 では 3 桁)になるようにします。iの典型的な選択例は次のとおりです。
この例ではToom-3を実行するので、B = b 2 = 10 8を選択します。次に、 mとnを基数Bの数字m i、n iに分けます。
次に、これらの数字を次数( k − 1)の多項式pとqの係数として使用します。ただし、 p ( B ) = mおよびq ( B ) = nという性質を持ちます。
これらの多項式を定義する目的は、それらの積r ( x ) = p ( x ) q ( x )を計算できれば、答えはr ( B ) = m × nになるということです。
乗算される数値の大きさが異なる場合、mとnに対して異なるk値( k mとk nと呼ぶ)を使用すると便利です。例えば、アルゴリズム「Toom-2.5」は、k m = 3、k n = 2のToom-Cookアルゴリズムを指します。この場合、B = b iのiは通常、次のように選択されます。
多項式積を計算するためのトゥーム・クック法はよく使われるものです。次数 の多項式であることに注意してください。は、点(例えば、直線 – 1次の多項式は2つの点で指定される)。アイデアは評価することである。そして様々な点における値を求めます。次に、これらの点における値を掛け合わせて、積多項式上の点を求めます。最後に、補間によって係数を求めます。
以来必要になる最終結果を決定するポイント。これをToom-3の場合、アルゴリズムは、どの点を選択しても機能します(いくつかの小さな例外を除きます。補間における行列の可逆性の要件を参照してください)。ただし、アルゴリズムを簡略化するために、0、1、-1、-2 のような小さな整数値を選択するのが望ましいです。
よく使われる珍しい点値の 1 つは無限大で、または多項式を「評価」するには無限大では、実際には極限を取ることを意味しますとして無限大に及ぶ。したがって、は常にその最高次係数の値です(上記の例では係数)
Toom-3の例では、ポイントを使用します、、、、 そしてこれらの選択により評価が簡素化され、以下の式が得られます。
そして同様にこの例では、得られる値は次のとおりです。
図に示すように、これらの値は負の値になる場合があります。
後々の説明のために、この評価プロセスを行列とベクトルの乗算として捉えると便利だろう。行列の各行には評価点の1つのべき乗が含まれ、ベクトルには多項式の係数が含まれる。
行列の次元は、pの場合はd × k m、qの場合はd × k nです。無限大を表す行は、最後の列の 1 を除いて常にすべてゼロです。
多点評価は、上記の式よりも高速に実行できます。基本演算(加算/減算)の数を減らすことができます。Bodrato [ 6 ]がToom-3 用に与えたシーケンスは、実行例の最初のオペランド(多項式p)に対して、次のようになります。
この数列では、加算/減算演算が 5 回必要で、単純な評価よりも 1 回少なくなります。さらに、乗算は計算において救われた。
多項式を掛け合わせるのとは異なり、そして評価された値を乗算するそしてこれは単に整数の乗算を行うだけで、元の問題のより小さな例です。評価された各点のペアを乗算するために、乗算手順を再帰的に呼び出します。実際の実装では、オペランドが小さくなるにつれて、アルゴリズムは教科書的な乗算に切り替わります。r を積多項式とすると、この例では次のようになります。
図に示すように、これらは負の値になることもあります。十分に大きな数の場合、これは最もコストのかかるステップであり、サイズに対して線形ではない唯一のステップです。そして。
これは最も複雑なステップであり、評価ステップの逆です。積多項式上の点そこで、その係数を決定する必要があります。言い換えれば、右辺のベクトルについて、この行列方程式を解きたいのです。
この行列は評価ステップの行列と同じ方法で構築されますが、この方程式はガウス消去法のような手法で解くこともできますが、計算コストが高すぎます。そこで、評価点を適切に選択すればこの行列は可逆であるという事実を利用します(ヴァンデルモンド行列も参照)。したがって、次のようになります。
残るは、この行列とベクトルの積を計算することだけです。行列には分数が含まれていますが、結果として得られる係数は整数になるため、加算、減算、および小さな定数による乗算/除算といった整数演算だけで全て実行できます。Toom–Cook における難しい設計上の課題は、この積を計算するための効率的な操作シーケンスを見つけることです。Bodrato [ 6 ]がToom-3 用に提示したシーケンスの 1 つは次のとおりで、ここでは実行例に対して実行されます。
これで積多項式がわかった:
もし私たちが別のものを使っていたらまたは評価点によって行列が変わるため、補間戦略も変わりますが、入力に依存しないため、任意のパラメータセットに対してハードコーディングできます。
最後に、r(B) を評価して最終的な答えを得ます。B はbのべき乗なので、B のべき乗による乗算はすべてbの整数桁のシフトになります。実行例では、b = 10 4、B = b 2 = 10 8 です。
これは実際には1234567890123456789012と987654321987654321098の積です。
補間ステップは、積多項式の次数(因数多項式の次数の合計)に依存しますが、個々の次数には依存しません。基本的なToom-3では各因数を3つの部分(2次多項式)に分割しますが、因数の大きさが異なる場合は、一方を2つの部分(1次多項式)に、もう一方を係数の大きさがより均等な4つの部分(3次多項式)に分割すると有利になる場合があります。そうすると、同じ補間ステップで4次積多項式を生成できます。
Toom-3の場合、これは唯一興味深い代替分割方法です(どちらかの因子を1つの部分に分割するという退化したケースでは時間の節約になりません)が、より高次のToom-Cook法では、さらに多くの可能性が開かれます。
均等に分割する場合に加えて、常に非対称となる半整数分割の場合も考えられます。この場合、分割される部分の総数は奇数で、積多項式の次数は偶数になります。例えば、Toom-2.5では一方の因数を2つに、もう一方を3つに分割しますが、Toom-3.5では因数を2+5または3+4のように分割することができます。
ここでは、 k mとk nのいくつかの異なる一般的な小さな値に対する一般的な補間行列を示します。
定義を形式的に適用すると、Toom-1 ( k m = k n = 1 ) を考えることができます。これは乗算アルゴリズムではなく、各入力インスタンスを同じインスタンスの再帰呼び出しに自明に還元するため、決して停止しない再帰アルゴリズムになります。このアルゴリズムは 1 つの評価点を必要としますが、その値は定数多項式の「評価」にのみ使用されるため、重要ではありません。したがって、補間行列は単位行列になります。
Toom-1.5 ( k m = 2、k n = 1) は依然として退化しています。これは、一方の入力のサイズを半分にすることで再帰的に縮小しますが、もう一方の入力は変更しません。したがって、1 × n乗算アルゴリズムを基本ケースとして提供した場合にのみ、乗算アルゴリズムにすることができます (真の Toom–Cook アルゴリズムは、定数サイズの基本ケースに帰着します)。評価点として 2 つが必要で、ここでは 0 と ∞ を選択します。その補間行列は単位行列になります。
このアルゴリズムは、本質的には長乗算の一種に相当します。つまり、一方の因数の2つの係数を、もう一方の因数の唯一の係数で乗算します。
Toom-2 ( k m = 2、k n = 2) は 3 つの評価点を必要とし、ここでは 0、1、および ∞ が選択されます。これは、補間行列が次のようになるカラツバ乗算と同じです。
Toom-2.5 ( k m = 3、k n = 2) は 4 つの評価点を必要とし、ここでは 0、1、-1、および ∞ が選択されます。その場合、補間行列は次のようになります。