論文>
<メタデータ 型="解説">
<題名>Toom-Cook法題名>
<作者 読み="Umetani, Takeshi">梅谷 武作者>
<題目 NDC="418">Toom-Cook法題目>
<要約>
多倍長整数の高速乗算法であるToom-Cook法についてわかりやすく解説する。
要約>
<出版者>IMS - Information Machine Studio出版者>
<寄与者>寄与者>
<作成日付>2001-02-24作成日付>
<更新日付>2006-01-12更新日付>
<型>text型><形式>text/html形式>
<識別子>IMS:20010224001識別子>
<情報源>情報源>
<言語>ja言語>
<関係>関係>
<時空範囲>時空範囲>
<権利>Copyright 2001 Takeshi Umetani権利>
メタデータ>
<文書>
<節 題名="離散数学からの準備">
<小節 題名="順列と組み合わせ">
<段落>
Toom-Cook法を理解するには、ほんの少しですが組み合わせ数学
の知識があった方がいいかもしれません。記号の定義も兼ねて、順列と組み合わせ
から復習してみましょう。
段落>
<命題 種類="補題" 別名="順列">
n個のものから、k個とる順列の個数は、
P(n,k) = \srac{n!}{(n-k)!}
に等しい。
命題>
<命題 種類="定義" 別名="第1種Stirling数">
P(n,k)をnに関する多項式として考えて展開する。
P(x,k) = {x(x-1)…(x-k+1)}
{} = {s(k,k)x^k + s(k,k-1)x^{k-1} + … + s(k,1)x + s(k,0)}
この係数s(k,i),i=0,…,kを第1種Stirling数と呼ぶ。
命題>
<命題 種類="補題" 別名="第1種Stirling数の性質">
第1種Stirling数について次式が成り立つ。
s(n,0) = {0,\ n≧1}
s(n,n) = {1,\ n≧1}
s(n+1,k) = {s(n,k-1) - ns(n,k),\ n≧k≧1}
命題>
<命題 種類="補題" 別名="組み合わせ">
n個のものから、k個とる組み合わせの個数は、
C(n,k) = \srac{n!}{k!(n-k)!}
に等しい。
命題>
<命題 種類="定理" 別名="2項定理">
正の整数n>0について、x,yを変数とする恒等式
(x+y)^n = 農{k=0}^n{C(n,k)x^{n-k}y^k}
が成り立つ。この式によりC(n,k)を2項係数と呼ぶ。
命題>
<命題 種類="補題" 別名="2項係数の性質">
2項係数について次式が成り立つ。
C(n,0) = {1,\ n≧1}
C(n,n) = {1,\ n≧1}
C(n,k) = {C(n-1,k) + C(n-1,k-1),\ n≧k≧1}
命題>
<段落>
この性質によって、任意の2項係数を加法だけを使って計算することが
できます。この算法を図形的に表現したものが、いわゆるPascal
の三角形です。Toomの算法を図形的に表現すると、やはり
Toomの三角形ともいえる図形になります。
段落>
小節>
<小節 題名="第2種Stirling数">
<命題 種類="定義" 別名="第2種Stirling数">
n個のものをk個に分割する仕方の個数を第2種Stirling数と呼び、S(n,k)と
書く。n≧k≧1以外のときはS(n,k)=0と約束する。
命題>
<命題 種類="補題" 別名="第2種Stirling数の性質">
第2種Stirling数について次式が成り立つ。
S(n,1) = {1,\ n≧1}
S(n,n) = {1,\ n≧1}
S(n+1,k) = {S(n,k-1) + kS(n,k),\ n≧k≧1}
命題>
<命題 種類="補題">
第2種Stirling数について次式が成り立つ。
S(n,k) = 農{i=0}^{n-1}{C(n-1,i)S(i,k-1)},\ n≧1
命題>
<命題 種類="補題">
第2種Stirling数について次式が成り立つ。
x^n = 農{k=1}^n{S(n,k)P(x,k)},\ n≧1,\ xは変数
命題>
<命題 種類="補題">
第2種Stirling数について次式が成り立つ。
S(n,k) = \srac{1}{k!}農{i=1}^k{(-1)^{k-i}C(k,i)i^n},\ n≧k≧1
命題>
小節>
節>
<節 題名="Toom-Cook法">
<小節 題名="Toomの三角形">
<段落>
Knuth[S2]によれば、Toom-Cook法は
Karatsuba法が発表された翌年の1963年にやはりソ連の
A. L. Toomによって基本的な考え方が発表され、その後、1966年に
ハーバード大学のS. A. Cookにより実際の計算機で作譜する方法が
示されました。米ソ冷戦時代のこの時期、この分野においてはソ連が先行し、
米国が追いかけていたようにも見えます。
段落>
<段落>
K>0とし、正の整数a,bが、基数P=2^Kにより
次のようにP進表現されるものとします。
a = {a_rP^r + … + a_1P + a_0, 0≦a_i<P}
b = {b_rP^r + … + b_1P + b_0, 0≦b_i<P}
ここで、多項式
a(x) = {a_rx^r + … + a_1x + a_0}
b(x) = {b_rx^r + … + b_1x + b_0}
を考え、その積を
c(x) = a(x)b(x)
{} = {c_{2r}x^{2r} + … + c_1x + c_0}
とします。Toom-Cook法は2r+1個の値、
c(i) = a(i)b(i),\ i=0,…,2r
からc(x)の係数を計算し、それに基数P=2^Kを代入することに
よって積abを求めます。
段落>
<段落>
まず、m=2r+1とおき多項式c(x)を
c(x) = {c_{m-1}x^{m-1} + … + c_1x + c_0}
{} = {農{i=1}^{m-1}{c_ix^i} + c_0}
{} = {農{i=1}^{m-1}{c_i(農{k=1}^i{S(i,k)P(x,k)})} + c_0}
{} = {農{i=0}^{m-1}{θ_iP(x,i)}}
とP(x,i)で展開します。ここで、a(x),b(x)の係数が負でない
ことからc(x)の係数も負ではなく、さらにθ_i,i=0,…m-1も
負でないことに注意してください。このことがToom-Cook法の途中の計算
結果が負でないことを保証することになります。
段落>
<命題 種類="補題">
P(x,k)に関して次式が成り立つ。
P(x+1,k) - P(x,k) = kP(x,k-1),\ k≧1
命題>
<証明>
k=1のとき、
{P(x+1,1) - P(x,1)} = {x + 1 - x}
{} = {1 = P(x,0)}
k>1のとき、
{P(x+1,k) - P(x,k)} = {(x+1)x(x-1)…(x-k+2) - x(x-1)…(x-k+1)}
{} = {x(x-1)…(x-k+2)(x+1-(x-k+1))}
{} = {kP(x,k-1)}
証明>
<命題 種類="補題">
c(x)に関して次式が成り立つ。
c(x+1) - c(x) = 農{i=1}^{m-1}{iθ_iP(x,i-1)}
命題>
<証明>
{c(x+1) - c(x)} = 農{i=1}^{m-1}{θ_i(P(x+1,i) - P(x,i))}
{} = 農{i=1}^{m-1}{iθ_iP(x,i-1)}
証明>
<命題 種類="定義">
多項式c(x) = c_{m-1}x^{m-1} + … + c_1x + c_0が与えられたとき、
Ψ_c(x,k) = \srac{1}{k!}農{i=0}^{k}{(-1)^iC(k,i)c(x+k-i)},\ k≧0
と定義する。
命題>
<命題 種類="補題">
これまでの仮定の下で次式が成り立つ。
Ψ_c(x,k+1) = \srac{1}{k+1}(Ψ_c(x+1,k) - Ψ_c(x,k)),\ k≧0
命題>
<証明>
定義から、
Ψ_c(x,k+1) = \srac{1}{(k+1)!}農{i=0}^{k+1}{(-1)^iC(k+1,i)c(x+k+1-i)},\ k≧0
である。
C(k+1,i) = C(k,i) + C(k,i-1)
を使って、
Ψ_c(x,k+1) = {\srac{1}{(k+1)!}(
農{i=1}^{k}{(-1)^i(C(k,i)+C(k,i-1))c(x+k+1-i)}
+ (-1)^{k+1}c(x) + (-1)^0c(x+k+1)
)}
{} = {\srac{1}{(k+1)!}(
農{i=0}^{k}{(-1)^iC(k,i)c(x+k+1-i)} - 農{j=0}^{k}{(-1)^jC(k,j)c(x+k-j)}
)}
{} = {\srac{1}{k+1}(
\srac{1}{k!}農{i=0}^{k}{(-1)^iC(k,i)c((x+1)+k-i)} -
\srac{1}{k!}農{j=0}^{k}{(-1)^jC(k,j)c(x+k-j)}
)}
証明>
<命題 種類="定理" 別名="Toom-Cook法の原理">
これまでの仮定の下で次式が成り立つ。
Ψ_c(x,k) = 農{i=k}^{m-1}{C(i,k)θ_iP(x,i-k)},\ k≧0
命題>
<証明>
帰納法による。k=0のとき
Ψ_c(x,0) = c(x)
{} = 農{i=0}^{m-1}{θ_iP(x,i)}
k=1のときは補題[2.2]を使う。
Ψ_c(x,1) = {c(x+1) - c(x)}
{} = 農{i=1}^{m-1}{iθ_iP(x,i-1)}
{} = 農{i=1}^{m-1}{C(i,1)θ_iP(x,i-1)}
kで正しいとしてk+1で成り立つことを示す。
Ψ_c(x,k+1) = {\srac{1}{k+1}(Ψ_c(x+1,k) - Ψ_c(x,k))}
{} = {\srac{1}{k+1}(
農{i=k}^{m-1}{C(i,k)θ_iP(x+1,i-k)} -
農{i=k}^{m-1}{C(i,k)θ_iP(x,i-k)}
)}
{} = {\srac{1}{k+1}
農{i=k+1}^{m-1}{C(i,k)θ_i(P(x+1,i-k)-P(x,i-k)}
}
{} = {\srac{1}{k+1}
農{i=k+1}^{m-1}{C(i,k)θ_i(i-k)P(x,i-(k+1))}
}
{} = {農{i=k+1}^{m-1}{C(i,k+1)θ_iP(x,i-(k+1))}}
証明>
<命題 種類="系">
これまでの仮定の下で次式が成り立つ。
Ψ_c(0,k) = θ_k,\ k≧0
命題>
<段落>
これでToomの三角形を描く準備ができました。r=2のとき
を考えます。まず
c(0), c(1), c(2), c(3), c(4)
を計算し、これを利用して次の行列を計算します。
\array_{(}^{)}{
c(0)=Ψ_c(0,0) Ψ_c(0,1) Ψ_c(0,2) Ψ_c(0,3) Ψ_c(0,4) ;
c(1)=Ψ_c(1,0) Ψ_c(1,1) Ψ_c(1,2) Ψ_c(1,3) 0 ;
c(2)=Ψ_c(2,0) Ψ_c(2,1) Ψ_c(2,2) 0 0 ;
c(3)=Ψ_c(3,0) Ψ_c(3,1) 0 0 0 ;
c(4)=Ψ_c(4,0) 0 0 0 0 ;
}
1列目はすでに計算されています。2列目以降は
Ψ_c(x,k+1) = \srac{1}{k+1}(Ψ_c(x+1,k) - Ψ_c(x,k))
によって計算します。k+1列目の値は、k列目の2つの値の差をk+1で割ることに
よって得られます。この結果得られた行列の第1行が
θ_0, θ_1, θ_2, θ_3, θ_4
となっています。
段落>
小節>
節>
文書>
<参考文献>
<文献分類 題名="離散数学">
<メタデータ 参照名="D1" 型="書籍">
<題名>離散数学題名>
<作者 読み="Takahashi, Iwaro">高橋 巌郎, 藤重 悟作者>
<題目 NDC="007.08">題目><出版者>岩波書店出版者>
<刊行日付>1981刊行日付><識別子 ISBN="4-00-010167-6">識別子>
メタデータ>
文献分類>
<文献分類 題名="算法">
<メタデータ 参照名="S1" 型="書籍">
<題名>基本的算法題名>
<作者 読み="Noshita, Kohei">野下 浩平, 高岡 忠雄, 町田 元作者>
<題目 NDC="007.08">題目><出版者>岩波書店出版者>
<刊行日付>1983刊行日付><識別子 ISBN="">識別子>
メタデータ>
<メタデータ 参照名="S2" 型="書籍">
<題名>準数値算法/算術演算題名>
<作者 読み="Knuth, D. E.">D. E. Knuth(中川 圭介訳)作者>
<題目 NDC="007.64">題目><出版者>サイエンス社出版者>
<刊行日付>1986刊行日付><識別子 ISBN="4-7819-0426-2">識別子>
メタデータ>
文献分類>
参考文献>
論文>