多倍長演算

同義語:多倍長計算多倍長整数演算multiple-precision arithmeticarbitrary-precision arithmetic

概要

多倍長演算(multiple-precision arithmetic)とは、計算機の 1 語に収まらない大きな整数を底 $B$ の数字の並びとして表し、筆算と同じ考え方で足し算・掛け算・割り算を行う手順と、その手間を 1 桁どうしの演算の回数で調べる分野である。足し算は桁数に比例し、筆算の掛け算は $k$ 桁と $l$ 桁で $kl$ に比例する手間がかかる。割り算では、割る数の最上位の数字が $B/2$ 以上になるよう 1 桁の数を掛けておくと、上の 2 桁から立てて $B-1$ 以下に切り詰めた仮の商は正しい商の数字より高々 $2$ 大きいだけで、商と余りが $l(k-l+1)$ に比例する手間で求まる。差を使う Karatsuba の方法では $n$ 桁どうしの積が $n^{\log_23}$ の定数倍の手間で求まり、素数を法とする高速 Fourier 変換も掛け算に使われる。

$$\newcommand{C}[0]{\mathbb{C}} \newcommand{div}[0]{\mathbin{÷}} \newcommand{N}[0]{\mathbb{N}} \newcommand{Q}[0]{\mathbb{Q}} \newcommand{R}[0]{\mathbb{R}} \newcommand{Z}[0]{\mathbb{Z}} $$

前提知識: 整数の筆算の仕組み, 掛け算の筆算と畳み込み, Landau記号

コンピュータが 1 回の命令で扱える整数は、$2^{64}$ 未満のように大きさが限られている。$2^{100000}$ を正確に計算したり、円周率を百万桁求めたり、数百桁の素数を使う暗号を動かしたりするには、大きな整数を数字の並びとして持ち、その並びの上で足し算・掛け算・割り算を行う手順が要る。これを 多倍長演算(multiple-precision arithmetic)という。手順そのものは小学校の筆算と同じで、違うのは底が $10$ ではなく $2^{32}$ や $2^{64}$ のような大きな数であることと、手間を「1 桁どうしの演算の回数」で正確に数えることである。
筆算では、足し算は桁数に比例する手間で済むが、$n$ 桁どうしの掛け算には $n^2$ に比例する手間がかかる。割り算の筆算では「商の数字を立てる」所に見積もりがいる。この記事では、底 $B$ の多倍長整数と 1 桁演算を定め、足し算・掛け算の筆算の手間を確かめたうえで、次の 2 つを証明する。割る数の最上位の数字が $B/2$ 以上になるように整えておくと、上の 2 桁と 1 桁だけから立てた仮の商は、$B-1$ を超えたら $B-1$ に切り詰めれば、正しい商の数字より大きくても $2$ しか違わない。半分に分けた積を 3 回の積に減らす Karatsuba の方法を繰り返すと、$n$ 桁どうしの積は $n^{\log_23}$($\log_23=1.584\cdots$)の定数倍の手間で求まる。最後に、高速 Fourier 変換による掛け算が正確な答えを出すための条件を述べる。

定義

多倍長整数と 1 桁演算

$B\ge2$ を整数とし、底 という。

  1. $0$ 以上の整数 $x$ が $x< B^n$ を満たすとき、$x=\sum_{i=0}^{n-1}x_iB^i$($0\le x_i\le B-1$)と書いて $x=(x_{n-1}\cdots x_1x_0)_B$ と表し、$x$ を $n$ 桁で表す という(上の位の $0$ を許す)。$x_i$ を $x$ の 数字 という。
  2. 整数 $a\ne0$ を、符号と、$\lvert a\rvert$ の $B$ 進法の数字の並び $(a_{n-1},\dots,a_0)$($a_{n-1}\ne0$)の組で表したものを 多倍長整数 といい、$n$ を $a$ の 桁数 という。$0$ の桁数は $1$ とする。
  3. 絶対値が $B^2$ 未満の整数どうしの足し算・引き算・大小の比較、$0$ 以上 $B$ 未満の 2 数の掛け算、絶対値が $B^2$ 未満の整数を $1$ 以上 $B$ 未満の数で割った商(切り捨て)と余りの計算を、それぞれ 1 回の 1 桁演算 と数える。手順の 手間 を、それが使う 1 桁演算の回数で測る。

$B$ 進法の表し方が存在して一意であることは 整数の筆算の仕組み の定理「10 進法の表し方の存在と一意性」と注意「10 を $B$ に取りかえても証明は同じ」による。計算機では $B=2^{32}$ や $2^{64}$ にとり、1 桁演算は機械の命令の数個に当たる。$a$ の $B$ 進法の桁数と 2 進法の桁数(ビット長)の比は $\log_2B$ に近いので、$B$ を固定すれば、手間の評価を $O(\cdot)$(Landau記号)で述べるかぎり $B$ の選び方は効かない。

足し算・引き算・掛け算の筆算

足し算と引き算の手間

$0\le a,b< B^n$ とする。

  1. $c_0=0$、$s_i=a_i+b_i+c_i$、$c_{i+1}=\lfloor s_i/B\rfloor$、$d_i=s_i-Bc_{i+1}$($0\le i\le n-1$)と順に定めると、各 $c_i$ は $0$ か $1$ で、$a+b=(c_nd_{n-1}\cdots d_0)_B$ である。手間は $3n$ 回以下である。
  2. $a\ge b$ なら、同じく繰り下がり $c_i\in\{0,-1\}$ を使って $a-b$ を $n$ 桁で $3n$ 回以下の 1 桁演算で求められる。$a$ と $b$ の大小は上の位から比べて $n$ 回以下で決まる。

要点:$c_i\le1$ なら $s_i\le2B-1$ なので $c_{i+1}\le1$ であり、1 桁ずつ繰り上げても値が変わらないことは 整数の筆算の仕組み の命題「足し算の筆算の正しさ」の $10$ を $B$ に替えた主張である。

詳しい証明を開く

$c_i\in\{0,1\}$ を $i$ についての帰納法で示す。$c_0=0$ である。$c_i\le1$ なら $0\le s_i\le(B-1)+(B-1)+1=2B-1$ なので $c_{i+1}=\lfloor s_i/B\rfloor\in\{0,1\}$ であり、$0\le d_i\le B-1$ である。$s_i=d_i+Bc_{i+1}$ に $B^i$ を掛けて $i=0,\dots,n-1$ について足すと、$\sum_i(a_i+b_i)B^i+\sum_ic_iB^i=\sum_id_iB^i+\sum_ic_{i+1}B^{i+1}$ であり、$c_0=0$ から $a+b=\sum_{i< n}d_iB^i+c_nB^n$ となる。各 $i$ で足し算 2 回と割り算 1 回を使う($d_i$ は割り算の余りとして同時に得られる)ので $3n$ 回以下である。引き算は $s_i=a_i-b_i+c_i\in[-B,B-1]$、$c_{i+1}=\lfloor s_i/B\rfloor\in\{0,-1\}$ として同じ計算をすると $a-b=\sum_id_iB^i+c_nB^n$ となり、$a\ge b$ なら $0\le a-b< B^n$ から $c_n=0$ である。大小は、上の位から初めて数字が異なる位で決まる。$\square$

掛け算の筆算の手間

$0\le a< B^k$、$0\le b< B^l$ とする。$c_0=\dots=c_{k+l-1}=0$ から始め、$i=0,\dots,k-1$ の順に、桁上がり $t=0$ として $j=0,\dots,l-1$ について
$$ u=a_ib_j+c_{i+j}+t,\qquad t=\lfloor u/B\rfloor,\qquad c_{i+j}=u-Bt $$
と更新し、最後に $c_{i+l}=t$ とする。このとき途中の $u$ はつねに $B^2-1$ 以下で、終わったとき $ab=(c_{k+l-1}\cdots c_0)_B$ である。手間は $4kl$ 回以下、すなわち $O(kl)$ である。

要点:各 $i$ の段の前に、数字 $c$ の表す数が $\bigl(\sum_{i'< i}a_{i'}B^{i'}\bigr)b$ に等しいことを保つ。

詳しい証明を開く

$c_{i+j}\le B-1$ と $t\le B-1$ が保たれることを示す。$u\le(B-1)^2+(B-1)+(B-1)=B^2-1$ なので $t=\lfloor u/B\rfloor\le B-1$ であり、新しい $c_{i+j}$ は $u$ を $B$ で割った余りなので $B-1$ 以下である。段 $i$ の内側の繰り返しは、数 $C:=\sum_mc_mB^m$ に $a_iB^i\,b$ を足す計算になっている。実際、$j$ の更新の直前の桁上がり $t$ を位 $i+j$ に持ち越された量と見て $C+tB^{i+j}$ を考えると、更新でこの値は $-c_{i+j}B^{i+j}-tB^{i+j}+(u-Bt')B^{i+j}+t'B^{i+j+1}=a_ib_jB^{i+j}$ だけ増える($t'$ は新しい桁上がり)。段の最後に残った $t$ は $c_{i+l}$ に置く(段 $i$ の開始時には $c_{i+l}=0$ である。それまでの段が書くのは位 $i-1+l$ までだからである)。よって段 $i$ の後に $C=\bigl(\sum_{i'\le i}a_{i'}B^{i'}\bigr)b$ であり、最後に $C=ab$ となる。1 回の更新は掛け算 1 回・足し算 2 回・割り算 1 回なので、全体で $4kl$ 回以下である。$\square$

この掛け算は 掛け算の筆算と畳み込み の定理「積の各位は畳み込みで与えられる」の計算を、段ごとに繰り上げながら行ったものである。$k=l=n$ なら手間は $n^2$ に比例する。

割り算:商の数字の見積もり

$a\ge0$ を $b\ge1$ で割る筆算は、整数の筆算の仕組み の定理「割り算の筆算の正しさ」の $10$ を $B$ に替えたものである。上の位から順に、残り $r$ について $\lfloor r/(B^ib)\rfloor$ を商の $i$ 番目の数字として立て、$B^ib$ のその数倍を引く。同じ記事の補題「商の数字は上の桁だけで決まる」により、この数字は $x:=\lfloor r/B^i\rfloor$ を使って $\lfloor x/b\rfloor$ と書け、残りの大きさの条件から $x< Bb$ である。したがって割り算は、$x< Bb$ のとき 1 桁の数 $\lfloor x/b\rfloor$ を求める という問題の繰り返しになる。
$b$ が 1 桁なら $\lfloor x/b\rfloor$ は 1 回の 1 桁演算で求まる。$b$ が $l\ge2$ 桁のときは、$x$ と $b$ の上の桁だけで商を見積もる。そのために割る数を次の形に整える。

正規化された割る数

$l$ 桁の数 $b=(b_{l-1}\cdots b_0)_B$($b_{l-1}\ne0$)が $b_{l-1}\ge\lfloor B/2\rfloor$ を満たすとき、$b$ は 正規化されている という。

商の数字の見積もり

$B\ge2$、$l\ge1$ とし、$b=(b_{l-1}\cdots b_0)_B$ を正規化された $l$ 桁の数とする。$0\le x< Bb$ を満たす整数 $x$ を $l+1$ 桁で $x=(x_lx_{l-1}\cdots x_0)_B$ と表し、
$$ q:=\left\lfloor\frac{x}{b}\right\rfloor,\qquad \tilde q:=\left\lfloor\frac{x_lB+x_{l-1}}{b_{l-1}}\right\rfloor,\qquad \hat q:=\min(\tilde q,\ B-1) $$
とおく。このとき $0\le q\le B-1$ であり、
$$ q\le\hat q\le q+2 $$
が成り立つ。

$\hat q$ は $x$ の上の 2 桁と $b$ の最上位の数字だけから 1 回の 1 桁演算で求まる。定理は、この仮の商から $1$ ずつ減らして確かめる回数が $2$ 回以下で済むことを保証する。

下からは余りで、上からは正規化で押さえる

$x< Bb$ なので $q\le B-1$ である。$x=(x_lB+x_{l-1})B^{l-1}+s$($0\le s< B^{l-1}$)と書く($l=1$ なら $s=0$)。
段 1($q\le\hat q$)。$\hat q=B-1$ なら $q\le B-1=\hat q$ である。そうでなければ $\hat q=\tilde q$ である。$x_lB+x_{l-1}-\tilde qb_{l-1}$ は $x_lB+x_{l-1}$ を $b_{l-1}$ で割った余りなので $b_{l-1}-1$ 以下である。$b\ge b_{l-1}B^{l-1}$ を使うと
$$ x-\tilde q\,b\le x-\tilde q\,b_{l-1}B^{l-1}=(x_lB+x_{l-1}-\tilde qb_{l-1})B^{l-1}+s\le(b_{l-1}-1)B^{l-1}+B^{l-1}-1< b_{l-1}B^{l-1}\le b $$
となる。よって $x<(\tilde q+1)b$ であり、$q=\lfloor x/b\rfloor\le\tilde q=\hat q$ である。
段 2($\hat q\le q+2$ の準備)。$b$ の下の $l-1$ 桁がすべて $0$、すなわち $b=b_{l-1}B^{l-1}$ なら、整数の筆算の仕組み の補題「商の数字は上の桁だけで決まる」($10$ を $B$ に替えたもの)により $q=\lfloor x/(B^{l-1}b_{l-1})\rfloor=\lfloor(x_lB+x_{l-1})/b_{l-1}\rfloor=\tilde q$ なので、$\hat q\le\tilde q=q$ である。以下 $b> b_{l-1}B^{l-1}$ とする。このとき $b> B^{l-1}$ であり、$b<(b_{l-1}+1)B^{l-1}$ から $b_{l-1}B^{l-1}> b-B^{l-1}>0$ である。よって
$$ \tilde q\le\frac{x_lB+x_{l-1}}{b_{l-1}}=\frac{(x_lB+x_{l-1})B^{l-1}}{b_{l-1}B^{l-1}}\le\frac{x}{b_{l-1}B^{l-1}}<\frac{x}{b-B^{l-1}} $$
である。
段 3($\hat q\le q+2$)。$\hat q\ge q+3$ と仮定して矛盾を導く。$q> x/b-1$ と段 2 から
$$ 3\le\hat q-q\le\tilde q-q<\frac{x}{b-B^{l-1}}-\frac{x}{b}+1=\frac{x\,B^{l-1}}{b\,(b-B^{l-1})}+1 $$
なので、$\dfrac{x}{b}>\dfrac{2(b-B^{l-1})}{B^{l-1}}\ge2(b_{l-1}-1)$ である(最後は $b\ge b_{l-1}B^{l-1}$ による)。すると $q> x/b-1> 2b_{l-1}-3$ であり、$q$ は整数なので $q\ge2b_{l-1}-2$ である。一方 $q\le\hat q-3\le B-4$ なので $2b_{l-1}-2\le B-4$、すなわち $b_{l-1}\le B/2-1<\lfloor B/2\rfloor$ となり、$b$ が正規化されていることに反する。$\square$

正規化されていない $b$ は、1 桁の数を掛けて正規化できる。

正規化の係数

$b$ を $l$ 桁の数、$v:=b_{l-1}\ge1$ をその最上位の数字とし、$d:=\lfloor B/(v+1)\rfloor$ とおく。このとき $1\le d\le B-1$ であり、$db$ は正規化された $l$ 桁の数である。また $a\ge0$ について、$a=bq+r$($0\le r< b$)なら $da=(db)q+dr$($0\le dr< db$)なので、$da$ を $db$ で割った商は $q$、余りは $dr$ である。

要点:$d(v+1)\le B$ から桁数が増えず、$v<\lfloor B/2\rfloor$ のときは $dv\ge(B-1)/2$ を示す。

詳しい証明を開く

$v+1\le B$ なので $d\ge1$、$v\ge1$ なので $d\le B/2< B$ である。$b<(v+1)B^{l-1}$ から $db< d(v+1)B^{l-1}\le B^l$ なので $db$ は $l$ 桁で表せ、その最上位の数字 $\lfloor db/B^{l-1}\rfloor$ は $dv$ 以上である。$v\ge\lfloor B/2\rfloor$ なら $dv\ge v\ge\lfloor B/2\rfloor$ である。$v<\lfloor B/2\rfloor$ なら $2v\le B-2$ である。$B/(v+1)$ の小数部分は $v/(v+1)$ 以下なので $d\ge(B-v)/(v+1)$ であり、$dv-\frac{B-1}{2}\ge\frac{v(B-v)}{v+1}-\frac{B-1}{2}=\frac{(v-1)(B-2v-1)}{2(v+1)}\ge0$ である。$dv$ は整数なので $dv\ge\lceil(B-1)/2\rceil=\lfloor B/2\rfloor$ である。後半は $a=bq+r$ に $d$ を掛ければよい。$\square$

割り算の手間

$a\ge0$ を $k$ 桁、$b\ge1$ を $l$ 桁の数とし、$k\ge l$ とする。商 $q=\lfloor a/b\rfloor$ と余り $a-bq$ は $O\bigl(l\,(k-l+1)\bigr)$ 回の 1 桁演算で求まる。商の各数字を立てる段で、仮の商 $\hat q$ を減らす回数は $2$ 回以下である。

正規化して 1 桁ずつ立てる

lem-mp-normalize の $d$ で $a'=da$、$b'=db$ とする。$1$ 桁の数を掛けるだけなので $O(k)$ 回で済み、商は変わらない。$m:=k-l+1$ とおくと、$a'< dB^k$ と $b'\ge dB^{l-1}$ から $a'< B^mb'$ である。
$r^{(m)}:=a'$ とし、$i=m-1,\dots,0$ の順に次を行う。$r^{(i+1)}< B^{i+1}b'$ が保たれるので、$x:=\lfloor r^{(i+1)}/B^i\rfloor$($r^{(i+1)}$ の位 $i$ から上の数字の並び)は $x< Bb'$ を満たし、$l+1$ 桁で表せる。thm-mp-trial-quotient の $\hat q$ を 1 回の 1 桁演算で求め、$y:=x-\hat qb'$ を prop-mp-schoolbook・prop-mp-add で $O(l)$ 回で計算する。$y<0$ の間は $y$ に $b'$ を足して $\hat q$ を $1$ 減らす。定理によりこれは $2$ 回以下で終わり、終わったとき $\hat q=\lfloor x/b'\rfloor$、$0\le y< b'$ である。この $\hat q$ を商の数字 $q_i$ とし、$r^{(i+1)}$ の位 $i$ から上を $y$ に置き換えたものを $r^{(i)}$ とする。整数の筆算の仕組み の補題「商の数字は上の桁だけで決まる」により $q_i=\lfloor r^{(i+1)}/(B^ib')\rfloor$、$r^{(i)}=r^{(i+1)}-B^ib'q_i$ であり、これは同じ記事の定理「割り算の筆算の正しさ」の手順そのものなので、$q=\sum_iq_iB^i$ が商、$r^{(0)}$ が $a'$ を $b'$ で割った余りである。余り $a-bq=r^{(0)}/d$ は 1 桁の数での割り算なので $O(l)$ 回で求まる。
各段の手間は $O(l)$ で段は $m$ 個あり、ほかの手間は $O(k)$ である。$(l-1)(m-1)\ge0$ から $k=l+m-1\le lm$ なので、全体は $O(lm)=O\bigl(l(k-l+1)\bigr)$ である。$\square$

$1728\mathbin{÷}27$ を正規化して割る

$B=10$ とする。$b=27$ の最上位の数字は $2<5$ なので、$d=\lfloor10/3\rfloor=3$ を掛けて $a'=5184$、$b'=81$ とする($k=4$、$l=2$、$m=3$)。

  • 百の位:$x=51< 81$。$\hat q=\lfloor5/8\rfloor=0$ なので $q_2=0$。
  • 十の位:$x=518$。$\hat q=\lfloor51/8\rfloor=6$、$518-6\cdot81=32\ge0$ なので $q_1=6$。残りは $324$。
  • 一の位:$x=324$。$\hat q=\lfloor32/8\rfloor=4$、$324-4\cdot81=0$ なので $q_0=4$。
    商は $64$、余りは $0/3=0$ である。正規化しないで上の桁 $17\mathbin{÷}2$ から見積もると、仮の商 $8$ から $6$ まで 2 回減らす必要があった(整数の筆算の仕組み の例「仮の商を修正する」)。

Karatsuba の方法

掛け算の筆算と畳み込み の定理「Karatsuba の等式」は、2 つに分けた数の積を 3 回の積で求める等式である。整数で使うと、和 $a_1+a_0$ の桁が 1 つ増えることがある(同じ記事の注意「整数に使うときの注意」)。和の代わりに差を使うと、桁は増えない。
$$ a_0b_1+a_1b_0=a_0b_0+a_1b_1-(a_0-a_1)(b_0-b_1) $$
は右辺を展開すれば確かめられ、$0\le a_0,a_1< B^m$ なら $\lvert a_0-a_1\rvert< B^m$ である。

Karatsuba の方法の手間

$B$ によらない定数 $C$ があって、$n$ 桁以下の $0$ 以上の 2 つの整数の積は、$C\,n^{\log_23}$ 回以下の 1 桁演算で求まる($\log_23=1.584\cdots$)。

半分に分けて 3 回の積に帰着する

段 1(手順)。$n=2^k$ のとき、$0\le a,b< B^n$ の積を求める手順 $K_k$ を帰納的に定める。$K_0$ は 1 桁の掛け算 1 回と、積を 2 桁の数字に分ける割り算 1 回である。$k\ge1$ なら $m:=2^{k-1}$ とし、$a=a_1B^m+a_0$、$b=b_1B^m+b_0$($0\le a_0,a_1,b_0,b_1< B^m$)と分ける(数字の並びを上下に分けるだけである)。

  1. $p_0:=a_0b_0$、$p_2:=a_1b_1$ を $K_{k-1}$ で求める。
  2. $\lvert a_0-a_1\rvert$、$\lvert b_0-b_1\rvert$ とその符号を prop-mp-add で求め、$p_1:=(a_0-a_1)(b_0-b_1)$ を、絶対値の積を $K_{k-1}$ で求めて符号を付けて得る。
  3. $ab=p_2B^{2m}+(p_0+p_2-p_1)B^m+p_0$ を足し算・引き算で組み立てる。
    正しさは上の等式と $ab=a_1b_1B^{2m}+(a_0b_1+a_1b_0)B^m+a_0b_0$ による。
    段 2(漸化式)。2 と 3 の足し算・引き算・比較は、どれも $4m+1$ 桁以下の数についてのもので、回数も一定である。よって $k,B$ によらない定数 $c\ge1$ があって、手順 $K_k$ の手間 $T(k)$ は
    $$ T(0)=2,\qquad T(k)\le3\,T(k-1)+c\,2^k\quad(k\ge1) $$
    を満たす。
    段 3(漸化式を解く)。$T(k)\le(2+2c)3^k-2c\,2^k$ を $k$ についての帰納法で示す。$k=0$ では右辺は $2$ である。$k-1$ で成り立てば
    $$ T(k)\le3\bigl((2+2c)3^{k-1}-2c\,2^{k-1}\bigr)+c\,2^k=(2+2c)3^k-2c\,2^k $$
    である。とくに $T(k)\le(2+2c)3^k$ である。
    段 4(一般の $n$)。$n\ge1$ 桁以下の数は、上に $0$ を補って $2^k$ 桁の数と見なせる。ここで $k:=\lceil\log_2n\rceil$ とすると $2^k< 2n$ なので
    $$ 3^k=(2^k)^{\log_23}<(2n)^{\log_23}=3\,n^{\log_23} $$
    であり、手間は $3(2+2c)\,n^{\log_23}$ 以下である($0$ を補う手間は数えなくてよい)。$C:=3(2+2c)$ とすればよい。$\square$

この方法は Karatsuba によるもので、Sho08 の Exercise 3.41 に同じ差の形の分割があり、§3.6 に Karatsuba への帰属がある。実際の計算では、桁数が小さいところでは筆算の方が速いので、ある桁数より下では prop-mp-schoolbook に切り替える。

高速 Fourier 変換による掛け算

$a=\sum_{j< n}a_jB^j$、$b=\sum_{j< n}b_jB^j$ の積の位ごとの和 $c_k:=\sum_{j}a_jb_{k-j}$ は、数字の並びの畳み込みであり、$c_k$ を全部求めてから繰り上げれば $ab$ の数字が得られる(掛け算の筆算と畳み込み の定理「積の各位は畳み込みで与えられる」の $10$ を $B$ に替えたもの)。畳み込みは 高速Fourier変換 で計算できる。浮動小数点数では丸めの誤差が入るので、素数 $p$ を法とする整数の上で変換する方法を述べる。

数論変換で積の係数を正確に求める条件

$0\le a,b< B^n$ とし、$c_k$ を上の位ごとの和とする。$N=2^s\ge\max(2n-1,2)$ と素数 $p$ が $N\mid p-1$ と $p> n(B-1)^2$ を満たすとする。このとき、$\mathbb{F}_p$ に $\omega^{N/2}=-1$ となる元 $\omega$ があり、高速Fourier変換 の定理「1 の冪根をもつ環の上の FFT」と定理「FFT による多項式の積」(その後の段落にあるとおり、環の上でも同じ式が成り立つ)の計算を $\mathbb{F}_p$ で行って得られる $c_k\bmod p$ から、$c_k$ 自身が決まる。

要点:$0\le c_k\le n(B-1)^2< p$ なので、$c_k$ は $p$ で割った余りから決まる。

詳しい証明を開く

$c_k$ は $0\le j< n$ かつ $0\le k-j< n$ を満たす $j$ についての和で、項は $n$ 個以下、各項は $(B-1)^2$ 以下なので $0\le c_k\le n(B-1)^2< p$ である。$\mathbb{F}_p^\times$ は位数 $p-1$ の巡回群である(原始根)。生成元 $g$ をとり $\omega:=g^{(p-1)/N}$ とすると $\omega$ の位数はちょうど $N$ なので、$\eta:=\omega^{N/2}$ は $\eta\ne1$、$\eta^2=1$ を満たし、体の中では $\eta=-1$ である。$p$ は奇素数なので $2$ は $\mathbb{F}_p$ で可逆であり、高速 Fourier 変換の記事の 2 つの定理の条件が満たされる。多項式の積の係数は整数係数の多項式 $\sum a_jx^j$ と $\sum b_jx^j$ の積の係数 $c_k$ を $p$ で割った余りであり、$N\ge2n-1$ なので回り込みは起きない。$0\le c_k< p$ なので、余りの代表を $0$ 以上 $p$ 未満にとれば $c_k$ そのものである。$\square$

変換は $\mathbb{F}_p$ の演算 $O(N\log N)$ 回で済む。ただし $p> n(B-1)^2$ は $n$ とともに大きくなるので、$\mathbb{F}_p$ の 1 回の演算は 1 桁演算 1 回ではなく、この回数がそのまま 1 桁演算の回数の評価にはならない。実用では、いくつかの素数で計算して中国剰余定理(中国剰余定理)で組み合わせる。さらに速い方法があり、整数の積の手間は $n^{\log_23}$ よりずっと小さくできることが知られている(この記事では証明しない。Sho08 §3.6)。
割り算も掛け算と同程度の手間に抑えられる。$1/b$ の近似を Newton法 で精度を倍々にしながら求めると、$n$ 桁の割り算の手間は、$n$ 桁の掛け算の手間の定数倍で済む(Sho08 Exercises 3.48–3.49。この記事では証明しない)。

反例:条件を外すと成り立たない

外す条件反例成り立たなくなること
$b$ が正規化されている$B=10$、$b=19$、$x=100$$\hat q=9$、$q=5$ で $\hat q\le q+2$ が崩れる
$x< Bb$$B=10$、$b=50$、$x=999$$q=19$ は 1 桁でなく、$\hat q=9< q$
$\tilde q$ を $B-1$ で切り詰める$B=5$、$b=(241)_5$、$x=(2400)_5$$\tilde q=7=q+3$
$p> n(B-1)^2$$B=10$、$n=2$、$99\times99$、$p=97$$c_1=162$ が $p$ を超え、余り $65$ から $c_1$ が決まらない
反例の確かめ
  1. $b=19$ の最上位の数字は $1<5$。$x=(100)_{10}$ で $\tilde q=\lfloor10/1\rfloor=10$、$\hat q=9$、$q=\lfloor100/19\rfloor=5$。仮の商を 4 回減らす必要がある。
  2. $b=50$ は正規化されている。$x=999\ge500$ で $q=19$、$\tilde q=\lfloor99/5\rfloor=19$ だが $\hat q=9$ に切り詰められ、$q\le\hat q$ が崩れる。筆算では $x< Bb$ が段ごとに保たれるので、この形は現れない。
  3. $b=(241)_5=71$ は最上位の数字 $2=\lfloor5/2\rfloor$ で正規化されている。$x=(2400)_5=350< 5\cdot71=355$ で、$q=\lfloor350/71\rfloor=4$、$\tilde q=\lfloor(2\cdot5+4)/2\rfloor=7$。切り詰めた $\hat q=4$ は $q$ に等しい。$B=10$ では $l\le2$ の場合をすべて調べても $\tilde q\le q+2$ であった。この例では $b_{l-1}=\lfloor B/2\rfloor< B/2$ である。
  4. $99=(99)_{10}$ の数字の畳み込みは $(81,162,81)$ で、$99\times99=81\cdot100+162\cdot10+81=9801$。$p=97$ で計算すると $(81,65,81)$ が得られ、$81\cdot100+65\cdot10+81=8831\ne9801$ となる。$n(B-1)^2=162\ge97$ である。

補足

  • 手間の測り方.ここでは 1 桁演算の回数を数えた。2 進法のビット演算の回数で測っても、$B$ を固定すれば定数倍しか変わらない。計算整数論 で使う「積は時間 $O(\operatorname{len}(a)\operatorname{len}(b))$、商と余りは時間 $O(\operatorname{len}(b)\operatorname{len}(q))$」という評価は、prop-mp-schoolbook と thm-mp-division の言い換えである(Sho08 Theorem 3.3)。どの計算のモデルで手間を測るかは 計算量理論 の問題である。
  • 割り算の見積もり.thm-mp-trial-quotient と同じ趣旨の評価が Sho08 Theorem 3.2 にある(仮定は $2y'\ge x/y$ の形で、証明の筋は異なる)(そこでは $B$ を 2 の冪とし、2 進法で左にずらして正規化する)。

関連項目

参考文献

Mathpediaは寄付と、参考文献の書籍リンク(Amazonアソシエイト)の紹介料で運営されています。 支援について / 寄付する