計算整数論

同義語:算法的整数論computational number theoryalgorithmic number theory反復二乗法repeated squaringFermatテストFermat primality test

概要

計算整数論(computational number theory)とは、最大公約数、法 $n$ での逆元や冪、素数判定、素因数分解などの整数論の問題を解く算法と、その手間を調べる分野である。手間は整数の大きさではなくビット長で測り、Euclid の互除法は時間 $O(\operatorname{len}(a)\operatorname{len}(b))$、反復二乗法による $a^e\bmod n$ の計算は時間 $O(\operatorname{len}(e)\operatorname{len}(n)^2)$ で済む。Fermat の小定理による判定では、Carmichael 数でない合成数なら底の半分以上が合成数であることを見抜くので、確率的な素数判定が多項式時間でできる。一方、素因数分解には効率的な算法が知られておらず、この差が RSA 暗号の安全性の根拠になっている。

$$\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}} $$

前提知識: Euclidの互除法, 合同式の割り算と逆元, Fermatの小定理, Lagrangeの定理

計算整数論 は、整数論の問題を解く手順(算法)を設計し、その手順がどれだけの手間で終わるかを調べる分野である。最大公約数、法 $n$ での逆元や冪、素数かどうかの判定、素因数分解、離散対数などが典型的な問題である。数百桁の整数を扱う暗号(RSA暗号)では、「手順があること」だけでなく「現実的な時間で終わること」が本質になる。
手間を測るときの基準は、入力の整数そのものの大きさではなく、その 桁数(ビット長)である。$n$ の桁数は約 $\log_2n$ なので、$n$ 回の操作が要る手順は、桁数で測ると指数関数的に遅い。この記事では、桁数で測った計算量を定め、Euclid の互除法が桁数の 2 乗程度の手間で終わること(thm-cnt-euclid-time)、冪乗剰余が反復二乗法で桁数の 3 乗程度の手間で求まること(thm-cnt-repeated-squaring)を証明する。さらに、Fermat の小定理による素数判定で、ある条件のもとでは半分以上の底が合成数を見抜くこと(thm-cnt-fermat-test)を示す。素数判定の個々の方法(Miller-Rabin素数判定法 など)や 素因数分解アルゴリズム は、それぞれの記事で扱う。

定義

ビット長

整数 $a\ne0$ の ビット長 $\operatorname{len}(a)$ を、$\lvert a\rvert$ を 2 進法で書いたときの桁数、すなわち $\lfloor\log_2\lvert a\rvert\rfloor+1$ と定め、$\operatorname{len}(0):=1$ とする。正の整数 $a$ については
$$ 2^{\operatorname{len}(a)-1}\le a < 2^{\operatorname{len}(a)} $$
である。

算法の手間は、桁ごとの基本操作(ビット演算)の回数で測る。入力の整数のビット長の合計を $N$ とするとき、ある定数 $C,k$ について手間がつねに $CN^k$ 以下である算法を 多項式時間 の算法という。$O$ は Landau記号 の意味で使い、「時間 $O(g)$」は、入力によらない定数 $C$ について手間が $Cg$ 以下であることを表す。

基本演算の手間(この記事では証明しない)

筆算と同じ方法で、整数 $a,b$ の和と差は時間 $O(\operatorname{len}(a)+\operatorname{len}(b))$、積は時間 $O(\operatorname{len}(a)\operatorname{len}(b))$ で計算でき、$b\ne0$ のとき商 $q=\lfloor a/b\rfloor$ と余り $a-bq$ は時間 $O(\operatorname{len}(b)\operatorname{len}(q))$ で計算できる(Sho08 §3.3、Theorem 3.3、p. 62)。この記事ではこれを前提とし、証明しない。割り算の手間が $\operatorname{len}(a)$ ではなく商の長さ $\operatorname{len}(q)$ で決まることが、次の節で使う要点である。とくに、$0\le a,b < n$ のとき、$ab$ を $n$ で割った余りは時間 $O(\operatorname{len}(n)^2)$ で求まる($ab < n^2$ なので商のビット長は $\operatorname{len}(n)+1$ 以下)。

直感

整数 $n$ を受け取る手順の手間を「$n$ の何乗か」で測ると、$n$ が $10^{100}$ 程度のときには、$\sqrt n$ 回の操作でさえ $10^{50}$ 回になり、終わらない。一方、ビット長 $\operatorname{len}(n)\approx333$ の何乗かで済む手順なら現実的である。たとえば $n$ が素数かどうかを、$2,3,4,\dots$ で順に割って確かめる 試し割り は最大で約 $\sqrt n=2^{\operatorname{len}(n)/2}$ 回の割り算を要し、ビット長について指数関数的である。計算整数論の基本的な問いは、こうした問題が ビット長の多項式時間 で解けるかどうかである。最大公約数・逆元・冪乗剰余・素数判定は多項式時間で解けるが、素因数分解と離散対数については多項式時間の算法が知られていない。

例

代表的な問題と手間

$n$ は法または入力の整数、$\ell=\operatorname{len}(n)$ とする。

問題手間所在
$\gcd(a,b)$($a\ge b\ge0$)$O(\operatorname{len}(a)\operatorname{len}(b))$thm-cnt-euclid-time
法 $n$ での逆元$O(\ell^2)$拡張互除法(rem-cnt-extended)
$a^e\bmod n$$O(\operatorname{len}(e)\ell^2)$thm-cnt-repeated-squaring
素数判定(確率的)1 回の試行で $O(\ell^3)$thm-cnt-fermat-test、Miller-Rabin素数判定法
素数判定(決定的)$\ell$ の多項式rem-cnt-hard-problems
素因数分解多項式時間の算法は知られていないrem-cnt-hard-problems
互除法の計算

$a=1071$、$b=462$ では
$$ 1071=462\cdot2+147,\qquad462=147\cdot3+21,\qquad147=21\cdot7 $$
で、$\gcd(1071,462)=21$ である。割り算は 3 回で、商は $2,3,7$ である。一方 $a=89$、$b=55$(隣り合う Fibonacci 数)では、商がすべて $1$ の割り算が 8 回続いたあと、最後に $2=1\cdot2$ で終わり、割り算は 9 回になる。Euclidの互除法 の記事の命題「隣り合う Fibonacci 数は最悪の入力」のとおり、これが同じ大きさの入力で手数が最も多い場合である。

Euclid の互除法の手間

Euclidの互除法 では、$a\ge b>0$ について $r_0:=a$、$r_1:=b$ とし、$r_{i-1}=r_iq_i+r_{i+1}$($0\le r_{i+1} < r_i$)と割り算をくり返して、$r_{\lambda+1}=0$ となったところで止める($\lambda$ は割り算の回数である)。このとき $r_\lambda=\gcd(a,b)$ である(同記事の定理「互除法の停止と正しさ」)。$r_{i-1}\ge r_i$ なので商 $q_i$ はどれも $1$ 以上である。

積のビット長

正の整数 $x,y$ について $\operatorname{len}(x)+\operatorname{len}(y)-1\le\operatorname{len}(xy)\le\operatorname{len}(x)+\operatorname{len}(y)$ である。

def-cnt-length の不等式を掛けると $2^{\operatorname{len}(x)+\operatorname{len}(y)-2}\le xy < 2^{\operatorname{len}(x)+\operatorname{len}(y)}$ である。$xy$ のビット長は $2^{k-1}\le xy < 2^k$ となる $k$ なので、$\operatorname{len}(x)+\operatorname{len}(y)-1\le k\le\operatorname{len}(x)+\operatorname{len}(y)$ である。$\square$

割り算の回数

$a\ge b>0$ とし、互除法の割り算の回数を $\lambda$ とする。$1\le i\le\lambda$ について $r_{i+1} < r_{i-1}/2$ であり、$\lambda\le2\operatorname{len}(b)$ である。

段 1(2 段で半分以下). $r_i\le r_{i-1}/2$ なら $r_{i+1} < r_i\le r_{i-1}/2$ である。$r_i>r_{i-1}/2$ なら、$r_i\le r_{i-1} < 2r_i$ から $q_i=1$ であり、$r_{i+1}=r_{i-1}-r_i < r_{i-1}/2$ である。
段 2(回数). 段 1 をくり返すと、$k\ge0$ について $r_{2k+1}\le b/2^k$、$k\ge1$ について $r_{2k}\le r_2/2^{k-1} < b/2^{k-1}$ である($r_2 < r_1=b$)。$r_\lambda\ge1$ なので、$\lambda=2k+1$ なら $2^k\le b < 2^{\operatorname{len}(b)}$ から $k\le\operatorname{len}(b)-1$、すなわち $\lambda\le2\operatorname{len}(b)-1$ である。$\lambda=2k$ なら $2^{k-1} < b < 2^{\operatorname{len}(b)}$ から $k\le\operatorname{len}(b)$、すなわち $\lambda\le2\operatorname{len}(b)$ である。$\square$

1 回の割り算では半分以下になるとは限らない(ex-cnt-euclid-example の $89,55$ では $34>55/2$)。回数のよりよい上界は Euclidの互除法 の記事の定理「Laméの定理」にある。この記事では、回数を $O(\operatorname{len}(b))$ で押さえれば足りる。

互除法の手間

$a\ge b\ge0$ のとき、Euclid の互除法は $\gcd(a,b)$ を時間 $O(\operatorname{len}(a)\operatorname{len}(b))$ で計算する。

$b=0$ なら $a$ を出力するだけである。$b>0$ とする。rem-cnt-basic-arithmetic により、$i$ 回目の割り算は時間 $O(\operatorname{len}(r_i)\operatorname{len}(q_i))$ で、$r_i\le b$ なので、ある定数 $C$ について手間は $C\operatorname{len}(b)\operatorname{len}(q_i)$ 以下である($\operatorname{len}(q_i)\ge1$ なので、余りの入れ替えなどの一定の手間もここに含められる)。よって全体の手間は $C\operatorname{len}(b)\sum_{i=1}^\lambda\operatorname{len}(q_i)$ 以下である。
$r_{i+1}\ge0$ なので $r_{i-1}\ge r_iq_i$ であり、lem-cnt-length-product により
$$ \operatorname{len}(r_{i-1})\ge\operatorname{len}(r_iq_i)\ge\operatorname{len}(r_i)+\operatorname{len}(q_i)-1, $$
すなわち $\operatorname{len}(q_i)\le\operatorname{len}(r_{i-1})-\operatorname{len}(r_i)+1$ である。$i=1,\dots,\lambda$ について足すと右辺の和は打ち消し合い、
$$ \sum_{i=1}^\lambda\operatorname{len}(q_i)\le\operatorname{len}(r_0)-\operatorname{len}(r_\lambda)+\lambda\le\operatorname{len}(a)+2\operatorname{len}(b) $$
を得る(lem-cnt-euclid-steps)。$\operatorname{len}(b)\le\operatorname{len}(a)$ なので、全体の手間は $3C\operatorname{len}(a)\operatorname{len}(b)$ 以下である。$\square$

割り算 1 回の手間は最大で $\operatorname{len}(b)^2$ 程度、回数は $\operatorname{len}(b)$ 程度なので、素朴に掛けると $\operatorname{len}(b)^3$ 程度の上界しか出ない。商が大きい割り算は手間がかかるが、そのぶん余りが大きく減る。この釣り合いを、商の長さの和が打ち消し合う和で押さえられることで捉えたのが上の証明である(Sho08 Theorem 4.2、p. 76 と同じ方法)。

拡張互除法・逆元・中国剰余定理(この記事では証明しない)

拡張Euclidの互除法 で $as+bt=\gcd(a,b)$ となる $s,t$ も求める場合も、時間 $O(\operatorname{len}(a)\operatorname{len}(b))$ で済む(Sho08 Theorem 4.4、p. 80)。これを $n$ と $b$($0\le b < n$)に使うと、$\gcd(b,n)=1$ かどうかの判定と、そのときの法 $n$ での逆元の計算が時間 $O(\operatorname{len}(n)^2)$ でできる(同書 Theorem 4.5、p. 82)。互いに素な法 $n_1,\dots,n_k$ についての連立合同式の解(中国剰余定理)も、$n=n_1\cdots n_k$ として時間 $O(\operatorname{len}(n)^2)$ で求まる(同書 Theorem 4.6、pp. 82–83)。この記事ではこれらを証明しない。

冪乗剰余と反復二乗法

法 $n$ で $a^e$ を求めるのに、$a$ を $e-1$ 回掛ければ、掛け算の回数は $e$ に比例し、$\operatorname{len}(e)$ について指数関数的である。$e$ を 2 進法で書き、2 乗をくり返すと、回数を $\operatorname{len}(e)$ 程度に減らせる。

反復二乗法

$n\ge2$、$0\le a < n$、$e\ge1$ とし、$e$ を 2 進法で $e=(b_{m-1}b_{m-2}\cdots b_0)_2$($m=\operatorname{len}(e)$、$b_{m-1}=1$)と書く。$y:=1$ から始めて、$j=m-1,m-2,\dots,0$ の順に

  1. $y$ を $y^2$ を $n$ で割った余りに置き換え、
  2. $b_j=1$ なら、さらに $y$ を $ya$ を $n$ で割った余りに置き換える
    という操作を行い、最後の $y$ を出力する。この手順を 反復二乗法(repeated squaring)という。
反復二乗法の正しさと手間

反復二乗法は $a^e$ を $n$ で割った余りを出力し、法 $n$ での掛け算を $2\operatorname{len}(e)$ 回以下しか行わない。したがって手間は $O(\operatorname{len}(e)\operatorname{len}(n)^2)$ である。

$e_j:=\lfloor e/2^j\rfloor=(b_{m-1}\cdots b_j)_2$ とおく。$e_m=0$、$e_0=e$ であり、$e_j=2e_{j+1}+b_j$ である。
主張. $j$ についての操作を終えた時点で $y\equiv a^{e_j}\pmod n$ である。
$j=m-1$ の操作の前では $y=1=a^{e_m}$ である。$j+1$ の操作のあと $y\equiv a^{e_{j+1}}$ とすると、$j$ の操作 1 で $y\equiv a^{2e_{j+1}}$ になり、操作 2 で $b_j=1$ なら $a$ が掛かって、どちらの場合も $y\equiv a^{2e_{j+1}+b_j}=a^{e_j}$ となる。合同式は積と両立し、各段で $n$ で割った余りをとっても法 $n$ の値は変わらないからである。$j=0$ で $y\equiv a^{e_0}=a^e$ で、$0\le y < n$ なので $y$ は $a^e$ を $n$ で割った余りである。
手間. 操作は $m=\operatorname{len}(e)$ 回で、各回の掛け算は 2 回以下なので、法 $n$ での掛け算は $2\operatorname{len}(e)$ 回以下である。掛ける数はどれも $n$ 未満なので、rem-cnt-basic-arithmetic により 1 回は時間 $O(\operatorname{len}(n)^2)$ である。$\square$

$7^{45}$ を $97$ で割った余り

$45=(101101)_2$ である。上の桁から順に、$y$ は次のように変わる。

桁 $b_j$$1$$0$$1$$1$$0$$1$
2 乗のあと$1$$49$$73$$94$$53$$93$
$b_j=1$ なら $7$ を掛けたあと$7$$49$$26$$76$$53$$69$
表す冪 $a^{e_j}$$7^1$$7^2$$7^5$$7^{11}$$7^{22}$$7^{45}$

たとえば 3 列目では $49^2=2401=97\cdot24+73$、$73\cdot7=511=97\cdot5+26$ である。よって $7^{45}\equiv69\pmod{97}$ で、掛け算は 10 回(2 乗 6 回、$7$ を掛ける 4 回)で済んだ。素朴に掛けると 44 回かかる。

Fermat の小定理による素数判定

$n$ が素数なら、Fermatの小定理 により $n$ で割り切れないすべての $a$ について $a^{n-1}\equiv1\pmod n$ である。対偶をとると、$a^{n-1}\not\equiv1\pmod n$ となる $1\le a\le n-1$ が 1 つでも見つかれば、$n$ は合成数である。$a^{n-1}\bmod n$ は反復二乗法で時間 $O(\operatorname{len}(n)^3)$ で計算できる。このとき、$n$ の約数を 1 つも見つけずに合成数だと分かる点が、試し割りとの大きな違いである。問題は、合成数 $n$ に対してそのような $a$ がどれくらいあるかである。

Fermat の判定を通る底の個数

$n\ge2$ とし、$L_n:=\{a\mid1\le a\le n-1,\ a^{n-1}\equiv1\pmod n\}$ とおく。

  1. $n$ が素数なら、$L_n=\{1,2,\dots,n-1\}$ である。
  2. $n$ が合成数で、$n$ と互いに素なある整数 $a$ について $a^{n-1}\not\equiv1\pmod n$ となるなら、$\lvert L_n\rvert\le(n-1)/2$ である。

1 は Fermatの小定理 である。2 は、擬素数 の記事の系「擬素数にならない底の割合」の 2 から次のように従う。$a\in L_n$ なら $a\cdot a^{n-2}\equiv1\pmod n$ なので $a$ は $n$ と互いに素で、$1,\dots,n-1$ は法 $n$ で相異なるから、$\lvert L_n\rvert$ は $(\mathbb{Z}/n\mathbb{Z})^\times$ の元 $x$ で $x^{n-1}=1$ を満たすものの個数に等しい。2 の仮定は $n$ が Carmichael数 でないということなので、引いた系によりこの個数は $\varphi(n)/2$ 以下であり、$\varphi(n)\le n-1$ から $\lvert L_n\rvert\le(n-1)/2$ である。$\square$

この定理から、次の Fermat テスト が得られる:$1\le a\le n-1$ を無作為に選んで $a^{n-1}\bmod n$ を計算し、$1$ でなければ「合成数」、$1$ なら「おそらく素数」と答える。$n$ が素数なら決して「合成数」とは答えない。$n$ が 2 の仮定を満たす合成数なら、1 回の試行で「おそらく素数」と誤る確率は $\lvert L_n\rvert/(n-1)\le1/2$ であり、独立に $k$ 回くり返してすべて誤る確率は $2^{-k}$ 以下である。全体の手間は $O(k\operatorname{len}(n)^3)$ である(Sho08 §10.2、Theorem 10.1、p. 308 も同じ議論を述べている)。

$341$ と $561$

$341=11\cdot31$ は合成数だが $2^{340}\equiv1\pmod{341}$ で、底 $2$ では見抜けない(底 $2$ の 擬素数)。一方 $3^{340}\equiv56\pmod{341}$ なので、底 $3$ で合成数と分かる。$341$ と互いに素な $300$ 個の剰余類のうち $L_{341}$ に入るのは $100$ 個で、確かに $(341-1)/2=170$ 以下である。
$561=3\cdot11\cdot17$ では、$561$ と互いに素な $320$ 個の $a$ がすべて $a^{560}\equiv1\pmod{561}$ を満たす。このような合成数を Carmichael 数 という(Carmichael数)。Carmichael 数では thm-cnt-fermat-test の 2 の仮定が成り立たず、Fermat テストは $n$ と互いに素でない $a$ を引いたとき($561$ では $560$ 個中 $240$ 個)にしか合成数を見抜けない。素因数がどれも大きい Carmichael 数では、それは $n$ の約数を偶然見つけるのとほぼ同じである。

Carmichael 数は無数にあることが知られている(Carmichael数 の記事の定理「Carmichael数の無限性(Alford–Granville–Pomerance)」)。そこで実際には、Fermat テストを改良して、どんな奇数の合成数でも底の大部分が合成数を見抜く判定法が使われる。Jacobi 記号を使う判定法では、奇数の合成数 $n$ について、条件を満たす単元が単元全体の半分以下になる(Jacobi記号 の記事の定理「Euler–Jacobi の判定の誤り率」)。$n-1$ を割る 2 の冪を使う判定法は Miller-Rabin素数判定法 である。

条件を外した反例

外す条件反例成り立たなくなること
割り算で余りをとる(引き算だけをくり返す)$\gcd(n,1)$操作の回数が $\operatorname{len}(n)$ の多項式
lem-cnt-euclid-steps の「2 段で」(1 段にする)$89$ と $55$余りが 1 回の割り算で半分以下になる
2 乗をくり返す($a$ を順に掛ける)$e=2^k$掛け算の回数が $\operatorname{len}(e)$ の多項式
ビット長で測る($n$ の大きさで測る)試し割り$n$ の多項式の手間なら効率的
thm-cnt-fermat-test の 2 の「$a^{n-1}\not\equiv1$ となる単元 $a$ がある」$561=3\cdot11\cdot17$単元の半分以上が合成数を見抜く
反例の確認

各行の反例が、右の列の主張を破ることを確かめる。

各行の確認を開く

1 行目:大きいほうから小さいほうを引くことだけをくり返す手順では、$(n,1)$ から $(n-1,1),(n-2,1),\dots,(1,1)$ と進み、$n-1$ 回の引き算を要する。$n-1\ge2^{\operatorname{len}(n)-1}-1$ なので、回数は $\operatorname{len}(n)$ について指数関数的である。余りをとる割り算は、この引き算の連続を 1 回にまとめている。

2 行目:$a=89$、$b=55$ では $89=55\cdot1+34$ で、$r_2=34$ は $r_1=55$ の半分 $27.5$ より大きい。したがって 1 回の割り算で余りが半分以下になるとは限らない。2 段前の $r_0=89$ と比べると $34 < 89/2$ で、lem-cnt-euclid-steps のとおりである。

3 行目:$a^{2^k}$ を $a$ を順に掛けて求めると $2^k-1$ 回の掛け算を要するが、$\operatorname{len}(2^k)=k+1$ である。反復二乗法では 2 乗を $k$ 回くり返せば済む。

4 行目:試し割りは $n$ が素数のとき $2$ から $\lfloor\sqrt n\rfloor$ までのすべての数で割り、約 $\sqrt n$ 回の割り算をする。これは $n$ について多項式($n^{1/2}$)だが、$\sqrt n\ge2^{(\operatorname{len}(n)-1)/2}$ なので $\operatorname{len}(n)$ については指数関数的である。$100$ 桁の $n$ では $10^{49}$ 回以上になる。

5 行目:$561$ は Carmichael 数で、$561$ と互いに素なすべての $a$ について $a^{560}\equiv1\pmod{561}$ である(Carmichael数 の記事の例「最小の Carmichael 数 $561$」)。よって合成数を見抜く単元は $0$ 個である。

補足

多項式時間で解ける問題と、難しいと考えられている問題

素数判定は、決定的な(乱数を使わない)多項式時間の算法で解けることが知られている(Agrawal–Kayal–Saxena の算法。Sho08 第 21 章、p. 548。同書 §21.2、Theorem 21.3、p. 551 は手間を $O(\operatorname{len}(n)^{16.5})$ と評価している。この記事では証明しない)。実用上は、手間の小さい Miller-Rabin素数判定法 のような確率的な判定法が使われる。
一方、大きな整数の素因数分解については、長年の研究にもかかわらず効率的な算法は知られていない(Sho08 §9.6、p. 298)。素数 $p$ について法 $p$ の原始根を見つける問題も、$p-1$ の素因数分解が分からなければ効率的な算法は知られていない(同書 §11.1、p. 327)。素数を作ることは易しく、2 つの素数の積を素因数分解することは難しいと考えられている。この非対称性が RSA暗号 の安全性の根拠になっている。素因数分解の算法は 素因数分解アルゴリズム、離散対数については 離散対数問題 で扱う。

呼び名について

計算整数論は、算法的整数論(algorithmic number theory)とも呼ばれる。この記事で扱った最大公約数・逆元・冪乗剰余・Fermat テストは、整数の大きさを桁数で測る見方の最も基本的な例であり、多項式・有限体の計算(多項式の最大公約数、有限体の上の多項式の因数分解)や、楕円曲線を使う素数判定・素因数分解へと続く。

関連項目

参考文献

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