掛け算の速さの限界(n log nの掛け算)

Integer multiplication in time O(n log n)

下限を示すはずの手順が、1週間で速い掛け算になった。

nビットどうしの掛け算の手間。筆算のn²から、2019年にn log nまで下がった。これが限界かどうかは、まだ分かっていない。

年代
1960〜2019年
習う
大2・情報科学・計算量と分割統治法
レベル
大学(例題 6 問)
人物
アナトリー・カラツバ、アンドレイ・コルモゴロフ、アルノルト・シェーンハーゲ、フォルカー・シュトラッセン、マルティン・フューラー、デイヴィッド・ハーヴィー、ヨリス・ファン・デル・ホーフェン
逸話

1週間で崩れた予想

掛け算は、どこまで速くできるのか。1234×5678を筆算で計算すると、1桁どうしの掛け算を16回する。桁どうしなら回で、10億桁どうしでは回にのぼる。この手間は2019年、まで下がった。

それより速くできるのかどうかは、まだ誰にも分からない。

最初にの壁が崩れたのは、1960年の秋である。モスクワ大学の力学数学部で、アンドレイ・コルモゴロフがサイバネティクスの数学的な問題を扱うセミナーを始めた。コルモゴロフはそこで、桁どうしの掛け算にはに比例する手間がどうしても要る、という予想を掲げた。

背の高い窓から秋の光が入る大学の教室で、白髪まじりの男が黒板の横に立って話し、若い学生たちが木の机で聞いている(画像生成 AI で描いたイメージ)
1960年秋、モスクワ大学でコルモゴロフが始めたサイバネティクスの数学のセミナー(カラツバの回想による)画像生成AIで描いたイメージ

予想そのものは4年ほど前からあった。のちにアナトリー・カラツバが書いた回想「計算の複雑さ」によると、コルモゴロフが予想を述べたのは1956年ごろで、同じ年にはモスクワ数学会の会合でも議論になった。

その席でコルモゴロフは、チェコの研究者スヴォボダとヴァラフが考えた記数法を紹介した。いくつかの素数で割った余りの組で数を表す書き方で、掛け算は余りごとに別々にでき、手間はほどで済む。アナトリー・ヴィトゥシキンが「人がこの記数法で暮らしていたら、の予想は生まれなかった」と言うと、コルモゴロフは、記数法は測った量を比べるために生まれたもので、余りの組ではどちらの数が大きいかさえ分からない、と応じたという。

アンドレイ・コルモゴロフの肖像(Andrej Nikolajewitsch Kolmogorov)
アンドレイ・コルモゴロフ1903–1987確率論を公理から組み立て、マルコフ過程の理論を広げた出典: Wikimedia Commons・Konrad Jacobs・CC BY-SA 2.0 de

人類は何千年も同じ筆算で掛けてきた。だから、もっと手間の少ない方法があるなら、とうに見つかっていたはずだ。予想の根拠はおそらくそこにあった、とカラツバは推し量っている。

セミナーに出ていたカラツバは23歳で、前の年にモスクワ大学の力学数学部を卒業したばかりだった。予想について考え始めたカラツバは「ちょうど1週間後」に、手間の下限を示すつもりで組み立てていた手順が、逆に、つまりほどの手間で掛け算を済ませることに気づいた。

アナトリー・カラツバの肖像(A.A.Karatsuba)
アナトリー・カラツバ1937–2008多桁の数をnの2乗より速く掛ける方法を初めて見つけた出典: Wikimedia Commons・AliceNovak・CC BY-SA 3.0

次のセミナーのあとで知らせると、コルモゴロフは強く動揺した。もっともらしいと考えていた自分の予想に反していたからだ。その次の回で、コルモゴロフは自分でカラツバの方法を話した。

セミナーはそれきり終わった。

論文の出方も変わっていた。1962年、コルモゴロフは短い論文を書き、カラツバとユーリー・オフマンの連名で『ソ連科学アカデミー報告』に載せた。題は「オートマトンによる多桁数の乗算」である。オフマンも執筆に加わったかもしれない、とカラツバは書く。しかもカラツバ自身は、抜き刷りを渡されて初めてこの論文を知った。英訳は翌1963年に出ている。

大学の長い廊下の窓辺で、若い男が薄い冊子の束を手に持ち、驚いた顔で見下ろしている(画像生成 AI で描いたイメージ)
自分の知らないうちに出た論文の抜き刷りを手にした若い研究者(カラツバの回想による)画像生成AIで描いたイメージ
起源

桁を波に分けた1971年

カラツバの工夫は、2つに分けたところで止まらなかった。1963年、アンドレイ・トゥームはこれを一般の分け方に広げた。数を個に分ければ、長さ分の1の掛け算回で済む。3つに分けると5回で、手間は、つまりほどになり、指数はを増やすほど1に近づく。1966年にはスティーヴン・クックが博士論文で、この方法をチューリング機械で動く形に書き直した。今はトゥーム・クック法と呼ばれている。

次の一歩は信号処理からやってきた。1965年、ジェームズ・クーリーとジョン・テューキーは、長さの離散フーリエ変換をに比例する手間で計算する方法を発表した。高速フーリエ変換(FFT)である。離散フーリエ変換は、周期関数を波に分けるフーリエ級数を、有限個の数の並びに当てはめたものだ。ほぼ同じ方法をガウスがすでに知っていたことが、のちに分かっている。

1971年、アルノルト・シェーンハーゲとフォルカー・シュトラッセンは、学術誌『Computing』に論文「大きな数の高速な掛け算」を載せた。数を短い桁の塊に切って多項式の係数とみなし、多項式どうしの掛け算をFFTで計算する。

論文には2つの方法があった。1つ目は複素数の上でFFTをする方法で、2つ目はで割った余りの世界でFFTをする方法だった。この世界では2そのものが1の累乗根になる。2を掛けるのは2進法で桁をずらすだけなので、変換の途中に掛け算が要らない。手間はまで下がった。

2人は同じ論文で、掛け算の本当の手間はだろうと予想した。のちにこの差を詰めるマルティン・フューラーは、2019年に『Quanta Magazine』の取材に「掛け算ほど大事な基本の演算なら、見た目の美しさから言っても、きれいな手間の上限があるはずだというのが、おおかたの考えだった」と語った。

ところが、はそこから36年動かなかった。2007年、フューラーはの因子をの形に置き換えた。は対数を何回とれば1以下になるかを数えた値で、でも5にしかならない。底のはデイヴィッド・ハーヴィーらの2014年の論文で8になり、その後の改良で4まで下がった。

2019年3月18日、ハーヴィーとヨリス・ファン・デル・ホーフェンは論文「時間の整数の掛け算」を公開した。ハーヴィーはオーストラリアのニューサウスウェールズ大学に、ファン・デル・ホーフェンは、フランス国立科学研究センター(CNRS)とエコール・ポリテクニークの情報科学研究所に属する。

CNRSは4月12日の発表で、10億桁どうしの筆算は1秒に10億回の計算でも30年あまりかかるが、シェーンハーゲとシュトラッセンの方法なら今のノートパソコンで30秒ほどだと説明した。論文は同じ年の4月3日に『Annals of Mathematics』へ投稿され、2021年3月に第193巻2号に載った。

では、残っていたは、どうやって消えたのだろうか。

証明

3回の掛け算から1729次元へ

掛ける2つの数をビットとし、1ビットどうしの演算の回数で手間を数える。手順1〜4がカラツバの方法、手順5〜8がFFT、手順9から先で2つの上界を比べる。

  1. とおき、, と上と下の半分に分けて展開する。

  2. 真ん中の係数は和どうしの積1回から求まる。

  3. 半分の長さの掛け算は4回から3回に減る。残りの足し算と引き算と桁ずらしは、に比例する手間で済む。

    長さnの掛け算1個が、長さn/2の掛け算3個、長さn/4の掛け算9個に分かれる。1個あたりの足し算の手間は半分になるが個数が3倍になるので、段ごとの手間はn、1.5n、2.25nと1.5倍ずつ増える。
  4. 段目には長さの掛け算が個並び、その段で足し算にかかる手間はになる。段で長さが1になるので、全部を足すと次のようになる。

  5. FFTの方法では、掛け算を数列の畳み込みとみる。ビットずつの塊に分けて, と書くと、積の係数は次の和になる。繰り上げは最後にまとめてする。

  6. 0を足して並びを塊の個数の2倍以上に延ばし、その長さをとして、で離散フーリエ変換する。なのでの指数はで割った余りで足され、畳み込みは成分ごとの積に変わる。

  7. を使うと、長さの変換は長さの2つに分かれる。は偶数番目の項だけの変換、は奇数番目の項だけの変換で、どちらもを1の乗根として計算する。

  8. 半分に分け続けると、変換の手間は次のように抑えられる。

  9. 成分の積はまた小さな整数の掛け算になる。シェーンハーゲとシュトラッセンの2つ目の方法でで割った余りの掛け算の手間をとすると、長さの掛け算は、長さの掛け算およそ個に変わる。

  10. とおき、両辺をで割る。はほぼなので、係数の2とが打ち消し合う。つまり、1段ごとの倍率はほぼ1になる。

  11. 段を1つ下りるごとにはずつ増え、平方根をとって小さくしていく段の数はほどある。

  12. ハーヴィーらは、長さの掛け算を、次元の離散フーリエ変換を使って、長さの掛け算に分けた。論文の式(1.3)は次の形をしている。

  13. 同じくとして割ると、はほぼなので、係数はほどになる。論文はで成り立つことを示し、とおいて、のとき次を得た。

  14. でのの最大値をとし、とおく。ならなので、帰納法ではいつも以下にとどまる。

1段の倍率を1にすると、は段の数だけ増え続ける。これが手順11のの正体である。を1より少しでも小さくすれば、はで頭打ちになる。画面ではなので、なら上限は5000になる。

手順12の次元の変換をどう作るかに、論文の新しさがある。塊の数を個の異なる素数の積にとると、中国剰余定理によって、1次元の畳み込みがの格子上の畳み込みに組み替わる。ただ、各辺の長さが素数のままでは、半分に分け続けるFFTが使えない。

そこで2人は、より少し大きい2の累乗を選び、格子の値を、ガウス関数で重みをつけての格子へ写した。ガウス関数のフーリエ変換はまたガウス関数になるので、写した先で変換した値から、もとの変換を連立方程式で取り戻せる。2人はこれを「ガウスの再標本化」と呼んでいる。2の累乗にそろった変換はブルースタインの方法で掛け算の形に直し、ヌスバウマーの高速多項式変換で計算する。この変換は複素数の足し算と引き算だけでできている。

1729は、より大きい整数なら何でもよかった。論文は「より大きいどの定数でもよい」と書き、5.4節の工夫を重ねてを8まで下げればで同じ結論になる、としている。ちなみに1729は、と立方数の和で2通りに書ける数でもある。

途中の計算

12×34を4点の変換で

FFTの掛け算を、いちばん小さな大きさで手で追う。高校では数学IIで虚数単位を、数学Cで複素数平面を学び、FFTは大学の情報科学や信号処理の講義で出てくる。長さをにするとで、掛ける数は, , , の4つしか出てこない。オイラーの公式にを入れたである。

  1. 10進法の桁を下の位から並べ、長さ4にそろえる

  2. で変換する

    ω = iのとき、k = 1の行の係数は1, i, −1, −iと90°ずつ、k = 2の行は1, −1, 1, −1と180°ずつ、k = 3の行は270°ずつ回り、どの行も4回で1に戻る。
  3. も同じく変換する

  4. 成分ごとに掛ける

  5. をに替えて変換し、4で割る

  6. 繰り上げて10進法に戻す

手順5の第1成分はで、虚部が打ち消し合う。がの共役になっているからで、元の数列が実数なら必ずこうなる。手順4の掛け算は4回で、筆算の4回と変わらない。得をするのはが大きいときで、成分の積回と、手間がに比例する変換3回で済む。

応用

定数が決める切り替え点

O記法は定数を隠す。そのため、実際のライブラリは桁数ごとに方法を切り替えている。

シェーンハーゲとシュトラッセンの2つ目の方法は、今の世界で最もよく使われている大きな整数の掛け算の方法だろう、とハーヴィーらは書く。無料のライブラリGMPが、よく調整した実装を持つからだ。

GMPの手引き(6.3.0)によると、同じ長さどうしの掛け算には7つの方法があり、長さが増えるにつれて筆算、カラツバ、トゥーム・クック法の3分割、4分割、6.5分割、8.5分割、FFTの順に移る。計算機の1語をリムと呼び、これを単位にすると、カラツバに切り替わる長さは10リムほどになることもある。64ビットの計算機なら640ビット、10進法で約193桁だ。で割った余りの掛け算でFFTが3分割の方法を抜くのは、CPUによって300〜1000リムのあたりだという。

たとえばPythonの標準の実装CPythonは、整数を30ビットずつの桁で持つ。両方が70桁、つまり2,100ビットを超えると、筆算からカラツバの方法に切り替わる。10進法なら約632桁である。

桁外れに大きな掛け算は、円周率の記録を作る計算の中にある。y-cruncherの解説のページによると、このソフトがこれまでにした最大の掛け算は、どれも記録の計算を締めくくる1回だった。2022年、Google Cloudの岩尾エマはるかが円周率を100兆桁まで求めたときは、その掛け算が100兆桁どうしで、64ビットの数論変換(NTT)を使って46時間かかった。数論変換は、FFTの複素数の代わりに、素数で割った余りの世界で同じ変換をするものである。2010〜2013年には近藤茂が、同じy-cruncherで円周率の記録を5兆、10兆、12.1兆桁と3度更新している。

一方、2019年の方法はこの競争に加わらない。論文は、定数を小さくすることも実用的な掛け算の方法を示すことも目指していないと断っている。再帰を使うのはビットのときだけで、それより小さい数はどの方法で掛けてもよい。は約で、このビット数を10進法で書くと、それだけで約桁になる。ファン・デル・ホーフェン自身も『Quanta Magazine』に「うまくいっても3倍速くなるくらいで、目覚ましいものにはならない」と語っている。

意外なのは、がどれほど小さいかである。ビットでもにすぎない。手間を「定数×式」とみると、定数が6倍違うだけで、の方法がシェーンハーゲとシュトラッセンの方法に追いつくのはビットより先になる。

例題と解説

4つの方法を手で比べる

例題 1基本1234×5678を3回の掛け算で

, と分け、2桁どうしの掛け算3回でを求めよ。

解説を見る

上どうしと下どうしの積を求める。

和どうしの積から2つを引くと、真ん中の係数になる。

位をずらして足す。

分け方をもう1段続ければ、1桁どうしの掛け算は回で済み、筆算の回より少ない。ただしのように、和をとると桁が1つ増えることがある。GMPは和の代わりに差を使い、この繰り上がりを避けている。

例題 2基本1024桁どうしの回数

1024桁どうしの掛け算を、筆算と、1桁になるまで半分に分け続けるカラツバの方法で計算する。1桁どうしの掛け算の回数をそれぞれ求めよ。足し算は数えない。

解説を見る

なので、半分に分けるのは10段である。筆算は回、カラツバの方法は1段ごとに3倍になる。

比は約17.8倍である。なので、この回数はの式と一致する。

例題 3入試漸化式を解く

, ()で決まる数列について、をの式で表せ。またを求めよ。

解説を見る

両辺をで割り、とおく。

等比数列の和を足し上げる。

を掛けて戻す。

ならである。で書くととなり、証明の手順4で, とおいた式と同じになる。

例題 4入試1段だけ分けると得か

筆算の手間を、カラツバの方法を1段だけ使う手間をとする。カラツバの方法のほうが手間が少なくなるの範囲を求めよ。

解説を見る

不等式を立てる。

整理すると次のようになる。

33桁以上なら、1段分けたほうが得になる。足し算の係数8を大きくすると、境目は右へ動く。GMPの手引きも、切り替えの長さはこうした係数の釣り合いで決まると説明している。

例題 5大学13²を4点の変換で

とした4点の離散フーリエ変換を使って、を求めよ。

解説を見る

桁を下の位から並べ、とする。

2乗なので、成分ごとに2乗する。

をに替えて変換し、4で割る。

繰り上げは無く、である。2乗では変換が1回減るので、一般の掛け算より少し軽い。GMPも、2乗には掛け算と別の切り替えの長さを持たせている。

例題 6大学0.9998と5000

正の定数, とについて、, が成り立つとき、すべてのでとなることを示せ。また、のときはいくつか。

解説を見る

とおく。まずである。と仮定すると

2つ目の不等号は、つまりから出る。帰納法で、すべてのでとなる。なら

で、証明の手順14のと同じ形になる。だとが成り立たず、はまで増えうる。

図示

斜めに足す表と、段ごとの手間

12×34を、1桁どうしの積の表に並べる。右上から左下へ斜めに並ぶマスは同じ位で、斜めごとに足すと3、10、8になり、繰り上げると408になる。多項式(10 + 2)(3×10 + 4)の係数を求める畳み込みと同じ計算である。
再帰の段ごとに、変換にかかる手間を棒で並べた。1971年のシェーンハーゲとシュトラッセンの方法では段ごとに同じで、合計は段の数に比例する。2019年の方法では段ごとにK/d倍に縮み、合計は1段目の定数倍に収まる。縮み方は見やすく大きくした。

FFTの掛け算は、1枚目の表で斜めに足す和を、すべての位についてまとめて求める方法である。2枚目の左右の違いが、証明の手順11と手順14の違いになる。

シミュレーション

定数を動かして順位を入れ替える

縦軸は手間をで割った値で、証明のにあたる。の方法は横一直線、シェーンハーゲとシュトラッセン(SS)はゆっくり上がる線、筆算とカラツバは急な坂になる。手間は「定数×式」のモデルで、定数の初期値(カラツバは4、SSは10、の方法は約60)は見やすさのために選んだ。「定数を変える方法」で1つを選び、つまみでその定数を変えると、丸で示した入れ替わりの点が動く。SSとの方法で定数の比をとすると、2本が交わるのは、つまりビットのところである。比を約129にすると、交点の肩のは約になる。論文のでも肩はで、ほぼ並ぶ。もっとも、は手順14の帰納法が使える大きさで、2つの方法の手間を比べた交点ではない。

広がる学問

掛け算を土台にする計算

  • 数学 円周率やを何兆桁も求めるとき、割り算や平方根を掛け算の繰り返しに直して計算する。論文の定理からは、ビットの精度の割り算と乗根がで、やがで求まる。ビットの整数の最大公約数も、で求まる。
  • 情報科学 計算の手間を比べるとき、多くの問題の手間を、掛け算の手間を単位にして書く。ファン・デル・ホーフェンは、物理で光速のような定数がさまざまな現象を言い表すように、計算の速さを言い表す基本の部品が整数の掛け算だと語っている。一方で、掛け算の手間がの定数倍より大きいことさえ、まだ証明されていない。積のビット目を、掛ける数のビット目を読む前に書き出す「オンライン」の掛け算に限れば、1969年のクックとアーンデラー、1974年のパターソン、フィッシャー、メイヤーがの下限を示している。
  • 工学 音声や画像にディジタルフィルターを掛けるとき、畳み込みをFFTで成分ごとの積に直して計算する。整数の掛け算と同じ式で、違うのは繰り上げが無いことだけである。逆に、長さの離散フーリエ変換を精度ビットで求める問題は整数の掛け算に直せるので、論文の定理から手間はに収まる。
いまの研究と事業

下限の証明と、兆桁の掛け算

  • 2019年 アーフス大学の4人ペイマン・アフシャニとカスパー・グリーン・ラーセンらが、掛け算の手間の下限を条件つきで示した。ネットワーク符号化の未解決の予想が正しければ、ファンインとファンアウトが有界なブール回路でビットの掛け算をするには、大きさの回路が要る。前提にしたのはリーとリーの予想で、無向グラフでは、データを符号化して送っても、そのまま流すより速くは送れないというものである。証明の中心はをビットずらす問題の下限で、ずらすことはを掛けることと同じなので、掛け算にも同じ下限がつく。手順14の上界と同じの増え方に、条件つきで下から迫った結果である。出典はarXiv:1902.10935。
  • 2022年 ニューサウスウェールズ大学とCNRSハーヴィーとファン・デル・ホーフェンが、有限体上の多項式を掛ける方法を『Journal of the ACM』に発表した。の上で次数がより小さい多項式どうしを、の手間で掛ける。整数のときのにあたる結果だが、等差数列に現れる最小の素数が十分小さいという、リンニクの定数についての仮定をまだ外せていない。手順12の次元の変換を、となる素数で作るためにこの仮定が要る。出典はHarvey, van der Hoeven, J. ACM 69(2)。
  • **2024年 アメリカ国立標準技術研究所(NIST)**鍵カプセル化の方式ML-KEMを、8月13日に標準FIPS 203として公表した。量子計算機を持つ相手にも安全だと考えられている方式である。多項式環での掛け算に数論変換(NTT)を使う。が1の原始256乗根でとなることから、を2次式128個の積に分け、成分ごとの掛け算に直す。手順7のと同じ仕組みで、規格はNTTが最適化にとどまらずML-KEMに欠かせない一部だと書いている。出典はNIST「FIPS 203」。
  • 2025年 技術メディアのStorageReviewケビン・オブライエンら3人が、y-cruncherで円周率を314兆桁まで求め、11月に記録を更新した。作者のアレクサンダー・イーによると、384コアのAMD EPYCのサーバー1台で、110日間止めずに計算したという。y-cruncherのコードはおよそ72万行あり、その3分の2を大きな掛け算とそれを支える部品が占める。計算時間の大半も、FFT系の大きな掛け算に費やされる。出典はy-cruncher・Large Multiplication。

参考文献

  1. A. Karatsuba, Yu. Ofman, "Умножение многозначных чисел на автоматах", Doklady Akademii Nauk SSSR 145(2) (1962), 293-294(英訳 "Multiplication of multidigit numbers on automata", Soviet Physics Doklady 7 (1963), 595-596); A. L. Toom, Doklady Akademii Nauk SSSR 150 (1963), 496-498; S. A. Cook, On the minimum computation time of functions, PhD thesis, Harvard University (1966).
  2. А. А. Карацуба, "Сложность вычислений", Trudy Matematicheskogo Instituta im. V. A. Steklova 211 (1995), 186-202(英訳A. A. Karatsuba, "The complexity of computations", Proc. Steklov Inst. Math. 211 (1995), 169-183); ステクロフ数学研究所「Карацуба Анатолий Алексеевич」.
  3. A. Schönhage, V. Strassen, "Schnelle Multiplikation großer Zahlen", Computing 7 (1971), 281-292; J. W. Cooley, J. W. Tukey, "An algorithm for the machine calculation of complex Fourier series", Math. Comp. 19 (1965), 297-301; M. T. Heideman, D. H. Johnson, C. S. Burrus, "Gauss and the history of the fast Fourier transform", Arch. Hist. Exact Sci. 34 (1985), 265-277.
  4. M. Fürer, "Faster Integer Multiplication", SIAM J. Comput. 39(3) (2009), 979-1005; D. Harvey, J. van der Hoeven, G. Lecerf, "Even faster integer multiplication", J. Complexity 36 (2016), 1-30(arXiv:1407.3360).
  5. D. Harvey, J. van der Hoeven, "Integer multiplication in time O(n log n)", Annals of Mathematics 193(2) (2021), 563-617; CNRS, "A faster method for multiplying very big numbers"(2019年4月12日); K. Hartnett, "Mathematicians Discover the Perfect Way to Multiply", Quanta Magazine(2019年4月11日).
  6. D. Harvey, J. van der Hoeven, "Polynomial Multiplication over Finite Fields in Time O(n log n)", J. ACM 69(2) (2022), 1-40; P. Afshani, C. B. Freksen, L. Kamma, K. G. Larsen, "Lower Bounds for Multiplication via Network Coding", arXiv:1902.10935 (2019).
  7. GNU MP 6.3.0 Manual, "Multiplication Algorithms"; CPython, Objects/longobject.c; A. J. Yee, "y-cruncher" と "Large Multiplication"; E. H. Iwao, "Even more pi in the sky: Calculating 100 trillion digits of pi on Google Cloud", Google Cloud Blog(2022年6月9日); 岩尾エマはるか「円周率の100兆桁目を求めて」Google Japan Blog(2022年6月9日); NIST, FIPS 203 (2024).

姉妹サイト

株式会社Game が運営するメディアです。