IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

2023-1117962個の正で互いに素な単精度整数の積を法とする乗算合同法乱数の整数倍精度と実数倍精度のみでの計算方法
<>
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2023111796
(43)【公開日】2023-08-10
(54)【発明の名称】2個の正で互いに素な単精度整数の積を法とする乗算合同法乱数の整数倍精度と実数倍精度のみでの計算方法
(51)【国際特許分類】
   G06F 7/58 20060101AFI20230803BHJP
【FI】
G06F7/58 660
【審査請求】未請求
【請求項の数】1
【出願形態】書面
(21)【出願番号】P 2022024277
(22)【出願日】2022-01-31
(71)【出願人】
【識別番号】508260898
【氏名又は名称】中澤 直也
(72)【発明者】
【氏名】中澤 直也
(72)【発明者】
【氏名】中澤 宏
(57)【要約】      (修正有)
【要約】
【課題】倍精度整数と倍精度実数の演算だけで乱数を生成する計算方法を提供する。
【解決手段】方法は、2つの共通素因数を持たない、互いに素な、正の整数eとfの積であるd=efを法とし、dとは素な乗数z、dとは素なseed種nで構成される乗算合同法乱数(d、z、n)において、整数の任意に与えられた初期値nから順次得られる漸化合同式による一様独立乱数{vk:=zk/d|k=0、1、2、…}を得るための正の整数列{zk|k=0、1、2、…}、z0=mod(n、d)、zk+1=mod(zzk、d)、k=0、1、2、…、を得る。
【選択図】なし
【特許請求の範囲】
【請求項1】
2つの共通素因数を持たない、即ち互いに素な、正の整数eとfの積であるd=efを法とし、dとは素な乗数z、dとは素なseed種nで構成される乗算合同法乱数(d、z、n)において、整数の任意に与えられた初期値nから順次得られる漸化合同式による一様独立乱数{v:=z/d|k=0、1、2、…}を得るための正の整数列{z|k=0、1、2、…}、
=mod(n、d)、
k+1=mod(zz、d)、 k=0、1、2、…、
を得る計算方法であって、孫子の定理の一つの形,部分法eとfだけに対する成分
x:=mod(z,e)、
:=mod(z,e)、k=0、1、2、…、
y:=mod(z,f)、
:=mod(z,f)、k=0、1、2、…、
a:=mod(n,e)
b:=mod(n,f)
を用いて定義される2組のMC部分乱数列、MC生成機構(e、x、a)からの法eの合同漸化式の解
=mod(a、e)、
k+1=mod(xx、e)、 k=0、1、2、…、
及びMC生成機構(f、y、b)からの法fの合同漸化式の解
=mod(b、f)、
k+1=mod(yy、f)、 k=0、1、2、…、
から得られる一次結合{z|k=0、1、2、…}:
:=mod{f mod(x-1、e)+
e mod(y-1、f)、ef}、
-1:は法eでのfの逆数、 0<F-1<e、
-1:は法fでのeの逆数、 0<E-1<f、
で与えてよい、という形の孫子の定理に基づき、さらに任意の正の整数A、Bに対する関係
mod(eA,ef)=mod(e mod(A、f)、ef)、
mod(fB,ef)=mod(f mod(B、e)、ef)、
によってすべての演算を倍精度整数、倍精度実数だけの範囲内で正確高速に得る計算方法。
【発明の詳細な説明】
【技術分野】
【0001】
整数の3つ組(d、z、n)、d>0、dとは素で乗数と呼ばれるz>0、dとは素なnで初期値或いはseedと呼ばれるもの、が与える乗算合同multiplicative congruential(MC)法と呼ばれる乱数生成機構は、開区間(0、d)の整数の列{z,z,z,…}をdを法とする再帰的合同関係
=mod(n,d), zk+1=mod(zz,d)
k=1,2,…
によって生成する。即ちMC(d、z、n)乱数列は、区間(0、d)内の整数列{a=mod(nz,d)、k=0、1、2、…}を生成する。ここでmod(a、d)は整数dとは素な整数aを法dで割った余り、0とdの間の剰余、を与える関数である。開区間(0、1)内に分布したMC一様有理乱数列は
{x:=z/d| k=0,1,2,…、0<x<1}
で得られ、実際に乱数として用いられる。
【0002】
優れた乱数列を得るためには、条件を満たす任意の整数の組(d、z、n)を取ってよいわけではなく、様々な法d、乗数zを試し(検定し)それらが優れた一様独立性と見える出力を与えるものを採用する事が唯一の技術的手段である。この最も簡単で、ある意味では原始的な方法は、しかし乱数生成方法の中で最も広汎強力なもので、驚くべきことにどの様な方式に基づく有限乱数列であってもMC乱数で乗数zの逆数の精度で近似する。これは21世紀に漸く発見された事実であり、(文献1)または(文献2)を参照して頂きたい。そしてMC乱数生成方法は最も信頼性の高い検定方法を持つ事が既知である。これも参考文献に委ねて、再度の説明は省く。この様な優れたMC乱数は既に実在する。ここではそれらの実用の新しい技法を報告する。
(文献1)中澤 直也/中澤 宏:“コンピュータで生成する優れた乱数とは何か”、東京図書、出版予定。近似定理は定理12に記されている。
(文献2)Naoya Nakazawa/Hiroshi Nakazawa:
“Random Number Generators on Computers”、JENNY STANFORD、2022年出版予定。
【0003】
MC生成機構(d、z、n)を設計するとき、第一の問題は生成乱数列の周期Tである。これには種々の場合があるが、基本は法dが奇素数でzがその法で最長の周期T=(d-1)/2を与える原始根の場合であり、他のすべての場合でT/dはそれより小さくなる。シミュレーションは単一のMC乱数生成機構で行なわれなければならず、2つ以上のMC乱数生成機構は、たとえそれら個々の統計性がどんなに優れていても、相次いで或いは並列に、合成された全体乱数列の検定なしに用いる事はできない。その意味で検定を経て優良性が確認されて現存する2つの素数とそれらの原始根達の孫子の定理による組み合わせの合成MC乱数生成機構は、一様独立性の生成方式として最も優れている。整数pが奇素数、乗数zがその原始根であれば、その実際に用いる事のできる周期T=(d-1)/2は現在のシミュレーションでは240以上である事を求められるから、対応して素数pと原始根zとに基づくMC乱数生成機構はdが241以上である事を求め、奇素数pと原子根zのMC乱数生成機構では法pは倍精度整数でなければならない。この必要は素数の法pとその原始根zで構成されるMC乱数生成機構(p、z)の発見にも乱数としての演算にも大きな困難をもたらす。なぜならMC乱数の基本は、前段階の整数出力z=mod(zz,p)にさらにzを掛けて法pを計算するから、必ず
mod(z・z、p)、
を求めなければならない。この途中でのz・zの計算は倍精度を一時的に超えるので、計算時間を非常に多く要する4倍精度実数として計算し、整数部分を取らなければならない。しかし240程度の小さな周期ではごく短時間で使い切ってしまい、この様な実装は効果に対して余りに過大な負担となる。この事は後の段落で具体例で示される。
【0004】
前段落、素数の法と原始根の乗数での計算や周期の短さの困難には、MC乱数が深く考えられるようになって初めて、2つの素数の法を採用すると孫子の定理が魔術的な解決を与えていることが発見された。現在の発明はこの発見に基づくものである。基礎の理解から再考する様、孫子の定理から述べる。法dが2つの互いに素な2つの正整数の積d=efであるとする。孫子の定理の実現は様々な形で与えられるが、現在の議論に最も便利なのは下の(B)の形である。
(孫子の定理)(A)正の整数e、fが互いに素であれば、0以上d=ef未満の整数xに対する連立合同式
a=mod(x、e) b=mod(x、f) (*)
は整数xを法d=efで(0以上d未満で)一意に定める。
(B)上の連立合同式(*)に対して、その法dでの一意の解である整数xは次の式(**)で与える事ができる:
x=mod(afF-1、e)+mod(beE-1、f) (**)
ここでF-1は法eでfの逆数になるもの、即ちmod(F-1f、e)=1となるものであり、E-1は法fでのeの逆数、即ちmod(E-1e、f)=1となるものである。
(証明)先に(B)の形の解(**)がある事を示し、後にそれが法d=efでは一意である事を示す。(**)の式を法e、法fを取って見ると直ちに:
mod(x、e)=a, mod(x、f)=b
の成立がわかる。(A)の(*)の解がもう一つの形y:
a=mod(y、e) b=mod(y、f)
も持つとする。このとき差x-yについて
0=mod(x、e)-mod(y、e)=mod(x―y、e)
0=mod(x、f)-mod(y、f)=mod(x―y、f)
が成り立つ。故にx-yはeの倍数、かつfの倍数である。正のeとfは互いに素な(共通素因数のない)整数だから、それはx-yがef=dの倍数である事を意味し、法d=efでxとyとは同一である。(証明終り)
(注1)逆数F-1とE-1について注釈する。法eの既約剰余類群の言葉を使わず説明する。整数e>0とは素な(共通因数を持たない)e未満の整数がオイラーの関数0<φ(e)<e個だけある事は既知である。大切なのはそれらの整数の積もすべて法eと素で、積に関して法eと素な整数の中(法eの既約剰余類と呼ばれる)の集合を出ない事である。このφ(e)個の整数を{i、j、…、m}と1列に並べる。これらにeとは素な(eとは共通素因数を持たない)整数fを法eで掛けた列を法eで1からe-1に引き戻した集合
{mod(if、e)、mod(jf、e)、…、mod(mf、e)}(%)を作ると、これらは再び1以上e未満のφ(e)個の整数で、その中には必ず1が存在する。それをmod(kf,e)=1とすると、このkが法eでのfの逆数k=F-1である。F-1を求めるのには(eは単精度整数だから)列(%)を順次生成して探しても困難ではない。乱数を使う前に行なえばよい。
【0005】
この明快な孫子の定理は、MC乱数を考えることになって始めて、我々の認識に達した次の魔術的な補題を意味する。
(補題:2つの互いに異なる素数の部分法が与える孫子縮小)法d=efは互いに素な2つの部分法e>0とf>0の積、とする。任意の整数A>0対して、
mod(eA,d)=mod(eA、ef)
=mod(e mod(A、f)、ef)
=e mod(A、f)
であって、mod(eA、f)は0以上d=ef未満である。
(証明)整数A>0を整数f>0で割った等式は
A=qf+r、 qは商、rは余り、 rは0以上f未満
である。これから
mod(eA,d)=mod(eA、ef)=
mod(efq+er、ef)=er=e mod(A、f)
だから、補題が示された。(証明終り)
法d=efが互いに素な2つの部分法e>0とf>0の積であり、eとfは単精度整数の限界未満、すなわち231未満だとする。2d=2efは倍精度整数の上限値264より小さい。法dでのMC乱数列{z、z、…、z、zk+1、…}の漸化式の解は、整数単精度内の部分MC漸化式、途中に倍精度整数の積a・a、b・b、を要するが、の解達
k+1=mod(a・a、e)
k+1=mod(b・b、f)
によって
k+1=mod(afF-1、e)+mod(beE-1、f) (**)と解かれる。(孫子縮小の補題)より、
k+1=mod(f mod(a-1、e)、ef)+
mod(e mod(b-1、f)、ef)。
この右辺の内側の2つの法eと法fでのmod関数はそれぞれ、eとfと未満の正の整数を与え、外側のmod関数の内部は2ef=264を越えない。だから上のすべての計算は倍精度整数内で行なわれ、それを実数の有理数乱数とする計算も倍精度実数内で行なう事ができる。4倍精度計算を必要としないこのMC乱数生成方法は、実用に高速の大きな利便を与える。
【0006】
用いられた(孫子の縮小)の内容は殆ど自明だが、与える便宜は魔術的で大きい。ここではこれを用いた異なる2つの素数の積を法とするMC乱数の大きな利点の実証として、良い機会なので、中澤直也が発見し(文献1)(文献2)で公開される優れたMC乱数生成機構#001について具体的に述べる。この乱数は2つの素数eとの積d=ef
d=18055400005099021、約254
を法とし、乗数
z=7759097958782935、約252.78
で生成される。これらの詳しい組成は(文献1)(文献2)に開示されていて、下の図1の乱数計算mainプログラムと図2のsubroutine、にも開示されているので見て頂きたい。
図1 #001生成機構の乱数発生main program
main program
implicit integer8(i-n),real8(a-h,o-z)
common ip1,ip2,id,ad.iz1,iz2,mz1,mz2,ip2mp1,ip1mp2
ip1=134265203
ip2=134475827
id=ip1ip2 !idはおよそ254です
ad=id
iz1=19061252
iz2=77600525
n1=10 !初期値1は10です
n2=13 !初期値2は13です
ip2mp1=52577007
ip1mp2=81816271
do i=1,10000000
call random(rand)
end do
end
図2 #001生成機構の乱数発生subroutnine
subroutine random(rand)
implicit integer8(i-n),real8(a-h,o-z)
common ip1,ip2,id,ad.iz1,iz2,mz1,mz2,ip2mp1,ip1mp2
mz1=mod(mz1iz1,ip1)
mz2=mod(mz2iz2,ip2)
mz1a=mod(mz1ip2mp1,ip1)
mz2a=mod(mz2ip1mp2,ip2)
az=mod(ip2mz1a+ip1mz2a,id)
rand=az/ad
return
end
【0007】
前ページ図1図2のプログラムが必要とするCPU時間は0.281秒/1000万個である。出力は1/d、約2-54の精度(注)だから倍精度実数として十分な桁数を持つ。この計算速度と倍精度とに比べる事は、#M001生成機構の持つ絶対的に不利な性能の位置を与える。下の図3は#M001で同じ1000万個の乱数を生成するプログラムである。構造は一見大変簡単である。
図3 #M001で1000万個を出力するプログラム
main program
implicit integer8(i-n),real8(a-g,o-p,r-z),real16(q)
ip=17179869989d0 !ipはおよそ234.00
rp=ip
iz=7928410072d0
in=10 !初期値は10
qmz=in,
do i=1,10000000
rand=mod(qmz,rp)/rp
qmz=mod(qmziz,rp)
end do
end
この簡潔なプログラムは、しかし、real16(4倍精度実数)を含むmod関数の計算時間のため大幅に増大する。上の実行CPU時間は#001のほぼ10倍、2.625秒となる。出力される乱数精度は(注)1/d程度でほぼ2-34、周期はほぼd/2で233、このMC乱数専用にコンピュータを動かすと6分ほどで使い切られる。現在のシミュレーションに用いるには性能も精度も不足である。孫子の定理に基づく#001生成機構や、2つの異なる素数、或いは2つの素数のマイナス、で231を超えないものの積を法とするMC乱数生成機構がこの問題の現在の最適解である。
(注)(文献1)の近似定理(定理12)によればMC乱数は1/zの精度で任意のコンピュータ上の有限長さ一様乱数を近似している。その意味ではMC乱数の数値精度として1/zを取るべきだが、MC乱数として法dで整数1からd-1までの区間内の整数を割った有理数列としては1/dの精度と考える方が(用いる周期Tによって区間内の有理数を1/Tおきに取るとしても)自然だろう。
【技術的展望】
【0008】
孫子の定理は一般にk個、k>2、の互いに素な正の数の積の法についても成り立つので、2個の積d=efに限るものではない。だから、3個以上の部分法を持つものでも考える事ができる。ただその様な場合に数値的に倍精度計算だけへの設計をどの様に選ぶべきか、撰ぶ事ができるか、は大きな問題である。それは必然的に2成分のd=efの場合よりは複雑な考察を要するだろう。2成分の場合がきれいな構成を得て倍精度整数演算、倍精度実数演算だけで実現している事実、多分この構成が部分法での成功を最も得やすい形ではないかという予感、からは発明者達はこのより進んだ形は将来への課題ではないか、より大きな乱数周期への需要、より多い桁数精度の必要の生起、を見たとき、自然に得られるのでははないか、と考える。
【図面の簡単な説明】
【0009】
図1はMC乱数生成機構#001での1000万個の乱数発生Fortran主プログラムの一例である。この図はまた#001の詳しい情報、部分法や部分乗数の開示、も与えている。図2はそれに対応するMC乱数生成機構#001の乱数発生サブプログラム例である。そして図3はMC乱数生成機構#M001で1000万個の乱数を出力するFortranプログラムを示す図であり、#M001の構成の詳しい情報も開示している。
【手続補正書】
【提出日】2022-04-04
【手続補正1】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【0001】
整数の3つ組(d、z、n)、d>0、dとは素で乗数と呼ばれるz>0、dとは素なnで初期値或いはseedと呼ばれるもの、が与える乗算合同multiplicative congruential(MC)法と呼ばれる乱数生成機構は、開区間(0、d)の整数の列{z,z,z,…}をdを法とする再帰的合同関係
=mod(n,d), zk+1=mod(zz,d)
k=1,2,…
によって生成する。即ちMC(d、z、n)乱数列は、区間(0、d)内の整数列{a=mod(nz,d)、k=0、1、2、…}を生成する。ここでmod(a、d)は整数dとは素な整数aを法dで割った余り、0とdの間の剰余、を与える関数である。開区間(0、1)内に分布したMC一様有理乱数列は
{x:=z/d| k=0,1,2,…、0<x<1}
で得られ、実際に乱数として用いられる。
【0002】
優れた乱数列を得るためには、条件を満たす任意の整数の組(d、z、n)を取ってよいわけではなく、様々な法d、乗数zを試し(検定し)それらが優れた一様独立性と見える出力を与えるものを採用する事が唯一の技術的手段である。この最も簡単で、ある意味では原始的な方法は、しかし乱数生成方法の中で最も広汎強力なもので、驚くべきことにどの様な方式に基づく有限乱数列であってもMC乱数で乗数zの逆数の精度で近似する。これは21世紀に漸く発見された事実であり、[参考文献]の(文献1)または(文献2)を参照して頂きたい。そしてMC乱数生成方法はすべての生成方法の中で最も信頼性の高い検定方法を持つ事が既知である。これも参考文献に委ねて、再度の説明は省く。この様な優れたMC乱数は既に実在する。ここではそれらの実用の新しい技法発明を報告する。
参考文献
(文献1)中澤 直也/中澤 宏:コンピュータで生成する優れた乱数とはなに か、東京図書、出版予定。
(文献2)Naoya Nakazwa/H.Nakazawa:Random Number Generators on Computers,Jenny Stanford,2022年出版予定。
【0003】
MC生成機構(d、z、n)を設計するとき、第一の問題は生成乱数列の周期Tである。これには種々の場合があるが、基本は法dが奇素数でzがその法で最長の周期T=(d-1)/2を与える原始根の場合であり、他のすべての場合でT/dはそれより小さくなる。シミュレーションは単一のMC乱数生成機構で行なわれなければならず、2つ以上のMC乱数生成機構は、たとえそれら個々の統計性がどんなに優れていても、相次いで或いは並列に、合成された全体乱数列の検定なしに用いる事はできない。その意味で検定を経て優良性が確認されて現存する2つの素数とそれらの原始根達の孫子の定理による組み合わせの合成MC乱数生成機構は、一様独立性の生成方式として最も優れている。整数d=pが奇素数、乗数zがその原始根であれば、その実際に用いる事のできる周期T=(d-1)/2は現在のシミュレーションでは240以上である事を求められるから、対応して素数pと原始根zとに基づくMC乱数生成機構はdが241以上である事を求め、奇素数pと原子根zのMC乱数生成機構では法pは倍精度整数でなければならない。この必要は素数の法pとその原始根zで構成されるMC乱数生成機構(p、z)の発見にも乱数としての演算にも大きな困難をもたらす。なぜならMC乱数の基本は、前段階の整数出力z=mod(nz ,p)にさらにzを掛けて法pを計算するから、必ず
mod(zz 、p)、
を求めなければならない。この途中でのz・zの計算は倍精度を一時的に超えるので、計算時間を非常に多く要する4倍精度実数として計算し、整数部分を取らなければならない。しかし240程度の小さな周期ではごく短時間で使い切ってしまい、この様な実装は効果に対して余りに過大な負担となる。この事は後の段落で具体例で示される。
【0004】
素数の法と原始根の乗数での計算や周期の短さの困難には、MC乱数が深く考えられるようになって初めて、2つの素数の法を採用すると孫子の定理が魔術的な解決を与えていることが発見された。現在の発明はこの発見に基づくものである。基礎の理解から再考する様、孫子の定理から述べる。法dが2つの互いに素な2つの正整数の積d=efであるとする。孫子の定理の実現は様々な形で与えられるが、現在の議論に最も便利なのは下の(B)の形である。
(孫子の定理)(A)正の整数e、fが互いに素であれば、0以上d=ef未満の整数xに対する連立合同式
a=mod(x、e) b=mod(x、f) (*)
は整数xを法d=efで(0以上d未満で)一意に定める。
(B)上の連立合同式(*)に対して、その法dでの一意の解である整数xは次の式(**)で与える事ができる:
x=afF -1 +beE -1 (**)
ここでF-1は法eでfの逆数になるもの、即ちmod(F-1f、e)=1となるものであり、E-1は法fでのeの逆数、即ちmod(E-1e、f)=1となるものである。
(証明)先に(B)の形の解(**)がある事を示し、後にそれが法d=efでは一意である事を示す。(**)の式を法e、法fを取って見ると直ちに:
mod(x、e)=a, mod(x、f)=b
の成立がわかる。(A)の(*)の解がもう一つの形y:
a=mod(y、e) b=mod(y、f)
も持つとする。このとき差x-yについて
0=mod(x、e)-mod(y、e)=mod(x―y、e)
0=mod(x、f)-mod(y、f)=mod(x―y、f)
が成り立つ。故にx-yはeの倍数、かつfの倍数である。正のeとfは互いに素な(共通素因数のない)整数だから、それはx-yがef=dの倍数である事を意味し、法d=efでxとyとは同一である。(証明終)
(注1)逆数F-1とE-1について注釈する。法eの既約剰余類群の言葉を使わず説明する。整数e>0とは素な(共通因数を持たない)e未満の整数がオイラーの関数0<φ(e)<e個だけある事は既知である。大切なのはそれらの整数の積もすべて法eと素で、積に関して法eと素な整数の中(法eの既約剰余類と呼ばれる)の集合を出ない事である。このφ(e)個の整数を{i、j、…、m}と1列に並べる。これらにeとは素な(eとは共通素因数を持たない)整数fを法eで掛けた列を法eで1からe-1に引き戻した集合
{mod(if、e)、mod(jf、e)、…、mod(mf、e)}(%)
を作ると、これらは再び1以上e未満のφ(e)個の整数で、その中には必ず1が存在する。それをmod(kf,e)=1とすると、このkが法eでのfの逆数k=F-1である。F-1を求めるのには(eは単精度整数だから)列(%)を順次生成して探しても困難ではない。乱数生成機構を作成するに先立って行なえばよい。
【0005】
明快な孫子の定理は、MC乱数を考えることになって始めて、我々の認識に達した次の魔術的な補題を意味する。
(補題:2つの互いに異なる素の部分法が与える孫子縮小)法d=efは互いに素な2つの部分法e>0とf>0の積、とする。任意の整数A>0対して、
mod(eA,d)=mod(eA、ef)
=mod(e mod(A、f)、ef)
=e mod(A、f)
であって、mod(eA、)は0以上d=ef未満である。
(証明)整数A>0を整数f>0で割った等式は
A=qf+r、 qは商、rは余り、 rは0以上f未満
である。これから
mod(eA,d)=mod(eA、ef)=
mod(efq+er、ef)=er=e mod(A、f)
だから、補題が示された。(証明終り)
法d=efが互いに素な2つの部分法e>0とf>0の積であり、eとfは単精度整数の限界未満、すなわち231未満だとする。2d=2efは倍精度整数の上限値264より小さい。法dでのMC乱数列{z、z、…、z、zk+1、…}の漸化式の解は、整数単精度内の部分MC漸化式、途中に倍精度整数の積、aとa の積、bとb の積、を要するが、の解達
k+1=mod(aa 、e)
k+1=mod(bb 、f)
によって、法dで一意に
k+1 k+1 fF -1 +b k+1 eE -1 (**)
と解かれる。(孫子縮小の補題)より、
k+1=mod(f mod( k+1-1、e)、ef)+
mod(e mod( k+1-1、f)、ef)。
この右辺の内側の2つの法eと法fでのmod関数はそれぞれ、eとfと未満の正の整数を与え、外側のmod関数の内部は2ef=264を越えない。だから上のすべての計算は倍精度整数内で行なわれ、それを実数の有理数乱数とする計算も倍精度実数内で行なう事ができる。4倍精度計算を必要としないこのMC乱数生成方法は、実用計算に高速の大きな利便を与える。
【0006】
(孫子縮小)の内容は殆ど自明だが、与える便宜は魔術的で大きい。
ここではこれを用いた異なる2つの素数の積を法とするMC乱数の大きな利点の実証として、中澤直也が発見し(文献1)(文献2)で公開される優れたMC乱数生成機構#001について具体的に述べる。この乱数は2つの素数eとfとの積d=ef
d=18055400005099021、約254
を法とし、乗数
z=7759097958782935、約253
で生成される。これらの詳しい組成は(文献1)(文献2)に開示されている。下の乱数計算主プログラムと副ルーチンにも開示されるので見て頂きたい。
!#001生成機構の乱数1000万個発生主プログラム
main program
implicit integer8(i-n),real8(a-h,o-z)
common ip1,ip2,id,ad.iz1,iz2,mz1,mz2,ip2mp1,ip1mp2
ip1=134265023
ip2=134475827
id=ip1ip2 !idはおよそ254です
ad=id
iz1=19061252
iz2=77600525
n1=10 !初期値1は10です
n2=13 !初期値2は13です
ip2mp1=52577007
ip1mp2=81816271
do i=1,10000000
call random(rand)
end do
end
!#001生成機構の乱数発生副プログラム
subroutine random(rand)
implicit integer8(i-n),real8(a-h,o-z)
common ip1,ip2,id,ad.iz1,iz2,mz1,mz2,ip2mp1,ip1mp2
mz1=mod(mz1iz1,ip1)
mz2=mod(mz2iz2,ip2)
mz1a=mod(mz1ip2mp1,ip1)
mz2a=mod(mz2ip1mp2,ip2)
az=mod(ip2mz1a+ip1mz2a,id)
rand=az/ad
return
end
【0007】
#001MC乱数の前出実行プログラムが必要とするCPU時間は0.281秒/1000万個である。出力は1/d、約2-54の精度(注)だから倍精度として十分な桁数を持つ。この計算速度と倍精度とに比べる事は、#M001生成機構の持つ絶対的に不利な性能の位置を明らかにする。下は#M001で同じ1000万個の乱数を生成するプログラムである。構造は一見大変簡単である。
!#M001で1000万個を出力するプログラム
main program
implicit integer8(i-n),real8(a-g,o-p,r-z),real16(q)
ip=17179869989d0 !ipはおよそ234.00
rp=ip
iz=7928410072d0
in=10 !初期値は10
qmz=in,
do i=1,10000000
rand=mod(qmz,rp)/rp
qmz=mod(qmziz,rp)
end do
end
この簡潔なプログラムは、しかし、real16(4倍精度実数)を含むmod関数のため大幅にその計算時間を増大する。上の実行CPU時間は#001のほぼ10倍、2.625秒となる。出力される乱数精度は(注)1/d程度でほぼ2-34、周期はほぼd/2で233、このMC乱数専用にコンピュータを動かすと6分ほどで使い切られる。現在のシミュレーションに用いるには性能も精度も不足である。孫子の定理に基づく#001生成機構や、2つの異なる素数、或いは2つの素数のマイナス、で231を超えないものの積を法とするMC乱数生成機構がこの問題の現在の最適解である。
のコンピュータ上の有限長さ一様乱数を近似している。その意味ではMC乱数の数値精度として1/zを取るべきだが、MC乱数として法dで整数1からd-1までの区間内の整数を割った有理数列としては1/dの精度と考える方が(用いる周期Tによって区間内の有理数を1/Tおきに取るとしても)自然だろう。
【手続補正書】
【提出日】2022-05-31
【手続補正1】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【0001】
整数の3つ組(d、z、n)、d>0、dとは素で乗数と呼ばれるz>0、dとは素なnで初期値或いはseedと呼ばれるもの、が与える乗算合同multiplicative congruential(MC)法と呼ばれる乱数生成機構は、開区間(0、d)の整数の列{z,z,z,…}をdを法とする再帰的合同関係
=mod(n,d), zk+1=mod(zz,d)
k=1,2,…
によって生成する。即ちMC(d、z、n)乱数列は、区間(0、d)内の整数列{a=mod(nz,d)、k=0、1、2、…}を生成する。ここでmod(a、d)は整数dとは素な整数aを法dで割った余り、0とdの間の剰余、を与える関数である。開区間(0、1)内に分布したMC一様有理乱数列は
{x:=z/d| k=0,1,2,…、0<x<1}
で得られ、実際に乱数として用いられる。
【0002】
優れた乱数列を得るためには、条件を満たす任意の整数の組(d、z、n)を取ってよいわけではなく、様々な法d、乗数zを試し(検定し)それらが優れた一様独立性と見える出力を与えるものを採用する事が唯一の技術的手段である。この最も簡単で、ある意味では原始的な方法は、しかし乱数生成方法の中で最も広汎強力なもので、驚くべきことにどの様な方式に基づく有限乱数列であってもMC乱数で乗数zの逆数の精度で近似する。これは21世紀に漸く発見された事実であり、(文献1)または(文献2)を参照して頂きたい。そしてMC乱数生成方法は最も信頼性の高い検定方法を持つ事が既知である。これも参考文献に委ねて、再度の説明は省く。この様な優れたMC乱数は既に実在する。ここではそれらの実用の新しい技術を報告する。
(文献1)中澤 直也/中澤 宏:“コンピュ-タで生成する優れた乱数とは何か”、東京図書、出版予定。
(文献2)Naoya Nakazawa/Hiroshi Nakazawa:“Random Number Generators on Computers”、JENNY STANFORD、2022年出版予定。
【0003】
MC生成機構(d、z、n)を設計するとき、第一の問題は生成乱数列の周期Tである。これには種々の場合があるが、基本は法dが奇素数でzがその法で最長の周期T=(d-1)/2を与える原始根の場合であり、他のすべての場合でT/dはそれより小さくなる。シミュレーションは単一のMC乱数生成機構で行なわれなければならず、2つ以上のMC乱数生成機構は、たとえそれら個々の統計性がどんなに優れていても、相次いで或いは並列に、合成された全体乱数列の検定なしに用いる事はできない。その意味で検定を経て優良性が確認されて存在する2つの素数とそれらの原始根達の孫子の定理による組み合わせの合成MC乱数生成機構は、一様独立性の生成方式として最も有力である。整数pが奇素数、乗数zがその原始根であれば、その実際に用いる事のできる周期T=(d-1)/2は現在のシミュレーションでは240以上である事を求められるから、対応して素数pと原始根zとに基づくMC乱数生成機構はdが241以上である事を求める。即ち奇素数pと原子根zのMC乱数生成機構では法pは倍精度整数でなければならない。この事は素数の法pとその原始根zで構成されるMC乱数生成機構(p、z)の算出演算に大きな困難をもたらす。MC乱数の基本は、前段階の整数出力z=mod(nz,p)にさらにzを掛けて法pを計算する、のであるから、必ず
mod(z・z、p)、
を求めなければならない(積を表す・は今後省略する)。この途中でのzzの計算は倍精度を一時的に超えるので、用いる事が困難で計算時間を非常に多く要する4倍精度実数として計算し、整数部分を取らなければならない。しかし240程度の小さな周期ではごく短時間で使い切ってしまい、実装は効果に対して余りにも過大な負担となる。この事は後の段落で具体例で示される。
【0004】
前段落、素数の法と原始根の乗数の計算や周期の短さの困難は、MC乱数が深く考えられるようになって初めて、孫子の定理が魔術的な解決を与えていることが発見された。現在の発明はこの発見に基づくものである。理解把握から再考する様、孫子の定理の再認識から述べる。法dが2つの互いに素な2つの正整数の積d=efであるとする。孫子の定理の実現は様々な形を与えられるが、現在の議論に最も便利なのは下の(B)の形である。
(孫子の定理)(A)正の整数e、fが互いに素であれば、0以上d=ef未満の整数xに対する連立合同式
a=mod(x、e) b=mod(x、f) (*)
は整数xを法d=efで(0以上d未満で)一意に定める。
(B)上の連立合同式(*)に対して、その法dでの一意の解である整数xは次の等式(**)で与えられる:
x=mod(afF-1+beE-1、ef) (**)
ここでF-1は法eでfの逆数になるもの、即ちmod(F-1f、e)=1となるものであり、E-1は法fでのeの逆数、即ちmod(E-1e、f)=1となるものである。
(証明)先に(B)の形の解(**)は(*)を満たす事を示す。最も簡単で紛れのない初等的証明として(**)を等式で表す。(**)の右辺はd=efで割った余りなのだから、ある整数kを取って
x=afF-1+beE-1-kef
と表わす事ができる。(注2)これを法eで見ればfF-1=1となって
mod(x、e)=a
が得られる。同様に法fで見ればeE-1=1となって、
mod(x、e)=b
であるとわかる。
(A)2つの合同式(*)がもう一つの解yも持つとする:
a=mod(y、e) b=mod(y、f)
このとき差x-yについて
0=mod(x、e)-mod(y、e)=mod(x―y、e)
0=mod(x、f)-mod(y、f)=mod(x―y、f)
が成り立つ。故にx-yはeの倍数、かつfの倍数である。正のeとfは互いに素な(共通素因数のない)整数だから、それはx-yがef=dの倍数である事を意味し、法d=efでxとyとは同一である。(証明終り)
(注1)逆数F-1とE-1について詳しく述べる。整数e>0とは素な(共通因数を持たない)e未満の整数がオイラーの関数0<φ(e)<e個だけある事は既知である。大切なのはそれらの整数の積もすべて法eと素で積に関して法eの(既約剰余類)群を作る事である。このφ(e)個の整数を{i、j、…、m}と1列に並べる。これらにeとは素な(eとは共通素因数を持たない)整数fを法eで掛けた列
{mod(fi、e)、mod(fj、e)、…、mod(fm、e)}(%)
は再び1以上e未満の同じ物を含まないφ(e)個の整数で、その中には必ず1が存在する。それをmod(fk,e)=1とすると、このkが法eでのfの逆数k=F-1である。F-1を求めるには、eは単精度整数だから、(%)を順次生成して探しても困難ではない。乱数を使う前に十分時間を掛けて行なえばよい。
(注2)整数kは法d=efで割った商に当たるが、この詳細はどうでもよい。
【0005】
この明快な孫子の定理は、MC乱数を考えることになって始めて、我々の認識に達した次の魔術的な補題を意味する。
(補題:2つの互いに素な部分法が与える孫子縮小)法d=efは互いに素な2つの部分法e>0とf>0の積、とする。任意の整数A>0対して、
mod(eA,d)=mod(eA、ef)
=mod(e mod(A、f)、ef)
=e mod(A、f)
0<mod(eA、f)<ef=d
および0<mod(fB,d)<efが成り立つ。
(証明)整数A>0を整数f>0で割った等式は
A=Qf+R、 Qは商、Rは余り、 0<R<f
である。これから直ちに補題が従う。同様の証明は明らかに
0<mod(fB,d)<ef
についても成り立つ。(証明終り)
法d=efが互いに素な2つの部分法e>0とf>0の積であり、eとfは単精度整数の限界未満、すなわち232未満だとし、2d=2efは倍精度整数の上限値264より小さいと仮定する。法dでのMC乱数列{z、z、…、z、zk+1、…}の漸化式の解は、整数単精度内の部分MC漸化式、途中に倍精度整数の積aa、bb、を要するが、の解達
k+1=mod(aa、e)
k+1=mod(bb、f)
によって
k+1=mod(mod(ak+1fF-1、e)+
mod(bk+1eE-1、f))、ef) (**)
と解かれる。(孫子縮小の補題)より、
k+1=mod(f mod(ak+1-1、e)+
e mod(bk+1-1、f)、ef)
である。この右辺の内側の2つのmod関数、法eと法fでのmod関数、はそれぞれfとeと未満の正の整数を与え、外側のmod関数の内部は2ef=264を越えない。だから上のすべての計算は倍精度整数内で行なわれ、それを実数の有理数乱数とする計算も倍精度実数内で行なう事ができる。4倍精度計算を必要としないこのMC乱数生成方法は、実用に高速の大きな利便を与える。
【0006】
用いられた(孫子の縮小)の内容は殆ど自明だが、与える技術便宜は魔術的で大きい。ここではこれを用いた異なる2つの素数の積を法とするMC乱数の大きな利点の実証として、良い機会なので、中澤直也が発見し(文献1)(文献2)で公開された優れたMC乱数生成機構#001について具体的に述べる。この乱数は2つの素数eとfの積d=ef
d=18055400005099021、約254
を法とし、乗数
z=7759097958782935、約252.78
で生成される。これらの詳しい組成は(文献1)(文献2)に開示されていて、下の乱数計算mainプログラムとsubroutineも見て頂きたい。
#001生成機構の乱数発生main program
#001生成機構の乱数発生subroutnine
【0007】
前掲のプログラムが必要とするCPU時間は0.281秒/1000万個である。出力は1/d、約2-54の精度だから倍精度実数として十分な桁数を持つ。この計算速度と倍精度とに比べる事は、次の#M001生成機構の持つ絶対的な性能の位置を与える。下は#M001で同じ1000万個の乱数を生成するプログラムである。構造は一見大変簡単である。
#M001で1000万個を出力するプログラム
この簡潔なプログラムは、しかし、real16(4倍精度実数)を含むmod関数の計算時間を大幅に増大させる。上のプログラムの実行CPU時間は#001のほぼ10倍、2.625秒となる。出力される乱数精度は1/d程度ほぼ2-34、周期はほぼd/2で233、このMC乱数専用にコンピュータを動かすと6分ほどで使い切られる。現在のシミュレーションに用いるには性能も精度も不足である。孫子の定理に基づく#001生成機構や、2つの異なる素数、或いは2つの素数のマイナス、で231を超えないもの積を法とするMC乱数生成機構がこの問題の現在の最適解である。
【技術的展望】
【0008】
孫子の定理は一般にk個、k>2、の互いに素な正の数の積の法についても成り立つので、2個の積d=efに限るものではない。だから、3個以上の部分法を持つものでも考える事ができる。ただその様な場合に数値的に倍精度計算だけへの設計をどの様に選ぶべきか、撰ぶ事ができるか、は大きな問題である。それは必然的に2成分のd=efの場合よりは複雑な考察を要するだろう。2成分の場合がきれいな構成を得て倍精度整数演算、倍精度実数演算だけで実現している事実、多分この構成が部分法での成功を最も得やすい形ではないかという予感、からは発明者達はこのより進んだ形は将来への課題ではないか、より大きな乱数周期への需要、より多い桁数精度の必要の生起、を見れば自然に得られるのでははないか、と考える。
【手続補正2】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項1】
2つの共通素因数を持たない、即ち互いに素な、正の整数eとfの積であるd=efを法とし、dとは素な乗数z、dとは素なseed種nで構成される乗算合同法乱数生成機構(d、z、n)において、整数の任意に与えられた初期値nから順次得られる漸化合同式による一様独立乱数{v:=z/d|k=0、1、2、…}を得るための正の整数列{z|k=0、1、2、…}、
=mod(n、d)、
k+1=mod(zz、d)、 k=0、1、2、…、
を得る計算方法であって、孫子の定理の一つの形,部分法eとfだけに対する成分
x:=mod(z,e)、
:=mod(z,e)、k=0、1、2、…、
y:=mod(z,f)、
:=mod(z,f)、k=0、1、2、…、
a:=mod(n,e)
b:=mod(n,f)
を用いて定義される2組のMC部分乱数列、MC生成機構(e、x、a)からの法eの合同漸化式の解
=mod(a、e)、
k+1=mod(xx、e)、 k=0、1、2、…、
及びMC生成機構(f、y、b)からの法fの合同漸化式の解
=mod(b、f)、
k+1=mod(yy、f)、 k=0、1、2、…、
から得られる一次結合{z|k=0、1、2、…}:
:=mod{f mod(x-1、e)+
e mod(y-1、f)、ef}、
-1:は法eでのfの逆数、 0<F-1<e、
-1:は法fでのeの逆数、 0<E-1<f、
で与えてよい、という形の孫子の定理に基づき、さらに任意の正の整数A、Bに対する関係
mod(eA,ef)=mod(e mod(A、f)、ef)、
mod(fB,ef)=mod(f mod(B、e)、ef)、
によって、2d=2efが倍精度整数限界264未満の場合に、すべての演算を倍精度整数、倍精度実数だけの範囲内で正確高速に実現する計算方法。
【手続補正書】
【提出日】2022-06-03
【手続補正1】
【補正対象書類名】明細書
【補正対象項目名】0004
【補正方法】変更
【補正の内容】
【0004】
前段落、素数の法と原始根の乗数の計算や周期の短さの困難は、MC乱数が深く考えられるようになって初めて、孫子の定理が魔術的な解決を与えていることが発見された。現在の発明はこの発見に基づくものである。理解、把握から再考する様、孫子の定理のmod関数を用いた形から述べる。法dが2つの互いに素な2つの正整数の積d=efであるとする。孫子の定理の実現には様々な形を与えられるが、現在の議論に最も便利なのは下の(B)の形である。
(孫子の定理)(A)正の整数e、fが互いに素であれば、0以上d=ef未満の整数xに対する連立合同式
a=mod(x、e) b=mod(x、f) (*)
は整数xを法d=efで(0以上d未満で)一意に定める。
(B)上の連立合同式(*)に対して、その法dでの一意の解である整数xは次の等式(**)で与えられる:
x=mod(afF-1+beE-1、ef) (**)
ここでF-1は法eでfの逆数になるもの、即ちmod(F-1f、e)=1となるものであり、E-1は法fでのeの逆数、即ちmod(E-1e、f)=1となるものである。(注1)(証明)先に(B)の形の解(**)は(*)を満たす事を示す。最も紛れのない初等的証明として(**)を等式で表す。(**)の右辺はd=efで割った余りなのだから、ある整数kを取って
x=afF-1+beE-1-kef
と表わす事ができる。(注2)これを法eで見ればmod(fF-1、e)=1となって mod(x、e)=a
が得られる。同様に法fで見ればmod(eE-1、f)=1となって、
mod(x、f)=b
であるとわかる。
(A)2つの合同式(*)がもう一つの解yも持つとする:
a=mod(y、e) b=mod(y、f)
(*)とこの式とは次の等式をある整数j、k、p、qに対して意味する。
x=a+je、y=a+ke
x=b+pf、y=b+qf
これらはまず等式x-y=(j-k)eを与える。即ちx-yはeの倍数である。同様にx-y=(p-q)f、x-yはeとは素なfの倍数でもあって、xとyは法dで同一である。
(証明終り)
(注1)逆数E-1とF-1について説明する。整数e>0とは素な任意の正の整数xをeで割るとき、その余りは1からe-1までの中にある。その総個数はオイラーの関数φ(e)と呼ばれ、1からeまでの整数からeと共通な素因数を持つものを除いた個数、であり1<φ(e)<eだが、これらの詳細はどうでもよい。これらを1列に、例えば昇順に
{1、a、b、…、f、…、e-1} ($)
と並べる。これらの中の任意の整数xをfに法eで掛けたものの列
{x、mod(ax、e)、mod(bx、e)、…、
mod(fx、e)、…,mod((e-1)x)} (#)
を考えると、これらは法eですべて異なる整数である。実際帰謬法で仮に
A=mod(px、e)=mod(qx、e)
となると仮定すると、px=A+je,qx=A+keとなる整数j、kがある事から
px-qx=(p-q)x=(k-j)e
でなければならず、xはeとは共通素因数を持たないからp-qがeの倍数でなければならない、即ちpとqが法eで等しくなければならない矛盾に至るからである。故に(#)は元の($)の並べ替え(順列)であり、($)の中には必ずmod(xf、e)=1となるものがある、このxがfの法eでの逆数F-1である。fの法eでの逆数F-1を求めるには、e、fは単精度整数だから、
mod(f、e)、mod(fa、e)、
mod(fb、e)、 ...、mod(f(e-1)、e)
を順次生成して探しても困難ではない。乱数を使う前に十分時間を掛けて求めればよい。(注2)整数kは法d=efで割った商に当たるが、この詳細はどうでもよい。
【手続補正書】
【提出日】2022-06-08
【手続補正1】
【補正対象書類名】明細書
【補正対象項目名】0006
【補正方法】変更
【補正の内容】
【0006】
用いられた(孫子の縮小)の内容は殆ど自明だが、与える技術便宜は魔術的で大きい。ここではこれを用いた異なる2つの素数の積を法とするMC乱数の大きな利点の実証として、良い機会なので、中澤直也が発見し(文献1)(文献2)で公開された優れたMC乱数生成機構#001について具体的に述べる。この乱数は2つの素数eとfの積d=ef
d=18055400005099021、約254
を法とし、乗数
z=7759097958782935、約252.78
で生成される。これらの詳しい組成は(文献1)(文献2)に開示されていて、下の乱数計算mainプログラムとsubroutineも見て頂きたい。
#001生成機構の乱数発生main program
main program
implicit integer8(i-n),real8(a-h,o-z)
common ip1,ip2,id,ad,iz1,iz2,mz1,mz2,ip2mp1,ip1mp2
ip1=134265023
ip2=134475827
id=ip1ip2 !idはおよそ254です
ad=id
iz1=19061252
iz2=77600525
n1=10 !初期値1は10です
n2=13 !初期値2は13です
ip2mp1=52577007
ip1mp2=81816271
mz1=mod(n1,ip1)
mz2=mod(n2,ip2)
do i=1,10000000
call random(rand)
end do
end
#001生成機構の乱数発生subroutnine
subroutine random(rand)
implicit integer8(i-n),real8(a-h,o-z)
common ip1,ip2,id,ad,iz1,iz2,mz1,mz2,ip2mp1,ip1mp2
mz1=mod(mz1iz1,ip1)
mz2=mod(mz2iz2,ip2)
mz1a=mod(mz1ip2mp1,ip1)
mz2a=mod(mz2ip1mp2,ip2)
az=mod(ip2mz1a+ip1mz2a,id)
rand=az/ad
return
end
【手続補正2】
【補正対象書類名】明細書
【補正対象項目名】0007
【補正方法】変更
【補正の内容】
【0007】
前掲のプログラムが必要とするCPU時間は0.281秒/1000万個である。出力は1/d、約2-54の精度だから倍精度実数として十分な桁数を持つ。この計算速度と倍精度とに比べる事は、次の#M001生成機構の持つ絶対的な性能の位置を与える。下は#M001で同じ1000万個の乱数を生成するプログラムである。構造は一見大変簡単である。
#M001で1000万個を出力するプログラム
main program
implicit integer8(i-n),real8(a-g,o-p,r-z),real16(q)
ip=17179869989d0 !ipはおよそ234.00
rp=ip
iz=7928410072d0
in=10 !初期値は10
qmz=in
do i=1,10000000
rand=mod(qmz,rp)/rp
qmz=mod(qmziz,rp)
end do
end
この簡潔なプログラムは、しかし、real16(4倍精度実数)を含むmod関数の計算時間を大幅に増大させる。上のプログラムの実行CPU時間は#001のほぼ10倍、2.625秒となる。出力される乱数精度は1/d程度ほぼ2-34、周期はほぼd/2で233、このMC乱数専用にコンピュータを動かすと6分ほどで使い切られる。現在のシミュレーションに用いるには性能も精度も不足である。孫子の定理に基づく#001生成機構や、2つの異なる素数、或いは2つの素数のマイナス、で231を超えないもの積を法とするMC乱数生成機構がこの問題の現在の最適解である。