Eratosthenesの篩

同義語:エラトステネスの篩sieve of Eratosthenes線形篩

概要

Eratosthenesの篩(sieve of Eratosthenes)とは、$2$ から $N$ までの整数を並べ、$p^2\le N$ を満たす $p$ を小さい順に見て、$p$ が残っていれば $p^2,p^2+p,p^2+2p,\dots$ を消し、最後に残った数として $N$ 以下の素数をすべて求める方法である。合成数 $m$ は最小の素因数 $q$ について $q^2\le m$ を満たすので必ず消え、素数は消えない。消す操作の総数は $\sum_{p\le\sqrt N}(\lfloor N/p\rfloor-p+1)$ で、$N\sum_{p\le\sqrt N}1/p$ 以下、Mertens の定理により $O(N\log\log N)$ である。各合成数を最小の素因数の番でだけ消す線形篩や、区間 $(M,M+L]$ だけを篩う区間篩に変形できる。

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

前提知識: 素数, 合成数, 約数, 素因数分解

$50$ 以下の素数をすべて求めるのに、$2$ から $50$ までの数を 1 つずつ割り算で調べる必要はない。$2$ から $50$ までを並べ、まず $2$ を残して $2\cdot2=4$ から $2$ おきに $4,6,8,\dots,50$ を消す。消されずに残った次の数 $3$ について $3\cdot3=9$ から $3$ おきに $9,12,15,\dots,48$ を消し、次に残っている $5$ について $25,30,\dots,50$ を、$7$ について $49$ を消す。次に残っている $11$ は $11^2=121>50$ なので、ここで止めてよい。残った
$$ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 $$
の $15$ 個が $50$ 以下の素数のすべてである。割り算を 1 回もせず、倍数を数えて「消す」操作だけで素数表ができる。これが Eratosthenes の篩(ふるい)である。
篩が正しく働くのは、合成数 $m$ が必ず $\sqrt m$ 以下の素因数をもつからである。この記事では、篩を $p^2$ から消し始める形で定義し、それが $N$ 以下の素数をちょうど残すこと、各数が何回消されるか、消す操作の総数の正確な式と上からの評価を証明する。さらに、各合成数をちょうど 1 回だけ消す改良(線形篩)と、長い区間の一部だけを篩う区間篩を証明付きで述べる。

定義

Eratosthenesの篩

整数 $N\ge2$ に対し、次の手順を Eratosthenes の篩(sieve of Eratosthenes)という。

  1. $2,3,\dots,N$ のすべてに「残っている」という印をつける。
  2. $p=2,3,4,\dots$ の順に、$p^2\le N$ である限り次を行う:$p$ に「残っている」印がついていれば、$p$ の倍数
    $$ p^2,\ p^2+p,\ p^2+2p,\ \dots\qquad(N\text{ 以下}) $$
    の印を「消えた」に変える(すでに消えていればそのまま)。$p$ が消えていれば何もしない。
  3. 最後に「残っている」印のついた数を出力する。

手順 2 で 1 つの数の印を「消えた」にする操作を、その数を 消す といい、すでに消えている数を消す場合も 1 回と数える。2 の中で、$p$ が残っていて倍数を消すことを「$p$ の番を行う」という。
同じ名前で呼ばれる手順にはいくつかの形がある。

  • $p$ の番で $2p$ から消し始める形(Sho08 §5.4、p. 115)。$p^2$ から始めても結果が変わらないことは thm-soe-sieve からわかる。
  • 素数 $p$ で割り切れる数を候補の列から取り除き、残った列の先頭を次の素数とする形(Ste17 Algorithm 1.2.3、p. 12。はじめから奇数だけを並べる)。
  • 「$\sqrt N$ 以下の素数で割り切れないものを残す」と述べる形(Cri24 Algorithm 6.2.3、p. 76)。
    基本の形($2p$ から消し始め、$\sqrt N$ 以下の $d$ まで行う)が $N$ 以下の素数を残すことは、素数計数関数 の記事の命題「篩の正しさ」で証明されている。この記事では $p^2$ から消す形で、消す回数まで込めて証明する。

直感

$N$ 以下の合成数 $m$ は、その最小の素因数 $q$ の倍数であり、しかも $m=q\cdot(m/q)$ で $m/q\ge q$ なので $m\ge q^2$ である。したがって、「各素数 $q$ について、$q^2$ 以上の $q$ の倍数を消す」ことを $q^2\le N$ の範囲の素数について行えば、すべての合成数が少なくとも 1 回は消される。素数は自分より小さい素数の倍数ではないので消されない。倍数を消す操作は足し算で次の倍数に進むだけなので、$1$ つずつ割り算で素数かどうか確かめるより、はるかに速い。代わりに、$N$ 個の印を置く場所が必要になる。

例と反例

$N=100$ の篩

$\sqrt{100}=10$ なので、番を行うのは $p=2,3,5,7$ である($4,6,8,9,10$ はその時点で消えている)。各番で消す回数と、その番で新しく消える数の個数は次のとおりである。

$p$消す数消す回数新しく消える数
$2$$4,6,\dots,100$$49$$49$
$3$$9,12,\dots,99$$31$$16$($9,15,21,\dots,99$)
$5$$25,30,\dots,100$$16$$6$($25,35,55,65,85,95$)
$7$$49,56,\dots,98$$8$$3$($49,77,91$)

消す回数は合計 $104$ 回、新しく消える数は合計 $74$ 個で、$2$ 以上 $100$ 以下の $99$ 個のうち $99-74=25$ 個が残る。これが $100$ 以下の $25$ 個の素数である。$104-74=30$ 回は、すでに消えた数をもう一度消している($12$ は $2$ と $3$ の番で、$30$ は $2,3,5$ の番で消される)。

反例:止めるのが 1 つ早い

手順 2 の条件を $p^2\le N$ ではなく $p^2< N$ にすると、$N=49$ では $p=7$ の番が行われず、$49=7^2$ が消されずに残る。$N=25$ でも $25$ が残る。この例は、「$p^2\le N$ の範囲の素数 $p$ をすべて使う」という条件を外すと、「残った数はすべて素数」という結論が成り立たなくなることを示す。$N$ が素数の平方のときに限って起こる誤りなので、小さい $N$ で試しただけでは見つかりにくい。

反例:$p$ 自身から消す

手順 2 で $p^2$ の代わりに $p$ から消し始めると、$p$ 自身が消え、たとえば $N=10$ では $2,3$ も消えて $5,7$ しか残らない。消し始める数は $p$ より大きくなければならない($2p$ でも $p^2$ でもよい)。これは「素数は消されない」という結論を破る。

次の表は、篩とその変形から条件を 1 つずつ外したときの反例である。

外す条件反例成り立たなくなること
$p^2\le N$ まで番を行う$p^2< N$ で止める、$N=49$残った数がすべて素数($49$ が残る)
消し始めが $p$ より大きい$p$ から消す、$N=10$素数が残る($2,3$ が消える)
$p$ が残っているときだけ番を行う$d=2,\dots,10$ すべてで $d^2$ から消す、$N=100$thm-soe-sieve の 4 の式($146$ 回になり、式の値 $104$ と一致しない。結果は同じ)
$2$ 以上から始める$1$ を残して $1$ の番を行う$1$ の倍数としてすべての数が消える
区間篩で $\sqrt{M+L}$ 以下のすべての素数を使う$(100,130]$ を $2,3,5,7$ だけで篩う$121=11^2$ が残る
線形篩で「$p\le$ 最小素因数」で打ち切る打ち切らない各合成数をちょうど 1 回消すこと($12$ が $2\cdot6$ と $3\cdot4$ で 2 回)

3 行目は結果は正しいが無駄が増える例である($p$ が消えているなら $p$ の倍数はすでに $p$ の素因数の番で消えている)。5・6 行目は prop-soe-segment と thm-soe-linear の条件である。

性質

正しさと消す回数

篩の正しさと消す回数

$N\ge2$ とし、Eratosthenes の篩(def-soe-sieve)を行う。

  1. 番が行われるのは、$p^2\le N$ を満たす素数 $p$ のときだけであり、そのすべてで行われる。
  2. 最後に残る数は、ちょうど $N$ 以下の素数である。
  3. $2\le m\le N$ を満たす整数 $m$ が消される回数は、$m$ を割り切り $p^2\le m$ を満たす素数 $p$ の個数に等しい。
  4. 消す操作の総数は
    $$ E(N)=\sum_{p\le\sqrt N}\Bigl(\Bigl\lfloor\frac Np\Bigr\rfloor-p+1\Bigr) $$
    である(和は $\sqrt N$ 以下の素数 $p$ にわたり、$\lfloor\cdot\rfloor$ は 床関数)。
「どの数が消えているか」を不変条件で追う

手順 2 で $p$ の段に来た時点($p$ の番を行うかどうか決める直前)について、次の主張 $(\ast)_p$ を $p$ についての帰納法で示す。
$(\ast)_p$:$2\le m\le N$ について、$m$ が消えていることと、$m$ が「$q< p$ かつ $q^2\le m$ を満たす素数 $q$」で割り切れることは同値である。
$p=2$ の時点では何も消えておらず、$q<2$ となる素数もないので $(\ast)_2$ は成り立つ。$(\ast)_p$ を仮定する。
まず、$p$ の段で $p$ が残っていることと、$p$ が素数であることは同値である。実際 $(\ast)_p$ により、$p$ が消えていることは「$q< p$、$q^2\le p$ の素数 $q$ が $p$ を割る」ことと同値である。$p$ が素数ならそのような $q$ はない。$p$ が合成数なら、素数 の記事の命題「素因数の存在」により $p$ の最小の素因数 $q$ は $q\le\sqrt p$ を満たし、$q^2\le p$、$q< p$ である。
したがって $p$ の番が行われるのは $p$ が素数のときだけで、そのとき消されるのは $p^2,p^2+p,\dots$、すなわち「$p$ で割り切れて $p^2\le m$ を満たす $m\le N$」全体である。番を行わない($p$ が合成数の)ときは何も変わらず、$p$ の段で新しく条件に加わる $q=p$ は素数でないので条件も変わらない。どちらの場合も $(\ast)_{p+1}$ が成り立つ。これで帰納法が完了し、1 が示された。
手順が終わるのは $p^2>N$ となる最初の $p$ の段であり、$(\ast)_p$ が成り立っている。$m\le N$ について $q^2\le m$ なら $q^2\le N< p^2$ から $q< p$ なので、終了時に $m$ が消えていることは「$q^2\le m$ を満たす素数 $q$ が $m$ を割る」ことと同値である。
2:$m$ が素数なら、$m$ を割る素数は $m$ だけで $m^2>m$ なので、$m$ は残る。$m$ が合成数なら、最小の素因数 $q$ が $q^2\le m$ を満たす(上と同じ命題)ので、$m$ は消える。
3:1 と上の議論により、$m$ は、$m$ を割り $p^2\le m$ を満たす素数 $p$ の番でちょうど 1 回ずつ消され、それ以外の番では消されない。
4:素数 $p\le\sqrt N$ の番で消す数は、$p^2$ から $N$ までの $p$ の倍数 $p\cdot p,p\cdot(p+1),\dots,p\cdot\lfloor N/p\rfloor$ であり、その個数は $\lfloor N/p\rfloor-p+1$ である。これを番が行われるすべての $p$(1 により $\sqrt N$ 以下の素数全体)について足せばよい。$\square$

3 から、合成数 $m$ が消される回数は $1$ 以上で、$m$ が $\sqrt m$ 以下の相異なる素因数を 2 個以上もつと 2 回以上になる。たとえば $30$ は $2,3,5$(どれも $\sqrt{30}$ 以下)の番で 3 回、$14$ は $2$ の番だけで 1 回($7^2>14$)消される。$N=100$ では 4 の式が $49+31+16+8=104$ を与え、ex-soe-100 と一致する。
2 の証明は、篩の出力が「$\sqrt N$ 以下のどの素数でも割り切れない数と、$\sqrt N$ 以下の素数」であることも示している。この個数を包除原理で数えたものが 素数計数関数 の記事の定理「篩による $\pi(x)$ の公式」(Legendre の公式)であり、この記事では証明を繰り返さない。

消す操作の回数の評価

消す回数の上からの評価

$N\ge4$ について
$$ N-1-\pi(N)\le E(N)\le N\sum_{p\le\sqrt N}\frac1p\le\frac N2\log N $$
である。ここで $\pi(N)$ は $N$ 以下の素数の個数(素数計数関数)、$\log$ は自然対数である。

各項を $N/p$ で抑え、素数の逆数を整数の逆数で抑える

左の不等式:thm-soe-sieve の 2 と 3 により、$2$ 以上 $N$ 以下の合成数 $N-1-\pi(N)$ 個はそれぞれ 1 回以上消されるからである。
中央の不等式:$p\ge1$ なので $\lfloor N/p\rfloor-p+1\le N/p$ であり、thm-soe-sieve の 4 の各項をこれで抑えればよい。
右の不等式:$y:=\sqrt N\ge2$ とおく。$y$ 以下の素数は $2$ 以上 $\lfloor y\rfloor$ 以下の整数の一部なので、調和級数 の記事の命題「積分による上下の評価」の $H_n\le1+\log n$($H_n=\sum_{k=1}^n1/k$)を使って
$$ \sum_{p\le y}\frac1p\le\sum_{k=2}^{\lfloor y\rfloor}\frac1k=H_{\lfloor y\rfloor}-1\le\log\lfloor y\rfloor\le\log y=\frac12\log N $$
である。$\square$

実際の値は次のとおりである(計算機で篩を実行して数えた。$\sum1/p$ は $\sqrt N$ 以下の素数の逆数の和)。

$N$合成数の個数$E(N)$$N\sum_{p\le\sqrt N}1/p$
$10^2$$74$$104$$117.6$
$10^4$$8770$$16981$$18028.2$
$10^6$$921501$$2122048$$2198080.1$

右端の評価 $\frac N2\log N$ はおおまかで、$N=10^6$ では $6.9\times10^6$ 程度になる。素数の逆数の和については Mertens の定理 $\sum_{p\le x}1/p=\log\log x+O(1)$ があり(Sho08 Theorem 5.10、p. 110。この記事では証明しない)、これを中央の不等式に使うと $E(N)=O(N\log\log N)$ が得られる。これが Eratosthenes の篩の計算量としてよく知られた評価である(Sho08 §5.4、p. 116)。$E(N)$ と合成数の個数の比は $N=10^6$ で約 $2.3$ であり、同じ数を何度も消す分の無駄はあるが大きくない。$\log\log N$ は $N=10^{100}$ でも $5.4$ 程度にしかならない。

線形篩

同じ数を何度も消す無駄は、各合成数をその 最小の素因数 の番でだけ消すようにすれば、完全になくせる。$m$ の最小の素因数を $\operatorname{lpf}(m)$ と書く。

線形篩

$N\ge2$ に対し、配列 $s[2],\dots,s[N]$ をすべて $0$ にし、空の素数の列 $P$ を用意して、$i=2,3,\dots,N$ の順に次を行う手順を 線形篩 という。

  1. $s[i]=0$ なら、$s[i]:=i$ とし、$i$ を $P$ の末尾に加える。
  2. $P$ の素数 $p$ を小さい順にとり、$p\le s[i]$ かつ $pi\le N$ である限り $s[pi]:=p$ とする(この代入を「$pi$ を消す」という)。どちらかの条件が破れたらこの $i$ についての操作を終える。
線形篩の正しさ

線形篩を終えると、$P$ は $N$ 以下の素数を小さい順に並べた列であり、$2\le m\le N$ のすべてで $s[m]=\operatorname{lpf}(m)$ である。さらに、$N$ 以下の合成数はそれぞれちょうど 1 回だけ消され、素数は 1 回も消されない。したがって消す操作の総数は $N-1-\pi(N)$ である。

消す組 $(p,i)$ は最小の素因数で決まる

次の主張 $(\dagger)_i$ を $i$ についての帰納法で示す。以下の「消される数の最小の素因数」と「各合成数はちょうど 1 回消される」の議論は、段 $i$ の操作について $(\dagger)_i$ だけを使うので、$(\dagger)_2,\dots,(\dagger)_i$ が示された範囲でそのまま使える。
$(\dagger)_i$:$i$ の段に来た時点で、$P$ は $i$ 未満の素数を小さい順に並べた列であり、$2\le m< i$ のすべてで $s[m]=\operatorname{lpf}(m)$ であり、$s[i]\ne0$ は $i$ が合成数であることと同値で、そのとき $s[i]=\operatorname{lpf}(i)$ である。
消される数の最小の素因数:どの段でも、2 で $s[pi]:=p$ とするとき、$p$ は素数で $p\le s[i]$ である。帰納法の仮定と 1 により $s[i]=\operatorname{lpf}(i)$ なので($i$ が素数なら 1 で $s[i]=i$)、$p$ は $i$ のどの素因数以下でもあり、$p=\operatorname{lpf}(pi)$ である。つまり、消される数 $m=pi$ には必ず $s[m]:=\operatorname{lpf}(m)$ が書かれ、$pi\ge 2i>i$ なので、消されるのはいつもまだ段が来ていない数である。
帰納法:$(\dagger)_2$ は明らかである。$(\dagger)_i$ を仮定すると、$i$ の段の 1 で $s[i]=0$ なのは $i$ が素数のときちょうどであり、そのとき $i$ が $P$ に加わって $s[i]=i=\operatorname{lpf}(i)$ となる。$i$ が合成数なら $(\dagger)_i$ によりすでに $s[i]=\operatorname{lpf}(i)$ である。段 $i$ の 2 で書き換わるのは $pi>i$ の番号だけなので、$m\le i$ の $s[m]$ はこのあと変わらない。$i+1$ については、合成数なら次の段落により $i+1$ より前の段で消されて $s[i+1]=\operatorname{lpf}(i+1)$ となっており、素数なら $i+1=pi'$($i'\ge2$)とは書けないので一度も消されず $s[i+1]=0$ である。よって $(\dagger)_{i+1}$ が成り立つ。
各合成数はちょうど 1 回消される:$m\le N$ を合成数、$q=\operatorname{lpf}(m)$、$i=m/q$ とする。素数 の記事の命題「素因数の存在」により $q^2\le m$ なので $i\ge q\ge2$ であり、$i$ の素因数はどれも $m$ の素因数なので $\operatorname{lpf}(i)\ge q$ である。$i$ の段では、$q\le i$ の素数 $q$ は $P$ に入っている($q=i$ のときは同じ段の 1 で加わる)。2 で $P$ を小さい順にたどるとき、$q$ 以下の素数 $p$ はどれも $p\le q\le\operatorname{lpf}(i)=s[i]$ と $pi\le qi=m\le N$ を満たすので打ち切られず、$p=q$ で $m=qi$ が消される。逆に、ある段 $i'$ で素数 $p'$ によって $m=p'i'$ が消されたとすると、上で示したとおり $p'=\operatorname{lpf}(m)=q$ であり、$i'=m/q=i$ である。1 つの段で同じ $p$ は 1 回しか使わないので、$m$ が消されるのはちょうど 1 回である。素数は $pi$($p,i\ge2$)の形に書けないので消されない。
終了後の主張は $(\dagger)_N$ と $N$ の段の操作から従う。$\square$

2 の打ち切り条件「$p\le s[i]$」を外すと、$12=2\cdot6=3\cdot4$ のように、最小でない素因数 $3$ でも消されて 2 回消される数が出る(反例の表の 6 行目)。$N=10^5$ で線形篩を実行すると、消す操作は $90407$ 回で、$10^5$ 以下の合成数の個数 $10^5-1-9592$ にちょうど等しかった。
線形篩が作る表 $s[m]=\operatorname{lpf}(m)$ を使うと、$m$ を $s[m]$ で割ることを繰り返して、割り算 $O(\log m)$ 回で $m$ を素因数分解できる。さらに、乗法的関数 $f$ の値の表も作れる。$m=p^em'$($p=\operatorname{lpf}(m)$、$p\nmid m'$)とすると $f(m)=f(p^e)f(m')$ で、$m'< m$ の値はすでに求まっているからである。$N=30$ で $\varphi$ を計算すると、たとえば $\varphi(12)=\varphi(4)\varphi(3)=2\cdot2=4$、$\varphi(30)=\varphi(2)\varphi(15)=1\cdot8=8$ となる。

区間篩

$N$ が大きいと $N$ 個の印を置く場所がとれない。区間 $(M,M+L]$ の素数だけが欲しいときは、長さ $L$ の配列だけで篩える。

区間篩

整数 $M\ge1$、$L\ge1$ とし、$Y:=M+L$ とおく。$\sqrt Y$ 以下の各素数 $p$ について、$(M,Y]$ に入る $p$ の倍数のうち $p^2$ 以上のものをすべて消す。このとき $(M,Y]$ で最後に残る数は、ちょうど $(M,Y]$ に入る素数である。

合成数の最小の素因数は $\sqrt Y$ 以下

$m\in(M,Y]$ が素数なら、$m$ を割る素数は $m$ だけで、$m^2>m$ なので $m$ は $p^2\le m$ を満たす $p$ の倍数として消されることはない。$m$ が合成数なら、最小の素因数 $q$ は $q^2\le m\le Y$ を満たすので $q\le\sqrt Y$ であり、$m$ は $q^2$ 以上の $q$ の倍数として消される。$\square$

$\sqrt Y$ 以下の素数は、長さ $\sqrt Y$ の配列で普通の篩を行えば求まる。したがって記憶に要する大きさは $L+\sqrt Y$ 程度で済む(Sho08 Exercise 5.18、p. 116 は、$N$ 以下の素数を大きさ $O(\sqrt N)$ の補助配列だけで列挙できるよう篩を変形せよという演習である)。$(100,130]$ では $\sqrt{130}<12$ なので $2,3,5,7,11$ を使い、残るのは $101,103,107,109,113,127$ である。$11$ を使わないと $121$ が残る(反例の表の 5 行目)。

補足

歴史

この方法は紀元前 3 世紀の Eratosthenes によるとされる。Dickson の記述では、奇数の列 $3,5,7,\dots$ から $3$ の平方と $9$ から先の 3 番目ごとの数を消し、次に $5$ の平方と $25$ から先の 5 番目ごとの数を消し、…と進め、次に残っている数の平方が上限を超えたら止める(Dic05 Chapter XIII、p. 347)。同じ箇所によれば、Nicomachus と Boethius は $5^2$ ではなく $5$ から、$7^2$ ではなく $7$ から始めて、上限未満の数の素因数も同時に得ており、Ibn al-Banna(13 世紀末)は篩で使う数を上限の平方根以下に限ってよいことを注意している。

篩法へ

「小さい素数の倍数を取り除いて残りを数える」という考え方は、素数の分布を調べる 篩法 に一般化されている。素数計数関数 の記事の命題「素数の割合の極限」は、最初の $r$ 個の素数で篩ったあとに残る数の割合 $\prod_{i\le r}(1-1/p_i)$ を使って $\pi(x)/x\to0$ を示しており、篩の考え方の簡単な応用になっている。

関連項目

参考文献

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