多倍長演算(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 変換も掛け算に使われる。
前提知識: 整数の筆算の仕組み, 掛け算の筆算と畳み込み, 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 変換による掛け算が正確な答えを出すための条件を述べる。
$B\ge2$ を整数とし、底 という。
$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$ とする。
要点:$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$ 回以下である。
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$
$B=10$ とする。$b=27$ の最上位の数字は $2<5$ なので、$d=\lfloor10/3\rfloor=3$ を掛けて $a'=5184$、$b'=81$ とする($k=4$、$l=2$、$m=3$)。
掛け算の筆算と畳み込み の定理「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$ である。
$B$ によらない定数 $C$ があって、$n$ 桁以下の $0$ 以上の 2 つの整数の積は、$C\,n^{\log_23}$ 回以下の 1 桁演算で求まる($\log_23=1.584\cdots$)。
段 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$)と分ける(数字の並びを上下に分けるだけである)。
この方法は Karatsuba によるもので、Sho08 の Exercise 3.41 に同じ差の形の分割があり、§3.6 に Karatsuba への帰属がある。実際の計算では、桁数が小さいところでは筆算の方が速いので、ある桁数より下では prop-mp-schoolbook に切り替える。
$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$ が決まらない |
Mathpediaは寄付と、参考文献の書籍リンク(Amazonアソシエイト)の紹介料で運営されています。 支援について / 寄付する