コンテンツにスキップ

擬似乱数生成器:線形合同法の周期・格子構造・並列ストリーム

対象読者: 学部の初等整数論(合同式・フェルマーの小定理・互除法・中国剰余定理)と、有限体や多項式環の基本を学んだ人。確率論や乱数の知識は仮定しません。

前提となる記事:合同式とフェルマーの小定理:余りだけの世界で計算する、整除と素因数分解:互除法・中国剰余定理・オイラー関数、多項式環と体の拡大:素因数分解の一意性から作図不能性まで

生 Markdown

コンピュータが出す「乱数」は、実はサイコロを振っているのではなく、決まった計算を繰り返して数を並べているだけです。そのため、並べ方に癖があると、見た目はばらばらでも計算の結果が偏ってしまいます。この記事では、代表的な作り方で数の列が何回で元に戻るか、数の組を点として描くとどんな模様になるか、複数の計算機で別々の列を使って重ならないかを、証明つきで調べます。読み終えると、乱数生成器の「癖」を式で見積もれるようになります。

  • 擬似乱数生成器は有限の状態集合の上の決定的な写像です。出力は必ず最終的に周期的になり、周期は状態数を超えません(命題 2.3)。
  • 線形合同法 xk+1=axk+c mod mx_{k+1} = ax_k + c \bmod m が全周期 mm をもつ条件は、gcd⁡(c,m)=1\gcd(c,m)=1、mm の各素因数 pp で a≡1(modp)a\equiv1 \pmod p、4∣m4\mid m なら a≡1(mod4)a\equiv 1\pmod 4 の 3 つです(定理 3.4)。法が 2e2^e のとき下位 rr ビットの周期は 2r2^r しかありません(命題 3.7)。
  • 全周期の線形合同法の連続する dd 個の組は格子の平行移動であり(定理 4.2)、高々 (d! m)1/d(d!\,m)^{1/d} 枚の平行な超平面の上に載ります(定理 4.3)。RANDU の 3 つ組は 15 枚の平面に載ります。
  • F2\mathbb{F}_2 上の線形生成器 xk+1=Axkx_{k+1} = Ax_k の周期が最大値 2n−12^n-1 になるのは、AA の特性多項式が原始多項式のとき、かつそのときに限ります(定理 5.3)。
  • 並列計算では、kk 歩先の状態を O(log⁡k)O(\log k) 回の演算で求める飛び越しで列を重なりなく分けられます。開始点を無作為に選ぶ場合、ss 本の長さ LL の列のどれかが重なる確率は s(s−1)L/Ps(s-1)L/P 以下です(定理 6.4)。

Monte Carlo 法の定理はすべて「独立で、[0,1)[0,1) 上に一様に分布する確率変数の列 U1,U2,…U_1, U_2, \ldots」を仮定します。ところが計算機が実際に返すのは、種(seed)から決定的な規則で作った数列です。同じ種からは同じ列が出るので、確率変数ではありません。それでも Monte Carlo 法が使えるのは、良い生成器の出力が、多くの計算にとって独立一様な列と区別がつかないからです。

問題は「区別がつかない」の範囲です。1960 年代に IBM の計算機で広く使われた RANDU という生成器は、連続する 3 つの出力を 3 次元の点として並べると、すべての点がわずか 15 枚の平面の上に載ります。3 次元の積分にこの生成器を使うと、立方体のほとんどの部分に点が 1 つも落ちません。この欠陥は、出力を 1 つずつ眺めても分かりません。

この章では、生成器の構造から証明できる性質を扱います。周期はどれだけか、連続する組はどう並ぶか、並列計算で複数の列に分けたとき列どうしが重ならないと言えるか、の 3 点です。これらは「独立一様な列」というモデルが擬似乱数に当てはまる範囲の下限を与えます。逆に、統計的な検定に合格するかどうかは経験的な事実で、定理にはなりません(注意 6.6)。

以下、N={1,2,…}\mathbb{N} = \{1, 2, \ldots\} とし、整数 xx を mm で割った余りを x mod m∈{0,1,…,m−1}x \bmod m \in \{0, 1, \ldots, m-1\} と書きます。合同式の記号と性質は合同式とフェルマーの小定理(定義 3.1[合同式とフェルマーの小定理]、命題 3.3[合同式とフェルマーの小定理])のものを使います。

定義 2.1(擬似乱数生成器)↗

擬似乱数生成器とは、有限集合 SS(状態集合)、写像 T:S→ST : S \to S(遷移)、有限集合 OO への写像 g:S→Og : S \to O(出力関数)の組 (S,T,g)(S, T, g) のことである。初期状態(種)s0∈Ss_0 \in S から、状態の列 sk+1=T(sk)s_{k+1} = T(s_k) と出力の列 yk=g(sk)y_k = g(s_k)(k=0,1,2,…k = 0, 1, 2, \ldots)が決まる。

出力集合 OO は、たとえば 64 ビットの整数の全体です。[0,1)[0,1) の実数がほしいときは、出力の整数を 2642^{64} などで割ります(倍精度の一様乱数の作り方は次章で扱います)。

定義 2.2(周期と前周期)↗

列 (zk)k≥0(z_k)_{k \ge 0} が最終的に周期的であるとは、整数 μ≥0\mu \ge 0 と λ≥1\lambda \ge 1 があって、すべての k≥μk \ge \mu で zk+λ=zkz_{k+\lambda} = z_k となることをいう。そのような λ\lambda の最小値を周期、周期 λ\lambda に対して条件を満たす μ\mu の最小値を前周期という。前周期が 00 のとき純周期的という。

命題 2.3(有限状態の生成器は最終的に周期的)✓

生成器 (S,T,g)(S, T, g) と任意の種 s0s_0 について次が成り立つ。

  1. 状態の列 (sk)(s_k) は最終的に周期的で、周期 λ\lambda と前周期 μ\mu は μ+λ≤∣S∣\mu + \lambda \le |S| を満たす。
  2. 出力の列 (yk)(y_k) も最終的に周期的で、その周期は λ\lambda の約数である。特に ∣S∣|S| 以下である。
  3. TT が全単射ならば、状態の列も出力の列も純周期的である。
証明(命題 2.3)

1. ∣S∣+1|S| + 1 個の状態 s0,s1,…,s∣S∣s_0, s_1, \ldots, s_{|S|} の中には、鳩の巣原理によって等しいものがあります。si=sjs_i = s_j(i<ji < j)となる組のうち jj が最小のものを取り、μ=i\mu = i、λ=j−i\lambda = j - i と置きます。jj の最小性から s0,…,sj−1s_0, \ldots, s_{j-1} は互いに異なるので、j=μ+λ≤∣S∣j = \mu + \lambda \le |S| です。

sμ+λ=sμs_{\mu+\lambda} = s_\mu の両辺に TT を k−μk - \mu 回施すと、すべての k≥μk \ge \mu で sk+λ=sks_{k+\lambda} = s_k となります。これが最小の周期であることを確かめます。ある λ′\lambda'(1≤λ′<λ1 \le \lambda' < \lambda)と μ′\mu' ですべての k≥μ′k \ge \mu' について sk+λ′=sks_{k+\lambda'} = s_k だとします。λ\lambda の倍数 qλq\lambda を μ+qλ≥μ′\mu + q\lambda \ge \mu' となるように取ると、sμ=sμ+qλ=sμ+qλ+λ′=sμ+λ′s_\mu = s_{\mu+q\lambda} = s_{\mu+q\lambda+\lambda'} = s_{\mu+\lambda'} です(最初と最後の等号は周期 λ\lambda から)。μ<μ+λ′<μ+λ=j\mu < \mu + \lambda' < \mu + \lambda = j なので、s0,…,sj−1s_0, \ldots, s_{j-1} が互いに異なることに反します。前周期が μ\mu であることも同じ理由によります(μ′<μ\mu' < \mu で sμ′+λ=sμ′s_{\mu'+\lambda} = s_{\mu'} なら、μ′+λ<j\mu' + \lambda < j で等しい状態が現れることになります)。

2. k≥μk \ge \mu で yk+λ=g(sk+λ)=g(sk)=yky_{k+\lambda} = g(s_{k+\lambda}) = g(s_k) = y_k なので、(yk)(y_k) は最終的に周期的です。その周期を λy\lambda_y とします。λ=qλy+r\lambda = q\lambda_y + r(0≤r<λy0 \le r < \lambda_y)と割ると、十分大きい kk で yk+r=yk+r+qλy=yk+λ=yky_{k+r} = y_{k+r+q\lambda_y} = y_{k+\lambda} = y_k となります。r≥1r \ge 1 なら rr が λy\lambda_y より小さい周期を与えて最小性に反するので、r=0r = 0、すなわち λy∣λ\lambda_y \mid \lambda です。

3. TT が全単射で μ≥1\mu \ge 1 だとすると、T(sμ−1)=sμ=sμ+λ=T(sμ+λ−1)T(s_{\mu-1}) = s_\mu = s_{\mu+\lambda} = T(s_{\mu+\lambda-1}) と単射性から sμ−1=sμ+λ−1s_{\mu-1} = s_{\mu+\lambda-1} となり、μ\mu の最小性に反します。よって μ=0\mu = 0 で、出力の列もすべての k≥0k \ge 0 で yk+λ=yky_{k+\lambda} = y_k を満たします。

この命題は、生成器の設計の出発点です。状態が bb ビットなら周期は 2b2^b 以下なので、2642^{64} 個を超える乱数を使う計算に 64 ビットの状態の生成器は使えません。また、遷移を全単射にしておけば、前周期の間だけ現れて二度と現れない状態がなくなり、すべての状態がいずれかの閉じた軌道(サイクル)に属します。

定義 3.1(線形合同法・乗算型合同法)↗

整数 m≥2m \ge 2(法)、aa(乗数)、cc(増分)に対し、S=O={0,1,…,m−1}S = O = \{0, 1, \ldots, m-1\}、

T(x)=(ax+c) mod m,g(x)=xT(x) = (ax + c) \bmod m, \qquad g(x) = x

で定まる生成器を線形合同法という。c≡0(modm)c \equiv 0 \pmod m のものを乗算型合同法という。ある種について状態の列の周期が mm に等しいとき、全周期をもつという。

列 xk+1=T(xk)x_{k+1} = T(x_k) は aa と cc の mm を法とする類だけで決まるので、以下では a≥1a \ge 1、c≥0c \ge 0 と取ります(必要なら mm の倍数を足します)。全周期をもつなら、命題 2.3 の 1 から μ=0\mu = 0 で、x0,…,xm−1x_0, \ldots, x_{m-1} は {0,…,m−1}\{0, \ldots, m-1\} のすべてを 1 回ずつ取ります。したがって TT は全射、有限集合の上なので全単射であり、どの種から出発しても同じ長さ mm のサイクルを回ります。全周期は種の取り方によらない性質です。

整数 a≥1a \ge 1 と k≥0k \ge 0 に対して、等比和を

Sk(a)=1+a+a2+⋯+ak−1(k≥1),S0(a)=0S_k(a) = 1 + a + a^2 + \cdots + a^{k-1} \quad (k \ge 1), \qquad S_0(a) = 0

と書きます。(a−1)Sk(a)=ak−1(a - 1)S_k(a) = a^k - 1 です。

補題 3.2(線形合同法の閉じた形)✓

整数の列を X0=x0X_0 = x_0、Xk+1=aXk+cX_{k+1} = aX_k + c で定めると(余りを取らない)、すべての k≥0k \ge 0 で

Xk=akx0+c Sk(a),Xk−x0=Sk(a)((a−1)x0+c)X_k = a^kx_0 + c\,S_k(a), \qquad X_k - x_0 = S_k(a)\bigl((a-1)x_0 + c\bigr)

が成り立つ。線形合同法の状態は xk≡Xk(modm)x_k \equiv X_k \pmod m を満たす。

証明(補題 3.2)

kk についての帰納法で示します。k=0k = 0 では X0=x0=a0x0+c⋅0X_0 = x_0 = a^0x_0 + c\cdot 0 です。kk で成り立つとすると、

Xk+1=a(akx0+c Sk(a))+c=ak+1x0+c(aSk(a)+1)=ak+1x0+c Sk+1(a)X_{k+1} = a\bigl(a^kx_0 + c\,S_k(a)\bigr) + c = a^{k+1}x_0 + c\bigl(aS_k(a) + 1\bigr) = a^{k+1}x_0 + c\,S_{k+1}(a)

です。最後に aSk(a)+1=1+a+⋯+ak=Sk+1(a)aS_k(a) + 1 = 1 + a + \cdots + a^k = S_{k+1}(a) を使いました。第 2 の式は ak−1=(a−1)Sk(a)a^k - 1 = (a-1)S_k(a) から

Xk−x0=(ak−1)x0+c Sk(a)=(a−1)Sk(a)x0+c Sk(a)X_k - x_0 = (a^k - 1)x_0 + c\,S_k(a) = (a-1)S_k(a)x_0 + c\,S_k(a)

となって従います。xk≡Xkx_k \equiv X_k は、合同式の和と積(命題 3.3[合同式とフェルマーの小定理])を使った帰納法です。xk+1≡axk+c≡aXk+c=Xk+1(modm)x_{k+1} \equiv ax_k + c \equiv aX_k + c = X_{k+1} \pmod m。

「a−1a - 1 で割る」形 c(ak−1)/(a−1)c(a^k-1)/(a-1) で書かれることが多い式ですが、a−1a - 1 は mm と互いに素とは限らないので、合同式の中で割り算はできません。整数 Sk(a)S_k(a) のまま扱うのが安全です。周期の問題は「Sk(a)S_k(a) がいつ mm で割り切れるか」に帰着し、それに答えるのが次の補題です。素数 pp についての付値 vpv_p(定義 5.1[整除と素因数分解])を使います。

次の補題のねらいは、「Sk(a)S_k(a) が mm で割り切れる」という条件を、素数 pp ごとの「何回割れるか」に分けて調べられるようにすることです。vp(n)v_p(n) は nn を素数 pp で割れる回数で、たとえば v2(12)=2v_2(12) = 2、v3(12)=1v_3(12) = 1 です。補題は、条件のもとで Sk(a)S_k(a) の割れる回数が kk の割れる回数とちょうど等しいと言っています。証明は、kk が pp の倍数でない場合、k=pk = p の場合、一般の kk の場合の順に進みます。

補題 3.3(等比和の p 進付値)✓

pp を素数、a≥1a \ge 1 を整数とし、a≡1(modp)a \equiv 1 \pmod p とする。p=2p = 2 のときはさらに a≡1(mod4)a \equiv 1 \pmod 4 とする。このとき、すべての整数 k≥1k \ge 1 について

vp(Sk(a))=vp(k)v_p\bigl(S_k(a)\bigr) = v_p(k)

が成り立つ。

証明(補題 3.3)

3 段階に分けます。仮定を満たす aa の全体を Ap\mathcal{A}_p と書きます。a∈Apa \in \mathcal{A}_p なら、合同式の積(命題 3.3[合同式とフェルマーの小定理])から任意の j≥1j \ge 1 で aj∈Apa^j \in \mathcal{A}_p です。

(i) p∤kp \nmid k のとき。 ai≡1(modp)a^i \equiv 1 \pmod p なので Sk(a)≡k≢0(modp)S_k(a) \equiv k \not\equiv 0 \pmod p。よって vp(Sk(a))=0=vp(k)v_p(S_k(a)) = 0 = v_p(k) です。

(ii) k=pk = p のとき。 p=2p = 2 なら S2(a)=1+a≡2(mod4)S_2(a) = 1 + a \equiv 2 \pmod 4 なので、v2(S2(a))=1v_2(S_2(a)) = 1 です。pp が奇素数のとき、a=1+pba = 1 + pb(b≥0b \ge 0 は整数)と書くと、二項定理から ai=(1+pb)i≡1+ipb(modp2)a^i = (1 + pb)^i \equiv 1 + ipb \pmod{p^2} です(p2p^2 以上の冪を含む項を落としました)。したがって

Sp(a)=∑i=0p−1ai≡p+pb∑i=0p−1i=p+pb⋅p(p−1)2(modp2).S_p(a) = \sum_{i=0}^{p-1} a^i \equiv p + pb\sum_{i=0}^{p-1} i = p + pb\cdot\frac{p(p-1)}{2} \pmod{p^2}.

pp は奇数なので (p−1)/2(p-1)/2 は整数で、第 2 項は p2p^2 の倍数です。よって Sp(a)≡p(modp2)S_p(a) \equiv p \pmod{p^2} となり、vp(Sp(a))=1v_p(S_p(a)) = 1 です。

(iii) 一般の kk。 正の整数 j,kj, k について

Sjk(a)=∑l=0j−1∑i=0k−1akl+i=(∑l=0j−1(ak)l)(∑i=0k−1ai)=Sj(ak) Sk(a)S_{jk}(a) = \sum_{l=0}^{j-1}\sum_{i=0}^{k-1} a^{kl+i} = \Bigl(\sum_{l=0}^{j-1} (a^k)^l\Bigr)\Bigl(\sum_{i=0}^{k-1} a^i\Bigr) = S_j(a^k)\,S_k(a)

です。まず e≥0e \ge 0 についての帰納法で vp(Spe(a))=ev_p(S_{p^e}(a)) = e をすべての a∈Apa \in \mathcal{A}_p について示します。e=0e = 0 では S1(a)=1S_1(a) = 1 です。e≥1e \ge 1 では Spe(a)=Sp(ape−1) Spe−1(a)S_{p^e}(a) = S_p(a^{p^{e-1}})\,S_{p^{e-1}}(a) で、ape−1∈Apa^{p^{e-1}} \in \mathcal{A}_p なので (ii) から第 1 因子の付値は 11、帰納法の仮定から第 2 因子の付値は e−1e - 1 です。付値は積について加法的なので(命題 5.3[整除と素因数分解] の 1)、vp(Spe(a))=ev_p(S_{p^e}(a)) = e です。

一般の k=pek′k = p^ek'(p∤k′p \nmid k')では Sk(a)=Sk′(ape) Spe(a)S_k(a) = S_{k'}(a^{p^e})\,S_{p^e}(a) で、(i) から第 1 因子の付値は 00、第 2 因子の付値は ee です。よって vp(Sk(a))=e=vp(k)v_p(S_k(a)) = e = v_p(k) です。

p=2p = 2 で a≡3(mod4)a \equiv 3 \pmod 4 のときは、S2(a)=1+aS_2(a) = 1 + a が 44 で割り切れるので補題は成り立ちません。これが、定理の第 3 の条件が現れる理由です。

定理 3.4(Hull–Dobell の定理)✓

m≥2m \ge 2、a≥1a \ge 1、c≥0c \ge 0 を整数とする。線形合同法 xk+1=(axk+c) mod mx_{k+1} = (ax_k + c) \bmod m が全周期 mm をもつための必要十分条件は、次の 3 つがすべて成り立つことである。

  1. gcd⁡(c,m)=1\gcd(c, m) = 1。
  2. mm を割り切るすべての素数 pp について a≡1(modp)a \equiv 1 \pmod p。
  3. 4∣m4 \mid m ならば a≡1(mod4)a \equiv 1 \pmod 4。
証明(定理 3.4)

十分性。 条件 1〜3 を仮定し、任意の x0x_0 を取ります。w=(a−1)x0+cw = (a-1)x_0 + c と置くと、補題 3.2 から xk−x0≡Sk(a) w(modm)x_k - x_0 \equiv S_k(a)\,w \pmod m です。

まず gcd⁡(w,m)=1\gcd(w, m) = 1 を示します。mm の素因数 pp について、条件 2 から a−1≡0a - 1 \equiv 0 なので w≡c(modp)w \equiv c \pmod p です。条件 1 から p∤cp \nmid c なので p∤wp \nmid w です。mm のどの素因数も ww を割らないので、gcd⁡(w,m)=1\gcd(w, m) = 1 です。したがって、互いに素な因子を落とす補題(補題 2.2[整除と素因数分解])から

xk≡x0(modm)  ⟺  m∣Sk(a) w  ⟺  m∣Sk(a)x_k \equiv x_0 \pmod m \iff m \mid S_k(a)\,w \iff m \mid S_k(a)

です。

次に、k≥1k \ge 1 について m∣Sk(a)  ⟺  m∣km \mid S_k(a) \iff m \mid k を示します。整除は素数ごとの付値の比較と同値です(命題 5.3[整除と素因数分解] の 2)。これは、mm を素数冪の積に分け、各素数冪を法として別々に調べてよいということで、中国剰余定理(定理 4.8[合同式とフェルマーの小定理])の整除についての言い換えです。mm の素因数 pp ごとに、vp(m)≤vp(Sk(a))  ⟺  vp(m)≤vp(k)v_p(m) \le v_p(S_k(a)) \iff v_p(m) \le v_p(k) を確かめます。

  • pp が奇素数のとき、および p=2p = 2 で 4∣m4 \mid m のとき: 条件 2・3 から 補題 3.3 が使えて vp(Sk(a))=vp(k)v_p(S_k(a)) = v_p(k) なので、両辺は同じ条件です。
  • p=2p = 2 で v2(m)=1v_2(m) = 1 のとき: 条件 2 から aa は奇数なので Sk(a)≡k(mod2)S_k(a) \equiv k \pmod 2 です。よって v2(Sk(a))≥1  ⟺  v2(k)≥1v_2(S_k(a)) \ge 1 \iff v_2(k) \ge 1 です。

以上から xk≡x0(modm)  ⟺  m∣kx_k \equiv x_0 \pmod m \iff m \mid k が任意の種 x0x_0 について成り立ちます。0≤i<j≤m−10 \le i < j \le m - 1 で xi=xjx_i = x_j だとすると、xix_i を種とみて xi+(j−i)=xix_{i + (j-i)} = x_i から m∣j−im \mid j - i となりますが、1≤j−i≤m−11 \le j - i \le m - 1 なので矛盾です。ゆえに x0,…,xm−1x_0, \ldots, x_{m-1} は互いに異なり、xm=x0x_m = x_0 なので、周期はちょうど mm です。

必要性。 ある種で周期が mm だとします。定義の後で述べたとおり、TT は全単射で、列 (xk)(x_k) は純周期的に {0,…,m−1}\{0, \ldots, m-1\} のすべての値を取り続けます。

条件 1. xk0=0x_{k_0} = 0 となる k0k_0 を取ると、補題 3.2 を種 00 に使って xk0+j≡c Sj(a)(modm)x_{k_0+j} \equiv c\,S_j(a) \pmod m です。g=gcd⁡(c,m)g = \gcd(c, m) は右辺と mm を割るので、j≥0j \ge 0 で現れる値はすべて gg の倍数です。この列は値 11 も取るので g∣1g \mid 1、すなわち g=1g = 1 です。

条件 2. pp を mm の素因数とし、yk=xk mod py_k = x_k \bmod p と置きます。p∣mp \mid m なので yk+1≡ayk+c(modp)y_{k+1} \equiv ay_k + c \pmod p です。a≢1(modp)a \not\equiv 1 \pmod p だと仮定します。Z/pZ\mathbb{Z}/p\mathbb{Z} は体なので(系 4.5[合同式とフェルマーの小定理])、(a−1)u≡1(modp)(a - 1)u \equiv 1 \pmod p となる整数 uu があります。ξ=−cu\xi = -cu と置くと aξ+c=ξ+(a−1)ξ+c≡ξ−c+c=ξ(modp)a\xi + c = \xi + (a-1)\xi + c \equiv \xi - c + c = \xi \pmod p で、ξ\xi は法 pp での不動点です。(xk)(x_k) はすべての値を取るので yk1≡ξy_{k_1} \equiv \xi となる k1k_1 があり、帰納的にすべての k≥k1k \ge k_1 で yk≡ξy_k \equiv \xi です。一方 (xk)k≥k1(x_k)_{k \ge k_1} は 00 と 11 の両方を取るので、(yk)k≥k1(y_k)_{k \ge k_1} は pp を法として異なる 2 つの値を取ります。これは矛盾です。

条件 3. 4∣m4 \mid m とし、zk=xk mod 4z_k = x_k \bmod 4 と置きます。条件 2(p=2p = 2)から aa は奇数です。a≡3(mod4)a \equiv 3 \pmod 4 だと仮定すると、a2≡1a^2 \equiv 1、a+1≡0(mod4)a + 1 \equiv 0 \pmod 4 なので

zk+2≡a2zk+c(a+1)≡zk(mod4)z_{k+2} \equiv a^2z_k + c(a + 1) \equiv z_k \pmod 4

です。すると (zk)(z_k) が取る値は z0,z1z_0, z_1 の高々 2 つですが、(xk)(x_k) はすべての値を取るので (zk)(z_k) は 44 つの値を取るはずです。矛盾なので a≡1(mod4)a \equiv 1 \pmod 4 です。

定理が述べているのは周期だけです。a=1a = 1、c=1c = 1 は 3 条件を満たし全周期をもちますが、出力は 0,1,2,…0, 1, 2, \ldots で、乱数としては使えません。全周期は必要条件の 1 つにすぎず、組の並び方(§4)を別に調べる必要があります。

例 3.5(法 16 と法 31 の全周期)

m=16m = 16 の素因数は 22 だけで 4∣164 \mid 16 なので、条件は「cc が奇数、a≡1(mod4)a \equiv 1 \pmod 4」です。a∈{1,5,9,13}a \in \{1, 5, 9, 13\} と c∈{1,3,…,15}c \in \{1, 3, \ldots, 15\} の 4×8=324 \times 8 = 32 組が全周期をもちます。a=5a = 5、c=3c = 3、x0=0x_0 = 0 では

0,3,2,13,4,7,6,1,8,11,10,5,12,15,14,9,0,…0, 3, 2, 13, 4, 7, 6, 1, 8, 11, 10, 5, 12, 15, 14, 9, 0, \ldots

と 16 個の値がすべて現れます。a=3a = 3(a≡3(mod4)a \equiv 3 \pmod 4)では条件 3 が破れ、c=3c = 3 のとき 0,3,12,7,8,11,4,15,00, 3, 12, 7, 8, 11, 4, 15, 0 と周期は 88 です。

m=31m = 31(素数)では条件 2 が a≡1(mod31)a \equiv 1 \pmod{31} を要求するので、全周期をもつのは a=1a = 1、c≠0c \ne 0 の 30 組だけで、どれも等差数列です。素数の法では、全周期の線形合同法は役に立たず、次の乗算型合同法(周期 p−1p - 1)を使います。

c=0c = 0 のとき、定理 3.4 の条件 1 は成り立たず、周期は mm より小さくなります(00 が不動点だからです)。このときの最大の周期を、よく使われる 2 つの法について求めます。整数 aa の (Z/mZ)×(\mathbb{Z}/m\mathbb{Z})^\times(定義 4.3[合同式とフェルマーの小定理])での位数(定義 6.1[群論入門])を ordm(a)\mathrm{ord}_m(a) と書きます。

次の命題は、c=0c = 0 の場合に周期がどこまで長くなれるかを答えます。素数の法では p−1p - 1 まで伸ばせ、法が 2e2^e では 4 分の 1 までしか伸ばせない、というのが結論です。2 番目の主張の証明は、aa を 4 で割った余りが 1 の場合と 3 の場合に分け、3 の場合は aa を 2 乗して 1 の場合に戻します。

命題 3.6(乗算型合同法の周期)✓

乗算型合同法 xk+1=axk mod mx_{k+1} = ax_k \bmod m について次が成り立つ。

  1. gcd⁡(a,m)=gcd⁡(x0,m)=1\gcd(a, m) = \gcd(x_0, m) = 1 ならば、列 (xk)(x_k) は純周期的で周期は ordm(a)\mathrm{ord}_m(a) である。
  2. m=2em = 2^e(e≥3e \ge 3)で aa が奇数のとき、ord2e(a)≤2e−2\mathrm{ord}_{2^e}(a) \le 2^{e-2} であり、a≡3a \equiv 3 または 5(mod8)5 \pmod 8 ならば等号が成り立つ。e≥4e \ge 4 のときは、等号が成り立つのはこの場合に限る。
  3. m=pm = p が素数で p∤ap \nmid a のとき、ordp(a)\mathrm{ord}_p(a) は p−1p - 1 の約数であり、p−1p - 1 に等しいのは aa が pp を法とする原始根のとき、かつそのときに限る。原始根は必ず存在する。
証明(命題 3.6)

1. xk≡akx0(modm)x_k \equiv a^kx_0 \pmod m です(補題 3.2 で c=0c = 0)。gcd⁡(a,m)=1\gcd(a, m) = 1 なので x↦axx \mapsto ax は Z/mZ\mathbb{Z}/m\mathbb{Z} の全単射で(命題 4.4[合同式とフェルマーの小定理] により aa は単元)、命題 2.3 の 3 から列は純周期的です。gcd⁡(x0,m)=1\gcd(x_0, m) = 1 なので消去法則(命題 3.6[合同式とフェルマーの小定理])が使えて、akx0≡x0  ⟺  ak≡1(modm)a^kx_0 \equiv x_0 \iff a^k \equiv 1 \pmod m です。これを満たす最小の k≥1k \ge 1 が ordm(a)\mathrm{ord}_m(a) です。

2. 位数は aa の 2e2^e を法とする類で決まるので、1≤a<2e1 \le a < 2^e とします。a=1a = 1 の位数は 11 なので a≥3a \ge 3 とし、aa を 44 で割った余りで場合を分けます。

a≡1(mod4)a \equiv 1 \pmod 4 のとき。 補題 3.3(p=2p = 2)と ak−1=(a−1)Sk(a)a^k - 1 = (a-1)S_k(a)、付値の加法性(命題 5.3[整除と素因数分解] の 1)から

v2(ak−1)=v2(a−1)+v2(k)(k≥1)v_2(a^k - 1) = v_2(a - 1) + v_2(k) \qquad (k \ge 1)

です。t=v2(a−1)t = v_2(a-1) と置くと、0<a−1<2e0 < a - 1 < 2^e から 2≤t<e2 \le t < e です。ak≡1(mod2e)a^k \equiv 1 \pmod{2^e} は t+v2(k)≥et + v_2(k) \ge e と同値で、これを満たす最小の k≥1k \ge 1 は 2e−t2^{e-t} です。すなわち

ord2e(a)=2e−v2(a−1)(a≡1(mod4), 1<a<2e).\mathrm{ord}_{2^e}(a) = 2^{e - v_2(a-1)} \qquad (a \equiv 1 \pmod 4,\ 1 < a < 2^e).

a≡5(mod8)a \equiv 5 \pmod 8 なら t=2t = 2 で位数は 2e−22^{e-2}、a≡1(mod8)a \equiv 1 \pmod 8 なら t≥3t \ge 3 で位数は 2e−32^{e-3} 以下です。

a≡3(mod4)a \equiv 3 \pmod 4 のとき。 kk が奇数なら ak≡3(mod4)a^k \equiv 3 \pmod 4 なので ak≢1(mod2e)a^k \not\equiv 1 \pmod{2^e} です。よって ak≡1a^k \equiv 1 となる kk は偶数で、k=2jk = 2j と書くと条件は (a2)j≡1(a^2)^j \equiv 1 です。したがって ord2e(a)=2 ord2e(a2)\mathrm{ord}_{2^e}(a) = 2\,\mathrm{ord}_{2^e}(a^2) です。b=a2b = a^2 は b≡1(mod4)b \equiv 1 \pmod 4、b>1b > 1 を満たします。t′=v2(b−1)=v2(a−1)+v2(a+1)=1+v2(a+1)t' = v_2(b - 1) = v_2(a-1) + v_2(a+1) = 1 + v_2(a+1) と置きます。bb を 2e2^e で割った余りを b′b' とすると、t′≥et' \ge e なら b′=1b' = 1 で bb の位数は 11、t′<et' < e なら v2(b′−1)=t′v_2(b' - 1) = t' なので前の場合から bb の位数は 2e−t′2^{e-t'} です。まとめると

ord2e(a)=2⋅2max⁡(e−t′, 0),t′=1+v2(a+1).\mathrm{ord}_{2^e}(a) = 2\cdot 2^{\max(e - t',\,0)}, \qquad t' = 1 + v_2(a+1).

a≡3(mod8)a \equiv 3 \pmod 8 なら v2(a+1)=2v_2(a+1) = 2、t′=3≤et' = 3 \le e で、位数は 2⋅2e−3=2e−22\cdot 2^{e-3} = 2^{e-2} です。a≡7(mod8)a \equiv 7 \pmod 8 なら v2(a+1)≥3v_2(a+1) \ge 3、t′≥4t' \ge 4 で、位数は 2⋅2max⁡(e−4,0)2\cdot 2^{\max(e-4, 0)} 以下です。これは e≥4e \ge 4 なら 2e−3<2e−22^{e-3} < 2^{e-2}、e=3e = 3 なら 2=2e−22 = 2^{e-2} です。

以上で、すべての場合に位数は 2e−22^{e-2} 以下、a≡3,5(mod8)a \equiv 3, 5 \pmod 8 で等号、e≥4e \ge 4 では a≡1,7(mod8)a \equiv 1, 7 \pmod 8 のとき 2e−32^{e-3} 以下であることが分かりました。

3. フェルマーの小定理(定理 5.1[合同式とフェルマーの小定理])から ap−1≡1(modp)a^{p-1} \equiv 1 \pmod p なので、位数による冪の判定(定理 6.3[群論入門])から ordp(a)∣p−1\mathrm{ord}_p(a) \mid p - 1 です。φ(p)=p−1\varphi(p) = p - 1 なので、ordp(a)=p−1\mathrm{ord}_p(a) = p - 1 は aa が原始根であることの定義そのものです(定義 2.4[原始根と平方剰余の相互法則])。原始根の存在は 定理 2.5[原始根と平方剰余の相互法則] です。

法 2e2^e の乗算型合同法は、種を奇数に限っても状態の 4 分の 1 しか回りません。法が素数 pp なら 00 以外の全状態を回れますが、pp で割った余りを取る演算は 2e2^e で割るより手間がかかります。p=231−1p = 2^{31} - 1(Mersenne 素数)と a=16807=75a = 16807 = 7^5 の組は「最小標準」の生成器として長く使われました。

命題 3.7(法 2e2^e の線形合同法の下位ビット)✓

m=2em = 2^e の線形合同法の状態 xkx_k の下位 rr ビット xk mod 2rx_k \bmod 2^r(1≤r≤e1 \le r \le e)の列は、最終的に周期的で、周期は 2r2^r 以下である。全周期をもつ場合は、純周期的で周期がちょうど 2r2^r である。特に最下位ビットは 0,1,0,1,…0, 1, 0, 1, \ldots と交互に現れる。

証明(命題 3.7)

zk=xk mod 2rz_k = x_k \bmod 2^r と置きます。2r∣2e2^r \mid 2^e なので、xk+1≡axk+c(mod2e)x_{k+1} \equiv ax_k + c \pmod{2^e} から zk+1≡azk+c(mod2r)z_{k+1} \equiv az_k + c \pmod{2^r} です。つまり (zk)(z_k) は法 2r2^r、同じ a,ca, c の線形合同法の状態の列です。状態数は 2r2^r なので、命題 2.3 の 1 から最終的に周期的で、周期は 2r2^r 以下です。

法 2e2^e で全周期をもつとき、定理 3.4 から cc は奇数、aa は奇数で、e≥2e \ge 2 なら a≡1(mod4)a \equiv 1 \pmod 4 です。これらは法 2r2^r についての同じ定理の 3 条件を含むので(r=1r = 1 のときは条件 3 は不要)、(zk)(z_k) は法 2r2^r で全周期 2r2^r をもち、純周期的です。r=1r = 1 では周期 22 で、00 と 11 が交互に現れます。

例 3.5 の a=5a = 5、c=3c = 3、m=16m = 16 の列で確かめると、下位 2 ビットは 0,3,2,1,0,3,2,1,…0, 3, 2, 1, 0, 3, 2, 1, \ldots と周期 44 です。64 ビットの状態をもつ線形合同法でも、最下位ビットは交互に並び、下位 8 ビットは 256 個ごとに繰り返します。「乱数を 2 で割った余りで表裏を決める」という使い方は、この種の生成器では正しく働きません。対策は 2 つあります。上位ビットだけを出力に使うこと、そして §6 で述べるように出力関数 gg で状態をかき混ぜることです。

次のコードは、小さな法について全周期をもつ (a,c)(a, c) を全数で数え、定理の判定と照合します。

# Python 3.9.6(標準ライブラリのみ)
from math import gcd
def period(a, c, m, x0=0):
seen, x, k = {}, x0, 0
while x not in seen:
seen[x] = k
x = (a * x + c) % m
k += 1
return k - seen[x] # 周期(前周期を除く)
def prime_factors(m):
ps, p = [], 2
while p * p <= m:
if m % p == 0:
ps.append(p)
while m % p == 0:
m //= p
p += 1
return ps + ([m] if m > 1 else [])
def hull_dobell(a, c, m):
return (gcd(c, m) == 1
and all((a - 1) % p == 0 for p in prime_factors(m))
and (m % 4 != 0 or (a - 1) % 4 == 0))
for m in (16, 31, 36, 100, 360):
full = agree = 0
for a in range(m):
for c in range(m):
is_full = (period(a, c, m) == m)
full += is_full
agree += (is_full == hull_dobell(a, c, m))
print(f"m={m:4d} 全周期の (a,c) = {full:5d} 組 / {m*m:6d} 判定と一致 = {agree:6d}")
m= 16 全周期の (a,c) = 32 組 / 256 判定と一致 = 256
m= 31 全周期の (a,c) = 30 組 / 961 判定と一致 = 961
m= 36 全周期の (a,c) = 36 組 / 1296 判定と一致 = 1296
m= 100 全周期の (a,c) = 200 組 / 10000 判定と一致 = 10000
m= 360 全周期の (a,c) = 576 組 / 129600 判定と一致 = 129600

5 つの法のすべての (a,c)(a, c) で、実際の周期による判定と定理の 3 条件による判定が一致しています。m=16m = 16 の 32 組、m=31m = 31 の 30 組は 例 3.5 の数え上げと同じです。

周期が長くても、連続する出力の間に強い規則があれば乱数としては使えません。線形合同法では、その規則が格子として完全に記述できます。

定義 4.1(k 次元の均等分布)↗

出力が vv ビットの整数(O={0,…,2v−1}O = \{0, \ldots, 2^v - 1\})で、出力の列が純周期的で周期 PP の生成器を考える。1 周期にわたる連続する kk 個の組 (yi,yi+1,…,yi+k−1)(y_i, y_{i+1}, \ldots, y_{i+k-1})(i=0,…,P−1i = 0, \ldots, P-1、添字は周期的に延長)の中に、OkO^k のすべての元が同じ回数ずつ現れるとき、この生成器は(vv ビット精度で)kk 次元均等分布であるという。全零の組だけ 1 回少ないことを許す流儀もある。

全周期の線形合同法は、O={0,…,m−1}O = \{0, \ldots, m-1\} として 1 次元では均等分布です(各値がちょうど 1 回現れます)。しかし 2 次元では、m2m^2 通りの組のうち mm 通りしか現れないので、均等分布ではありません。現れる mm 個の組がどう並ぶかを述べるのが次の定理です。Rd\mathbb{R}^d の格子と余体積の定義は 定義 2.1[イデアル類群の有限性と Minkowski 限界] に従います。ベクトルの成分の添字は 00 から d−1d - 1 とします。

格子とは、いくつかのベクトルの整数倍の和で表される点の集まりで、平面なら方眼紙の交点を斜めにゆがめたような等間隔の点の並びです。次の定理は、出力の組が必ずそのような並びの上にあることを示します。並びが格子なら、点をすべて通る等間隔の平行線(3 次元なら平面)の族が取れます。

定理 4.2(線形合同法の格子構造)✓

線形合同法 xk+1=(axk+c) mod mx_{k+1} = (ax_k + c) \bmod m と d≥1d \ge 1 について、

uk=1m(xk,xk+1,…,xk+d−1)∈[0,1)d,g=1m(1,a,…,ad−1),v0=cm(S0(a),S1(a),…,Sd−1(a))\boldsymbol{u}_k = \frac{1}{m}(x_k, x_{k+1}, \ldots, x_{k+d-1}) \in [0,1)^d, \qquad \boldsymbol{g} = \frac{1}{m}(1, a, \ldots, a^{d-1}), \qquad \boldsymbol{v}_0 = \frac{c}{m}\bigl(S_0(a), S_1(a), \ldots, S_{d-1}(a)\bigr)

と置き、L=Zg+ZdL = \mathbb{Z}\boldsymbol{g} + \mathbb{Z}^d とする。

  1. LL は余体積 1/m1/m の格子で、すべての k≥0k \ge 0 について uk∈(v0+L)∩[0,1)d\boldsymbol{u}_k \in (\boldsymbol{v}_0 + L) \cap [0,1)^d である。
  2. 全周期をもつとき、{uk:0≤k<m}=(v0+L)∩[0,1)d\{\boldsymbol{u}_k : 0 \le k < m\} = (\boldsymbol{v}_0 + L) \cap [0,1)^d である。
証明(定理 4.2)

標準基底を e0,…,ed−1\boldsymbol{e}_0, \ldots, \boldsymbol{e}_{d-1} とします。

LL が格子であること。 mg=e0+∑i≥1aieim\boldsymbol{g} = \boldsymbol{e}_0 + \sum_{i \ge 1} a^i\boldsymbol{e}_i なので e0=mg−∑i≥1aiei\boldsymbol{e}_0 = m\boldsymbol{g} - \sum_{i\ge1} a^i\boldsymbol{e}_i です。よって LL は g,e1,…,ed−1\boldsymbol{g}, \boldsymbol{e}_1, \ldots, \boldsymbol{e}_{d-1} の整数係数一次結合の全体に等しく、これらを列とする行列は下三角で対角成分が 1/m,1,…,11/m, 1, \ldots, 1 なので、行列式は 1/m≠01/m \ne 0 です。したがって一次独立で、LL は余体積 1/m1/m の格子です(補題 2.2[イデアル類群の有限性と Minkowski 限界] の 3)。

1. x=xkx = x_k と置きます。補題 3.2 を種 xx に使うと、j=0,…,d−1j = 0, \ldots, d-1 について xk+j≡ajx+cSj(a)(modm)x_{k+j} \equiv a^jx + cS_j(a) \pmod m なので、整数 njn_j があって xk+j=ajx+cSj(a)+mnjx_{k+j} = a^jx + cS_j(a) + mn_j です。mm で割って並べると

uk=xg+v0+(n0,…,nd−1)∈v0+L\boldsymbol{u}_k = x\boldsymbol{g} + \boldsymbol{v}_0 + (n_0, \ldots, n_{d-1}) \in \boldsymbol{v}_0 + L

です。各成分は xk+j/m∈[0,1)x_{k+j}/m \in [0, 1) です。

2. 1 から「⊆\subseteq」は済んでいます。逆を示します。w∈(v0+L)∩[0,1)d\boldsymbol{w} \in (\boldsymbol{v}_0 + L) \cap [0,1)^d を取り、w=v0+xg+n\boldsymbol{w} = \boldsymbol{v}_0 + x\boldsymbol{g} + \boldsymbol{n}(x∈Zx \in \mathbb{Z}、n∈Zd\boldsymbol{n} \in \mathbb{Z}^d)と書きます。x=x′+mqx = x' + mq(0≤x′<m0 \le x' < m)と割ると、mqg=q(1,a,…,ad−1)∈Zdmq\boldsymbol{g} = q(1, a, \ldots, a^{d-1}) \in \mathbb{Z}^d なので、n\boldsymbol{n} を取り替えて 0≤x<m0 \le x < m としてよいです。全周期なので xk=xx_k = x となる kk(0≤k<m0 \le k < m)があります。1 の計算から uk−w∈Zd\boldsymbol{u}_k - \boldsymbol{w} \in \mathbb{Z}^d で、uk\boldsymbol{u}_k も w\boldsymbol{w} も [0,1)d[0,1)^d に属するので、差の各成分は絶対値が 11 未満の整数、すなわち 00 です。よって w=uk\boldsymbol{w} = \boldsymbol{u}_k です。

格子の点は、平行で等間隔な超平面の族の上に並びます。その超平面の枚数が少ないと、単位立方体の中に点のない厚い層ができます。次の定理は、どんなに乗数をうまく選んでも、枚数は m1/dm^{1/d} の程度でしかないことを示します。

定理 4.3(Marsaglia の定理)✓

線形合同法 xk+1=(axk+c) mod mx_{k+1} = (ax_k + c) \bmod m と d≥1d \ge 1 について、次を満たす零でない整数ベクトル c=(c0,…,cd−1)\boldsymbol{c} = (c_0, \ldots, c_{d-1}) が存在する。

∑i=0d−1ciai≡0(modm),ℓ:=∑i=0d−1∣ci∣≤(d! m)1/d.\sum_{i=0}^{d-1} c_ia^i \equiv 0 \pmod m, \qquad \ell := \sum_{i=0}^{d-1} |c_i| \le (d!\,m)^{1/d}.

このような c\boldsymbol{c} について、実数 θ\theta があって、すべての kk で ⟨c,uk⟩∈θ+Z\langle \boldsymbol{c}, \boldsymbol{u}_k\rangle \in \theta + \mathbb{Z} となる。したがって点 uk\boldsymbol{u}_k はすべて、平行な超平面 {u:⟨c,u⟩=θ+j}\{\boldsymbol{u} : \langle\boldsymbol{c}, \boldsymbol{u}\rangle = \theta + j\}(j∈Zj \in \mathbb{Z})のうち高々 ℓ\ell 枚の上に載る。特に、枚数は (d! m)1/d(d!\,m)^{1/d} 以下である。

証明(定理 4.3)

c\boldsymbol{c} の存在。 Λ={c∈Zd:∑iciai≡0(modm)}\Lambda = \{\boldsymbol{c} \in \mathbb{Z}^d : \sum_i c_ia^i \equiv 0 \pmod m\} と置きます。c∈Λ\boldsymbol{c} \in \Lambda は「c0=−∑i≥1ciai+mqc_0 = -\sum_{i \ge 1} c_ia^i + mq となる整数 qq がある」ことと同値なので、

w0=me0,wi=−aie0+ei(1≤i≤d−1)\boldsymbol{w}_0 = m\boldsymbol{e}_0, \qquad \boldsymbol{w}_i = -a^i\boldsymbol{e}_0 + \boldsymbol{e}_i \quad (1 \le i \le d-1)

として Λ={qw0+∑i≥1ciwi}\Lambda = \{q\boldsymbol{w}_0 + \sum_{i\ge1} c_i\boldsymbol{w}_i\} です。これらを列とする行列は上三角で対角成分が m,1,…,1m, 1, \ldots, 1 なので、Λ\Lambda は余体積 mm の格子です(補題 2.2[イデアル類群の有限性と Minkowski 限界] の 3)。

r>0r > 0 に対して Xr={t∈Rd:∑i∣ti∣≤r}X_r = \{\boldsymbol{t} \in \mathbb{R}^d : \sum_i |t_i| \le r\} と置きます。これはコンパクトな凸集合で Xr=−XrX_r = -X_r です(凸性は三角不等式から)。体積を求めます。XrX_r は座標の符号による 2d2^d 個の合同な部分に分かれ、その 1 つは単体 Δd(r)={ti≥0, ∑ti≤r}\Delta_d(r) = \{t_i \ge 0,\ \sum t_i \le r\} です。vol(Δd(r))=rd/d!\mathrm{vol}(\Delta_d(r)) = r^d/d! を dd についての帰納法で示します。d=1d = 1 では長さ rr です。d≥2d \ge 2 では、最後の座標 td−1=tt_{d-1} = t を固定した切り口が Δd−1(r−t)\Delta_{d-1}(r - t) なので、Fubini の定理(定理 3.4[直積測度と Fubini–Tonelli の定理])から

vol(Δd(r))=∫0r(r−t)d−1(d−1)! dt=rdd!\mathrm{vol}(\Delta_d(r)) = \int_0^r \frac{(r-t)^{d-1}}{(d-1)!}\,dt = \frac{r^d}{d!}

です。よって vol(Xr)=(2r)d/d!\mathrm{vol}(X_r) = (2r)^d/d! です。r=(d! m)1/dr = (d!\,m)^{1/d} と取ると vol(Xr)=2dm=2d covol(Λ)\mathrm{vol}(X_r) = 2^dm = 2^d\,\mathrm{covol}(\Lambda) なので、Minkowski の格子点定理のコンパクトな場合(定理 2.3[イデアル類群の有限性と Minkowski 限界])から、XrX_r は Λ\Lambda の零でない点 c\boldsymbol{c} を含みます。これが求めるベクトルです。

超平面に載ること。 定理 4.2 の 1 の証明から uk=xkg+v0+n\boldsymbol{u}_k = x_k\boldsymbol{g} + \boldsymbol{v}_0 + \boldsymbol{n}(n∈Zd\boldsymbol{n} \in \mathbb{Z}^d)です。⟨c,g⟩=1m∑iciai∈Z\langle\boldsymbol{c}, \boldsymbol{g}\rangle = \frac1m\sum_i c_ia^i \in \mathbb{Z}、⟨c,n⟩∈Z\langle\boldsymbol{c}, \boldsymbol{n}\rangle \in \mathbb{Z} なので、θ=⟨c,v0⟩\theta = \langle\boldsymbol{c}, \boldsymbol{v}_0\rangle と置けば ⟨c,uk⟩∈θ+Z\langle\boldsymbol{c}, \boldsymbol{u}_k\rangle \in \theta + \mathbb{Z} です。

枚数。 P=∑ci>0ciP = \sum_{c_i > 0} c_i、N=∑ci<0∣ci∣N = \sum_{c_i < 0} |c_i| と置くと P+N=ℓP + N = \ell です。u∈[0,1)d\boldsymbol{u} \in [0,1)^d について、ci>0c_i > 0 の項は 0≤ciui<ci0 \le c_iu_i < c_i、ci<0c_i < 0 の項は ci<ciui≤0c_i < c_iu_i \le 0 を満たすので、⟨c,u⟩\langle\boldsymbol{c}, \boldsymbol{u}\rangle は区間 II に属します。ここで II は、P,N>0P, N > 0 なら (−N,P)(-N, P)、N=0N = 0 なら [0,P)[0, P)、P=0P = 0 なら (−N,0](-N, 0] です。どの場合も II は長さ ℓ\ell の閉区間でない区間なので、II の 2 点の差は ℓ\ell より真に小さくなります。θ+Z\theta + \mathbb{Z} の点が II の中に ℓ+1\ell + 1 個あったとすると、最大と最小の差は ℓ\ell 以上となり矛盾します。よって II に入る θ+j\theta + j は高々 ℓ\ell 個で、点が載りうる超平面は高々 ℓ\ell 枚です。

c\boldsymbol{c} の存在に使った Minkowski の定理は、基本領域への折り返しに鳩の巣原理を使って証明されます。したがってこの定理は、「mm 個しかない剰余に対して候補のベクトルが多すぎる」という数え上げの帰結です。m=232m = 2^{32} のとき上界は d=3d = 3 で約 29532953 枚、d=10d = 10 では約 4141 枚です。高次元の組を使う計算に、法の小さい線形合同法を使えない理由がここにあります。

u = x_k / 64v = x_(k+1) / 64
m = 64、a = 37、c = 1 の線形合同法の連続する組 (x_k, x_{k+1})/64 の 64 点。すべての点が −3u + 7v = 7/64 + j(j = −2, …, 6)の 9 本の平行な直線に載る。関係式は −3 + 7·37 = 256 ≡ 0 (mod 64) から。

図の例では c=(−3,7)\boldsymbol{c} = (-3, 7)、ℓ=10≤(2⋅64)1/2≈11.3\ell = 10 \le (2\cdot64)^{1/2} \approx 11.3 で、定理の上界 10 本に対して実際に点が載るのは 9 本です。

例 4.4(RANDU の 3 つ組は 15 枚の平面に載る)

RANDU は m=231m = 2^{31}、a=65539=216+3a = 65539 = 2^{16} + 3、c=0c = 0 の乗算型合同法です。232≡0(mod231)2^{32} \equiv 0 \pmod{2^{31}} なので

a2=232+6⋅216+9≡6(a−3)+9=6a−9(mod231),a^2 = 2^{32} + 6\cdot2^{16} + 9 \equiv 6(a - 3) + 9 = 6a - 9 \pmod{2^{31}},

すなわち 9−6a+a2≡0(modm)9 - 6a + a^2 \equiv 0 \pmod m です。c=(9,−6,1)\boldsymbol{c} = (9, -6, 1) は 定理 4.3 の合同式を満たし、c=0c = 0 なので θ=0\theta = 0 です。よって連続する 3 つ組 (u,v,w)=(xk,xk+1,xk+2)/m(u, v, w) = (x_k, x_{k+1}, x_{k+2})/m はすべて

9u−6v+w∈Z9u - 6v + w \in \mathbb{Z}

を満たします。u,v,w∈[0,1)u, v, w \in [0, 1) では −6<9u−6v+w<10-6 < 9u - 6v + w < 10 なので、取りうる整数は −5,…,9-5, \ldots, 9 の 1515 個です。3 次元の点は 15 枚の平面の上にしかありません。隣り合う平面の間隔は 1/92+62+12=1/118≈0.0921/\sqrt{9^2 + 6^2 + 1^2} = 1/\sqrt{118} \approx 0.092 で、立方体の中に厚さ約 0.090.09 の、点が 1 つもない層が並びます。定理の上界 (3!⋅231)1/3≈2344(3!\cdot2^{31})^{1/3} \approx 2344 と比べると、RANDU の乗数は可能な範囲の中で極端に悪い選び方だったことが分かります。

# Python 3.9.6(標準ライブラリのみ)
a, m = 65539, 2**31
print("a^2 - 6a + 9 mod m =", (a * a - 6 * a + 9) % m)
x, planes, bad = 1, set(), 0 # 種 x_0 = 1
x1 = a * x % m
for _ in range(10**6):
x2 = a * x1 % m
s = 9 * x - 6 * x1 + x2 # 整数として厳密
if s % m: bad += 1
planes.add(s // m)
x, x1 = x1, x2
print("線形関係が破れた回数:", bad)
print("現れた平面 9u - 6v + w = j の j:", sorted(planes))
print("枚数:", len(planes), " Marsaglia の上界 (3! m)^(1/3) =", round((6 * m) ** (1 / 3), 1))
a^2 - 6a + 9 mod m = 0
線形関係が破れた回数: 0
現れた平面 9u - 6v + w = j の j: [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
枚数: 15 Marsaglia の上界 (3! m)^(1/3) = 2344.4

10610^6 個の 3 つ組のすべてで線形関係が整数として成り立ち、15 枚の平面がすべて現れています。

注意 4.5(スペクトル検定)

乗数 aa の良し悪しは、各次元 dd について、点を覆う平行な超平面の族のうち間隔が最大のものの間隔 1/νd1/\nu_d(νd\nu_d は 定理 4.3 の Λ\Lambda の最短ベクトルの Euclid ノルム)で測ります。これをスペクトル検定といい、線形合同法の乗数はこの値がよいものを計算機で探して選びます。各次元で達成できる最良の定数(Hermite 定数)や乗数の表は Knuth の本の 3.3.4 節と L’Ecuyer の論文 (1999) にあります。この章では最良の定数を定理としては扱いません。

5. F2\mathbb{F}_2 上の線形生成器

Section titled “5. F2\mathbb{F}_2F2​ 上の線形生成器”

ビット列を、2 元体 F2={0,1}\mathbb{F}_2 = \{0, 1\} 上のベクトルとみます。加法は排他的論理和(XOR)です。

定義 5.1(F2F_2 上の線形生成器)↗

n≥1n \ge 1 とし、AA を F2\mathbb{F}_2 の元を成分とする nn 次正方行列とする。状態集合 S=F2nS = \mathbb{F}_2^n、遷移 T(x)=AxT(x) = Ax の生成器を F2\mathbb{F}_2 上の線形生成器という。次の 2 つが代表的である。

  • 線形帰還シフトレジスタ(LFSR): ビットの列を漸化式 bk+n=γn−1bk+n−1+⋯+γ0bkb_{k+n} = \gamma_{n-1}b_{k+n-1} + \cdots + \gamma_0b_k(γi∈F2\gamma_i \in \mathbb{F}_2)で作る。状態は (bk,…,bk+n−1)(b_k, \ldots, b_{k+n-1})。
  • xorshift: 状態を nn ビットの整数とみて、「左に ss ビットずらしたものとの XOR」「右に ss ビットずらしたものとの XOR」を何回か合成する。左シフトの行列を LL、右シフトの行列を RR とすると、これらは I+LsI + L^s、I+RsI + R^s という行列の積である。

零ベクトルは A0=0A\boldsymbol{0} = \boldsymbol{0} で不動点なので、零でない種からの周期は高々 2n−12^n - 1 です。この最大値が達成される条件は、AA の特性多項式 χA(t)=det⁡(tI−A)∈F2[t]\chi_A(t) = \det(tI - A) \in \mathbb{F}_2[t] で決まります。

定義 5.2(F2F_2 上の原始多項式)↗

次数 n≥1n \ge 1 のモニック多項式 f∈F2[t]f \in \mathbb{F}_2[t] が原始多項式であるとは、ff が F2[t]\mathbb{F}_2[t] の既約元(定義 2.1[多項式環と体の拡大])であり、かつ f∣tk−1f \mid t^k - 1 となる最小の整数 k≥1k \ge 1 が 2n−12^n - 1 であることをいう。

次の定理のねらいは、「周期が最大になるか」という数列の問題を、「特性多項式が原始多項式か」という多項式の問題に言い換えることです。証明では、AA の多項式の全体を一つの環として扱い、周期が最大なら零でない元がすべて AA の冪で書けて逆元をもつ、という点から既約性を引き出します。

定理 5.3(F2F_2 線形生成器の最大周期)✓

AA を F2\mathbb{F}_2 上の nn 次正方行列とする。次の 2 条件は同値である。

  1. 零でないある種 x0∈F2nx_0 \in \mathbb{F}_2^n について、状態の列 xk=Akx0x_k = A^kx_0 が純周期的で周期が 2n−12^n - 1 である。
  2. 特性多項式 χA\chi_A が F2\mathbb{F}_2 上の原始多項式である。

このとき、零でないすべての種について列は純周期的で周期は 2n−12^n - 1 である。

証明(定理 5.3)

P=2n−1P = 2^n - 1 と置き、R={g(A):g∈F2[t]}R = \{g(A) : g \in \mathbb{F}_2[t]\} とします。RR は AA の多項式の全体で、行列の和と積で閉じた可換な環です。Cayley–Hamilton の定理(系 7.3[加群と PID 上の構造定理])から χA(A)=0\chi_A(A) = 0 です。

2 ⇒ 1(およびすべての種についての主張)。 f=χAf = \chi_A が原始多項式だとします。f∣tP−1f \mid t^P - 1 なので tP−1=fqt^P - 1 = fq と書けて、AP−I=f(A)q(A)=0A^P - I = f(A)q(A) = 0 です。よって AA は可逆で、TT は全単射、すべての列は純周期的です(命題 2.3 の 3)。x0≠0x_0 \ne 0 と 1≤k<P1 \le k < P を取り、Akx0≠x0A^kx_0 \ne x_0 を示します。g=tk−1g = t^k - 1 と置くと、原始多項式の定義から f∤gf \nmid g です。F2[t]\mathbb{F}_2[t] は単項イデアル整域なので(命題 7.2[イデアルと剰余環] の 2)、ff と gg が生成するイデアルは (h)(h) と書けます。h∣fh \mid f で ff は既約なので、hh は単元か、ff の単元倍です。後者なら f∣gf \mid g となるので、hh は単元、すなわち uf+vg=1uf + vg = 1 となる多項式 u,vu, v があります。AA を代入すると v(A)g(A)=Iv(A)g(A) = I なので、g(A)=Ak−Ig(A) = A^k - I は可逆です。x0≠0x_0 \ne 0 から (Ak−I)x0≠0(A^k - I)x_0 \ne 0、すなわち Akx0≠x0A^kx_0 \ne x_0 です。APx0=x0A^Px_0 = x_0 と合わせて、周期はちょうど PP です。

1 ⇒ 2。 x0≠0x_0 \ne 0 から始まる列が純周期的で周期 PP だとします。x0,…,xP−1x_0, \ldots, x_{P-1} は互いに異なります。また、ある jj で xj=0x_j = 0 なら以後ずっと 00 で、純周期性から x0=0x_0 = 0 となってしまうので、どの xkx_k も零ではありません。零でないベクトルは PP 個なので、

{x0,x1,…,xP−1}=F2n∖{0}\{x_0, x_1, \ldots, x_{P-1}\} = \mathbb{F}_2^n \setminus \{0\}

です。F2\mathbb{F}_2 線形写像 ϕ:R→F2n\phi : R \to \mathbb{F}_2^n を ϕ(B)=Bx0\phi(B) = Bx_0 で定めます。

ϕ\phi は全単射。 像は ϕ(Ak)=xk\phi(A^k) = x_k と ϕ(0)=0\phi(0) = 0 を含むので全射です。Bx0=0Bx_0 = 0 なら、RR が可換であることから Bxk=BAkx0=AkBx0=0Bx_k = BA^kx_0 = A^kBx_0 = 0 がすべての kk で成り立ち、BB はすべてのベクトルを 00 に写すので B=0B = 0 です。よって単射です。

RR の零でない元はすべて AA の冪で、可逆。 B∈RB \in R、B≠0B \ne 0 なら ϕ(B)≠0\phi(B) \ne 0 なので ϕ(B)=xk=ϕ(Ak)\phi(B) = x_k = \phi(A^k) となる kk があり、単射性から B=AkB = A^k です。また ϕ(AP)=xP=x0=ϕ(I)\phi(A^P) = x_P = x_0 = \phi(I) から AP=IA^P = I なので、AkA^k は逆元 AP−kA^{P-k}(0≤k<P0 \le k < P に取る)をもちます。特に、RR の零でない 2 元の積は零ではありません。

g(A)=0  ⟺  χA∣gg(A) = 0 \iff \chi_A \mid g。 χA(A)=0\chi_A(A) = 0 から AnA^n は I,A,…,An−1I, A, \ldots, A^{n-1} の一次結合で、帰納的にすべての冪がそうです。よって RR は I,…,An−1I, \ldots, A^{n-1} で張られます。ϕ\phi が同型なので dim⁡F2R=n\dim_{\mathbb{F}_2}R = n で、この nn 個は一次独立です。つまり、次数が nn 未満の零でない多項式 gg は g(A)≠0g(A) \ne 0 です。J={g:g(A)=0}J = \{g : g(A) = 0\} は F2[t]\mathbb{F}_2[t] のイデアルで、χA\chi_A は JJ の零でない元のうち次数が最小のものの 1 つなので、J=(χA)J = (\chi_A) です(命題 7.2[イデアルと剰余環] の 2)。

χA\chi_A は既約。 χA\chi_A は次数 n≥1n \ge 1 なので、零でも単元でもありません。χA=gh\chi_A = gh で g,hg, h がどちらも単元でない(次数が 11 以上)とすると、g(A)h(A)=0g(A)h(A) = 0 から g(A)=0g(A) = 0 または h(A)=0h(A) = 0 ですが、g,hg, h の次数は nn 未満なので矛盾です。

位数。 χA∣tk−1  ⟺  Ak=I  ⟺  Akx0=x0\chi_A \mid t^k - 1 \iff A^k = I \iff A^kx_0 = x_0(ϕ\phi の単射性)です。x0,…,xP−1x_0, \ldots, x_{P-1} が互いに異なり xP=x0x_P = x_0 なので、これを満たす最小の k≥1k \ge 1 は PP です。以上で χA\chi_A は原始多項式です。

最大周期の生成器がどの nn にも存在することは、有限体の乗法群が巡回群であることから従います。

命題 5.4(原始多項式の存在)✓

すべての n≥1n \ge 1 について、F2\mathbb{F}_2 上の次数 nn の原始多項式が存在する。したがって、周期 2n−12^n - 1 の F2\mathbb{F}_2 線形生成器が存在する。

証明(命題 5.4)

元の個数が 2n2^n の体 KK を取ります(定理 7.2[多項式環と体の拡大] の 2)。標数は 22 なので KK は F2={0,1}\mathbb{F}_2 = \{0, 1\} を含み、F2\mathbb{F}_2 上のベクトル空間です。その次元を n′n' とすると元の個数は 2n′2^{n'} なので、n′=nn' = n です。乗法群 K×K^\times は位数 2n−12^n - 1 の巡回群なので(定理 7.3[多項式環と体の拡大])、生成元 α\alpha を取れます。

KK の基底を 1 つ固定し、F2\mathbb{F}_2 線形写像 x↦αxx \mapsto \alpha x の表現行列を AA とします。種を x0=1x_0 = 1(に対応する座標ベクトル)とすると xk=αkx_k = \alpha^k で、α\alpha の位数が 2n−12^n - 1 なので、x0,…,x2n−2x_0, \ldots, x_{2^n-2} は互いに異なり x2n−1=x0x_{2^n-1} = x_0 です。すなわち列は純周期的で周期は 2n−12^n - 1 です。定理 5.3 の 1 ⇒ 2 から、χA\chi_A は次数 nn の原始多項式です。

例 5.5(4 ビットの LFSR)

漸化式 bk+4=bk+1+bkb_{k+4} = b_{k+1} + b_k の状態 (bk,bk+1,bk+2,bk+3)(b_k, b_{k+1}, b_{k+2}, b_{k+3}) の遷移行列は

A=(0100001000011100),χA(t)=det⁡(tI−A)=t4+t+1A = \begin{pmatrix} 0&1&0&0\\ 0&0&1&0\\ 0&0&0&1\\ 1&1&0&0 \end{pmatrix}, \qquad \chi_A(t) = \det(tI - A) = t^4 + t + 1

です(第 1 列についての余因子展開。F2\mathbb{F}_2 では −1=1-1 = 1)。種 (1,0,0,0)(1,0,0,0) からビットの列は

1,0,0,0,1,0,0,1,1,0,1,0,1,1,1, 1,0,0,0,…1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1,\ 1, 0, 0, 0, \ldots

と周期 15=24−115 = 2^4 - 1 で、t4+t+1t^4 + t + 1 は原始多項式です。一方、漸化式 bk+4=bk+3+bk+2+bk+1+bkb_{k+4} = b_{k+3} + b_{k+2} + b_{k+1} + b_k(特性多項式 t4+t3+t2+t+1t^4 + t^3 + t^2 + t + 1)では 1,0,0,0,1, 1,0,0,0,1,…1, 0, 0, 0, 1,\ 1, 0, 0, 0, 1, \ldots と周期 55 です。この多項式は F2\mathbb{F}_2 上既約ですが、(t−1)(t4+t3+t2+t+1)=t5−1(t - 1)(t^4 + t^3 + t^2 + t + 1) = t^5 - 1 を割り切るので原始多項式ではありません。既約性だけでは最大周期になりません。

次のコードは、16 ビットの xorshift について、零でない 6553565535 個の状態を軌道に分けて長さを調べます。

# Python 3.9.6(標準ライブラリのみ)
def step(x, a, b, c): # 16 ビットの xorshift
x ^= (x << a) & 0xFFFF
x ^= x >> b
x ^= (x << c) & 0xFFFF
return x
def orbit_lengths(abc): # 零でない全状態を軌道に分け、長さの集合を返す
seen, lengths = bytearray(1 << 16), set()
for x0 in range(1, 1 << 16):
if seen[x0]:
continue
x, k = x0, 0
while not seen[x]:
seen[x] = 1
x = step(x, *abc)
k += 1
lengths.add(k)
return sorted(lengths)
for abc in ((7, 9, 8), (4, 3, 7), (1, 1, 1)):
print(abc, "軌道の長さ:", orbit_lengths(abc))
(7, 9, 8) 軌道の長さ: [65535]
(4, 3, 7) 軌道の長さ: [65535]
(1, 1, 1) 軌道の長さ: [1, 2, 4, 8, 16]

ずらし幅 (7,9,8)(7, 9, 8) と (4,3,7)(4, 3, 7) では零でない全状態が 1 つの軌道をなし、定理 5.3 からその遷移行列の特性多項式は原始多項式です。(1,1,1)(1, 1, 1) では軌道が短く分かれ、乱数には使えません。

注意 5.6(Mersenne Twister と線形性の限界)

Mersenne Twister(MT19937)は状態が 1993719937 ビットの F2\mathbb{F}_2 線形生成器で、周期は 219937−12^{19937} - 1、32 ビット精度で 623 次元均等分布です。219937−12^{19937} - 1 は素数なので、原始性の判定が既約性の判定に帰着します。これらの証明は計算機による多項式の計算を含むので、ここでは定理として扱いません(Matsumoto–Nishimura の論文を参照してください)。一方、F2\mathbb{F}_2 線形生成器の出力ビットは状態の線形関数なので、ビット列の線形複雑度や 2 元行列の階数を調べる検定には構造的に合格しません(L’Ecuyer–Simard の TestU01 の報告)。周期の長さと均等分布は、欠陥がないことを意味しません。

定義 6.1(出力関数による攪拌)↗

遷移 TT は単純なまま、出力関数 gg で状態のビットを混ぜる設計を、出力の攪拌という。PCG(permuted congruential generator)は、法 2642^{64} または 21282^{128} の全周期の線形合同法を遷移とし、状態の上位ビットで決まる量だけ下位側をずらす・回転させる関数(たとえば「上位と下位の XOR を取り、最上位の数ビットが指す量だけ回転する」)を出力関数とする生成器の族である。カウンタ型の生成器(Philox、Threefry)は、遷移を T(x)=x+1T(x) = x + 1 とし、出力関数にブロック暗号に似た全単射を使う。

PCG では、状態の列は線形合同法そのものなので、周期は 定理 3.4 で決まります。出力は上位ビットを使って下位ビットを選び直すので、命題 3.7 の下位ビットの短い周期は出力に現れません。ただし、出力の統計的な性質がよいことは定理ではなく、検定による経験的な事実です。

定義 6.2(飛び越しとストリーム)↗

生成器 (S,T,g)(S, T, g) について、状態 ss と整数 k≥0k \ge 0 から Tk(s)T^k(s) を、TT を kk 回施すより少ない手間で求めることを飛び越し(jump-ahead)という。開始状態 ss と長さ LL に対して、状態の並び s,T(s),…,TL−1(s)s, T(s), \ldots, T^{L-1}(s)(およびそこからの出力)を、ss から始まる長さ LL のストリームという。

命題 6.3(飛び越しの計算量)✓

  1. 線形合同法について、Tk(x)=(akx+ck) mod mT^k(x) = (a_kx + c_k) \bmod m となる組 (ak,ck)=(ak mod m, cSk(a) mod m)(a_k, c_k) = (a^k \bmod m,\ cS_k(a) \bmod m) は、mm を法とする乗算と加算を合わせて高々 6⌊log⁡2k⌋6\lfloor\log_2 k\rfloor 回(k≥1k \ge 1)で求まる。
  2. F2\mathbb{F}_2 上の nn 次元の線形生成器について、AkA^k は高々 2⌊log⁡2k⌋2\lfloor\log_2 k\rfloor 回の行列の積で求まる。
証明(命題 6.3)

アフィン写像 x↦αx+γx \mapsto \alpha x + \gamma を組 (α,γ)(\alpha, \gamma) で表します。(α,γ)(\alpha, \gamma) の後に (α′,γ′)(\alpha', \gamma') を施すと α′(αx+γ)+γ′=α′αx+(α′γ+γ′)\alpha'(\alpha x + \gamma) + \gamma' = \alpha'\alpha x + (\alpha'\gamma + \gamma') なので、合成は

(α′,γ′)∘(α,γ)=(α′α, α′γ+γ′)(modm)(\alpha', \gamma') \circ (\alpha, \gamma) = (\alpha'\alpha,\ \alpha'\gamma + \gamma') \pmod m

で、乗算 2 回と加算 1 回の計 3 回の演算です。写像の合成は結合的なので、T=(a,c)T = (a, c) の kk 回の合成 TkT^k について T2q=Tq∘TqT^{2q} = T^q \circ T^q、T2q+1=T∘(Tq∘Tq)T^{2q+1} = T \circ (T^q \circ T^q) が成り立ちます。TkT^k を求めるのに要る合成の回数を M(k)M(k) とすると、M(1)=0M(1) = 0、M(k)≤M(⌊k/2⌋)+2M(k) \le M(\lfloor k/2\rfloor) + 2 なので、kk についての帰納法で M(k)≤2⌊log⁡2k⌋M(k) \le 2\lfloor\log_2 k\rfloor です(⌊log⁡2⌊k/2⌋⌋=⌊log⁡2k⌋−1\lfloor\log_2\lfloor k/2\rfloor\rfloor = \lfloor\log_2 k\rfloor - 1 を使います)。演算の回数は 3M(k)≤6⌊log⁡2k⌋3M(k) \le 6\lfloor\log_2 k\rfloor です。Tk=(ak,cSk(a))T^k = (a^k, cS_k(a)) であることは 補題 3.2 です。

2 も同じ漸化式 A2q=AqAqA^{2q} = A^qA^q、A2q+1=A⋅AqAqA^{2q+1} = A\cdot A^qA^q によります。

F2\mathbb{F}_2 線形生成器で nn が大きいとき(MT19937 では n=19937n = 19937)、行列の積は重すぎます。その場合は多項式 tk mod χA(t)=∑i<nritit^k \bmod \chi_A(t) = \sum_{i<n} r_it^i を繰り返し二乗で求め、Akx=∑iriAixA^kx = \sum_i r_iA^ix を TT の nn 回の適用で計算します(χA(A)=0\chi_A(A) = 0 なので Ak=∑iriAiA^k = \sum_i r_iA^i です)。

並列計算では、各ワーカーが別々のストリームを使います。同じ状態を 2 つのワーカーが使うと、その部分の標本は完全に相関し、独立な標本としての誤差評価が崩れます。ストリームの開始点の決め方は 2 通りあります。

重ならない重なる(濃い部分)
状態を円周上に並べたサイクルと、長さ L の区間(太い弧)で表した s = 3 本のストリーム。左は開始点が 120 度ずつ離れていて弧が重ならない。右は 1 本目と 2 本目の開始点が 60 度しか離れておらず、弧が重なる。

定理 6.4(ストリームの重なりの確率)✓

遷移 TT が状態を長さ PP の 1 つのサイクル CC として巡回させる生成器を考える。s≥2s \ge 2 本のストリームの長さを LL とし、2L−1≤P2L - 1 \le P とする。

  1. 開始状態 σ1,…,σs\sigma_1, \ldots, \sigma_s が CC 上の一様分布に従う互いに独立な確率変数ならば、ある 2 本のストリームが同じ状態を含む確率 poverlapp_{\mathrm{overlap}} は poverlap≤s(s−1)(2L−1)2P≤s(s−1)LPp_{\mathrm{overlap}} \le \dfrac{s(s-1)(2L-1)}{2P} \le \dfrac{s(s-1)L}{P} を満たす。
  2. 開始状態を σj=TjJ(σ0)\sigma_j = T^{jJ}(\sigma_0)(j=0,…,s−1j = 0, \ldots, s-1)と取り、J≥LJ \ge L かつ sJ≤PsJ \le P ならば、どの 2 本のストリームも同じ状態を含まない。
証明(定理 6.4)

CC の 1 点 s∗s^* を固定し、CC の状態 Ti(s∗)T^i(s^*) を i∈Z/PZi \in \mathbb{Z}/P\mathbb{Z} と同一視します。TT は i↦i+1i \mapsto i + 1 になり、開始位置 σ\sigma のストリームは {σ,σ+1,…,σ+L−1}\{\sigma, \sigma+1, \ldots, \sigma + L - 1\} です。開始位置 σ,σ′\sigma, \sigma' の 2 本が共通の状態をもつのは、σ+i=σ′+i′\sigma + i = \sigma' + i' となる 0≤i,i′<L0 \le i, i' < L があるとき、すなわち

σ′−σ∈D:={−(L−1),…,−1,0,1,…,L−1}(modP)\sigma' - \sigma \in D := \{-(L-1), \ldots, -1, 0, 1, \ldots, L-1\} \pmod P

のときです。DD の元は 2L−1≤P2L - 1 \le P 個以下です。

1. i≠ji \ne j とします。σi,σj\sigma_i, \sigma_j は独立で一様なので(独立性は 定義 2.3[確率変数と期待値])、各 δ∈Z/PZ\delta \in \mathbb{Z}/P\mathbb{Z} について

P(σj−σi=δ)=∑τP(σi=τ) P(σj=τ+δ)=P⋅1P⋅1P=1P\mathbb{P}(\sigma_j - \sigma_i = \delta) = \sum_{\tau} \mathbb{P}(\sigma_i = \tau)\,\mathbb{P}(\sigma_j = \tau + \delta) = P\cdot\frac1P\cdot\frac1P = \frac1P

です。よって 2 本が重なる確率は ∣D∣/P≤(2L−1)/P|D|/P \le (2L-1)/P です。組 {i,j}\{i, j\} は s(s−1)/2s(s-1)/2 通りあるので、確率の劣加法性から、どれかの組が重なる確率は s(s−1)2⋅2L−1P\frac{s(s-1)}{2}\cdot\frac{2L-1}{P} 以下です。2L−1<2L2L - 1 < 2L から第 2 の不等式が従います。

2. i<ji < j について σj−σi=(j−i)J\sigma_j - \sigma_i = (j - i)J で、J≤(j−i)J≤(s−1)J≤P−JJ \le (j-i)J \le (s-1)J \le P - J です。L≤JL \le J なので、整数として L≤(j−i)J≤P−LL \le (j-i)J \le P - L です。DD の元を 00 以上 PP 未満の代表で表すと {0,…,L−1}∪{P−L+1,…,P−1}\{0, \ldots, L-1\} \cup \{P - L + 1, \ldots, P - 1\} なので、(j−i)J mod P∉D(j-i)J \bmod P \notin D です。

1 の論法は、ハッシュ値の衝突についての誕生日境界(命題 2.2[バージョン管理システム Git])と同じ「組の数 × 1 組あたりの確率」です。違いは、点の一致ではなく長さ LL の区間の重なりを数えるので、因子 2L−12L - 1 が付くことです。P=2128P = 2^{128}、s=220s = 2^{20} 本、各 L=240L = 2^{40} 個のとき、上界は

s(s−1)LP<220⋅220⋅2402128=2−48≈3.6×10−15\frac{s(s-1)L}{P} < \frac{2^{20}\cdot2^{20}\cdot2^{40}}{2^{128}} = 2^{-48} \approx 3.6\times10^{-15}

です。一方 P=264P = 2^{64} で同じ規模の計算をすると上界は 11 を超え、何も保証しません。並列計算に周期 2642^{64} の生成器を使えない理由です。

定義 6.5(種の展開)↗

利用者が与える短い種(整数や整数の列)から、生成器の状態全体をハッシュに似た混合関数で作ることを種の展開という。NumPy の SeedSequence は、種と「何番目の子か」を表す番号の列を混ぜて状態を作り、spawn は番号の違う子を返す。

種の展開で作った開始状態は、サイクル上の独立で一様な点のように振る舞うと期待され、そのモデルのもとで 定理 6.4 の 1 が重なりの確率を評価します(モデルが成り立つこと自体は定理ではありません)。これに対して飛び越しは、2 のとおり重なりが起きないことを保証します。

# Python 3.9.6, NumPy 2.0.2
import numpy as np
from fractions import Fraction
from math import log2
ss = np.random.SeedSequence(20261008)
children = ss.spawn(3) # 種の展開によるストリーム
print([round(np.random.default_rng(s).random(), 6) for s in children])
bg = np.random.PCG64(20261008)
jumped = [bg.jumped(j) for j in range(3)] # 飛び越しによるストリーム
print([round(np.random.Generator(b).random(), 6) for b in jumped])
P, J = 2**128, 210306068529402873165736369884012333109 # PCG64 の周期と jumped の歩数
starts = sorted(j * J % P for j in range(2**10))
gap = min((b - a) % P for a, b in zip(starts, starts[1:] + starts[:1]))
print(f"jumped 1024 本の開始点の最小間隔 = 2^{log2(gap):.2f}")
def bound(logP, logs, logL): # s(s-1)L/P を有理数で計算
s, L, P = 2**logs, 2**logL, 2**logP
return float(Fraction(s * (s - 1) * L, P))
for logP, logs, logL in ((64, 10, 30), (64, 20, 40), (128, 20, 40), (128, 30, 64)):
b = bound(logP, logs, logL)
print(f"P=2^{logP:<4d} s=2^{logs:<3d} L=2^{logL:<3d} 上界 = {b:.3e}" + (" (1 を超え、情報がない)" if b >= 1 else ""))
[0.953464, 0.617841, 0.494969]
[0.125636, 0.622824, 0.591673]
jumped 1024 本の開始点の最小間隔 = 2^116.89
P=2^64 s=2^10 L=2^30 上界 = 6.098e-05
P=2^64 s=2^20 L=2^40 上界 = 6.554e+04 (1 を超え、情報がない)
P=2^128 s=2^20 L=2^40 上界 = 3.553e-15
P=2^128 s=2^30 L=2^64 上界 = 6.250e-02

NumPy の PCG64.jumped(j) は、状態を jJjJ 歩(J≈2128/φJ \approx 2^{128}/\varphi、φ\varphi は黄金比。値は NumPy の文書に記載)進めます。等間隔ではないので 定理 6.4 の 2 の仮定とは形が違いますが、証明の本質は開始点どうしのサイクル上の距離が LL 以上であることなので、1024 本なら各ストリームが 21162^{116} 個以下の乱数を使うかぎり重なりません(出力の 3 行目)。

注意 6.6(統計的な検定と、定理にならない性質)

この章の定理が保証するのは周期・格子構造・重なりの確率だけです。「連続する出力が独立な一様乱数と区別できない」ことは、TestU01 の BigCrush のような検定群に合格するという形でしか確かめられず、合格は欠陥がないことの証明ではありません。PCG・Philox・xoshiro などの現在の標準的な生成器の統計的な性質は、それぞれの設計者の報告と独立な検定の結果によります。Monte Carlo 計算では、別の族の生成器で計算をやり直して結果が標準誤差の範囲で一致することを確かめるのが、実務上の検算です。

注意 6.7(暗号論的擬似乱数との違い)

この章の生成器は、出力の一部から状態を復元できます。線形合同法は連続する数個の出力から a,ca, c と状態が求まり、F2\mathbb{F}_2 線形生成器は nn ビット程度の出力から連立一次方程式で状態が求まります。暗号に使う擬似乱数には、出力をいくら観測しても次の出力を多項式時間で予測できないこと(予測不能性)が要求され、これは計算量的な仮定に基づく別の理論です。鍵やトークンの生成には、オペレーティングシステムが提供する暗号論的な乱数源(Python では secrets モジュール)を使ってください。

演習 7.1易

m=23⋅32⋅5=360m = 2^3\cdot 3^2\cdot 5 = 360 の線形合同法が全周期をもつ乗数 aa(1≤a≤3601 \le a \le 360)をすべて求め、その個数を答えよ。また、全周期をもつ組 (a,c)(a, c)(0≤c<3600 \le c < 360)の個数を求めよ。

解答

定理 3.4 の条件 2・3 は a≡1(mod3)a \equiv 1 \pmod 3、a≡1(mod5)a \equiv 1 \pmod 5、a≡1(mod4)a \equiv 1 \pmod 4(これは a≡1(mod2)a \equiv 1 \pmod 2 を含みます)です。3,4,53, 4, 5 は対ごとに互いに素なので、これは a≡1(mod60)a \equiv 1 \pmod{60} と同値です(系 6.3[整除と素因数分解])。1≤a≤3601 \le a \le 360 では a=1,61,121,181,241,301a = 1, 61, 121, 181, 241, 301 の 66 個です。条件 1 は gcd⁡(c,360)=1\gcd(c, 360) = 1 で、そのような cc は φ(360)=360⋅12⋅23⋅45=96\varphi(360) = 360\cdot\frac12\cdot\frac23\cdot\frac45 = 96 個です。組の個数は 6×96=5766 \times 96 = 576 で、§3 のコードの出力と一致します。

演習 7.2標準

e≥4e \ge 4 を偶数とし、m=2em = 2^e、a=2e/2+1a = 2^{e/2} + 1、cc を奇数とする。(1) この線形合同法が全周期をもつことを示せ。(2) 連続する 3 つ組 (xk,xk+1,xk+2)/m(x_k, x_{k+1}, x_{k+2})/m が、cc によらず高々 44 枚の平行な平面に載ることを示せ。

解答

(1) a−1=2e/2a - 1 = 2^{e/2} は e≥4e \ge 4 から 44 の倍数で、cc は奇数なので、定理 3.4 の 3 条件が成り立ちます。

(2) a2=2e+2⋅2e/2+1≡2(a−1)+1=2a−1(mod2e)a^2 = 2^e + 2\cdot2^{e/2} + 1 \equiv 2(a - 1) + 1 = 2a - 1 \pmod{2^e} なので、1−2a+a2≡0(modm)1 - 2a + a^2 \equiv 0 \pmod m です。c=(1,−2,1)\boldsymbol{c} = (1, -2, 1) は 定理 4.3 の合同式を満たし、ℓ=4\ell = 4 です。同じ定理の後半から、3 つ組はすべて u−2v+w∈θ+Zu - 2v + w \in \theta + \mathbb{Z} を満たし、載りうる平面は高々 44 枚です。乗数 aa が 22 の冪に近いと、低い次数の関係式 (a−1)2≡0(a - 1)^2 \equiv 0 が生じて 3 次元の格子がつぶれます。RANDU(例 4.4)の (a−3)2≡0(a - 3)^2 \equiv 0 と同じ仕組みです。全周期であること(1 次元の性質)は、3 次元の並びについて何も保証しません。

演習 7.3標準

F2\mathbb{F}_2 上の次数 33 のモニック多項式のうち原始多項式であるものをすべて求め、そのそれぞれについて LFSR の漸化式と、種 (1,0,0)(1, 0, 0) からの 1 周期分のビット列を書け。

解答

次数 3 のモニック多項式は t3+αt2+βt+γt^3 + \alpha t^2 + \beta t + \gamma の 88 個です。既約であるためには根 0,10, 1 をもたないこと(3 次式が可約なら 1 次の因子をもつので、これで十分)、すなわち γ=1\gamma = 1 かつ 1+α+β+1≠01 + \alpha + \beta + 1 \ne 0、つまり α+β=1\alpha + \beta = 1 が必要十分です。該当するのは t3+t+1t^3 + t + 1 と t3+t2+1t^3 + t^2 + 1 の 2 つで、残りの 6 個は既約でないので原始多項式ではありません。

漸化式 bk+3=γ2bk+2+γ1bk+1+γ0bkb_{k+3} = \gamma_2b_{k+2} + \gamma_1b_{k+1} + \gamma_0b_k の状態 (bk,bk+1,bk+2)(b_k, b_{k+1}, b_{k+2}) の遷移行列は、第 3 行が (γ0,γ1,γ2)(\gamma_0, \gamma_1, \gamma_2) の同伴行列で、特性多項式は t3+γ2t2+γ1t+γ0t^3 + \gamma_2t^2 + \gamma_1t + \gamma_0 です(例 5.5 と同じ余因子展開)。2 つの多項式に対応する列を種 (1,0,0)(1, 0, 0) から計算します。

  • t3+t+1t^3 + t + 1: bk+3=bk+1+bkb_{k+3} = b_{k+1} + b_k。1,0,0,1,0,1,1, 1,0,0,…1, 0, 0, 1, 0, 1, 1,\ 1, 0, 0, \ldots
  • t3+t2+1t^3 + t^2 + 1: bk+3=bk+2+bkb_{k+3} = b_{k+2} + b_k。1,0,0,1,1,1,0, 1,0,0,…1, 0, 0, 1, 1, 1, 0,\ 1, 0, 0, \ldots

どちらも 8 番目から最初の状態 (1,0,0)(1, 0, 0) に戻り、それまでの 7 個の状態は互いに異なるので、列は純周期的で周期は 7=23−17 = 2^3 - 1 です。定理 5.3 の 1 ⇒ 2 から、2 つとも原始多項式です。7 ビットの中に 11 が 44 個、00 が 33 個あり、零でない 3 ビットの状態 77 通りがちょうど 1 回ずつ現れます。

演習 7.4易

周期 P=2128P = 2^{128} の生成器で、ss 本のストリームを種の展開で作り、各ストリームで L=250L = 2^{50} 個の乱数を使う。重なりの確率の上界 s(s−1)L/Ps(s-1)L/P を 10−1210^{-12} 以下にしたい。ss はどこまで増やせるか。

解答

s(s−1)<s2s(s-1) < s^2 なので s2⋅250/2128≤10−12s^2 \cdot 2^{50}/2^{128} \le 10^{-12}、すなわち s2≤10−12⋅278s^2 \le 10^{-12}\cdot2^{78} であれば十分です。278≈3.02×10232^{78} \approx 3.02\times10^{23} なので s2≤3.02×1011s^2 \le 3.02\times10^{11}、s≤5.5×105≈219s \le 5.5\times10^5 \approx 2^{19} です。約 50 万本までなら、定理 6.4 の 1 のモデルのもとで重なりの確率は 10−1210^{-12} 以下です。これを超える規模では、飛び越しで分ける(定理 6.4 の 2)か、状態のより大きい生成器を使います。

  1. D. E. Knuth, The Art of Computer Programming, Volume 2: Seminumerical Algorithms, 3rd ed., Addison-Wesley, 1997 — 第 3 章(3.2 節 線形合同法の周期、3.3.4 節 スペクトル検定)。
  2. T. E. Hull, A. R. Dobell, “Random number generators”, SIAM Review 4 (1962), 230–254.
  3. G. Marsaglia, “Random numbers fall mainly in the planes”, Proceedings of the National Academy of Sciences 61 (1968), 25–28.
  4. M. Matsumoto, T. Nishimura, “Mersenne twister: a 623-dimensionally equidistributed uniform pseudo-random number generator”, ACM Transactions on Modeling and Computer Simulation 8 (1998), 3–30.
  5. P. L’Ecuyer, R. Simard, “TestU01: A C library for empirical testing of random number generators”, ACM Transactions on Mathematical Software 33 (2007), Article 22.
  6. P. L’Ecuyer, “Tables of linear congruential generators of different sizes and good lattice structure”, Mathematics of Computation 68 (1999), 249–260.
  7. G. Marsaglia, “Xorshift RNGs”, Journal of Statistical Software 8 (2003), Issue 14.
  8. J. K. Salmon, M. A. Moraes, R. O. Dror, D. E. Shaw, “Parallel random numbers: as easy as 1, 2, 3”, Proceedings of SC ‘11 (2011).
  9. NumPy の文書 Random sampling: Parallel random number generation — SeedSequence.spawn と jumped の使い方。

このテーマの 100 本ノック(50 問)

執筆: Claude Code(Opus 5.5)、Claude Code(Sonnet 5.5)・監査 2 回(Claude Code)・最終 2026-10-12

この記事の誤りを報告する ・運営: 夢現技研合同会社 ・料金 ・利用条件 ・特定商取引法に基づく表記

© 2026 夢現技研合同会社 ・コード例は MIT ライセンスです。