TOP特許意匠商標
特許ウォッチ Twitter
公開番号2025168621
公報種別公開特許公報(A)
公開日2025-11-11
出願番号2024082202
出願日2024-04-29
発明の名称2個以上の互いに素な正で奇数の単精度整数の積を法とする乗算合同法乱数の,孫子の定理の構造を利用する倍精度整数演算だけによる『再現可能性と移植可能性』を保つ生成と、実倍精度演算だけによる乱数出力計算と、が可能な高速MC乱数生成計算方式。
出願人個人
代理人
主分類G06F 7/58 20060101AFI20251104BHJP(計算;計数)
要約【課題】倍精度整数と倍精度実数の算法のみで、倍精度実数乱数を高速に生成する方法を提供する。
【解決手段】方法は、2個以上m個の共通素因数を持たない、即ち互いに素な、正の整数e1、e2、…、emの積である正の整数d=e1e2…emを法とし、『e1、e2、…、emは単精度整数』であると仮定し、dとは素な正の乗数z<d、dとは素な正の種n<dを用い、構成される乗算合同(MC)法乱数生成機構(d、z、n)において、与えられた初期値nから順次得られる漸化合同式による正でd未満の整数列{x(t)|t=0、1、2、…}を得る
但し、
x(0)=mod(n、d)、x(t+1)=mod(zx(t)、d)、t=0、1、…、による一様独立乱数列{v(t):=x(t)/d|t=0、1、2、…}
【選択図】なし
特許請求の範囲【請求項1】
正の法dでのmod関数mod(A、d)を0または正の整数Aに対して
mod(A、d)=『Aをdで割った整数の余りr、
rは0以上d未満』
と定義し、2個以上m個の共通素因数を持たない、即ち互いに素な、正の整数e

、e

、…、e

の積である正の整数d=e



…e

を法とし、『e

、e

、…、e

は単精度整数』であると仮定し、dとは素な正の乗数z<d、dとは素な正の種n<dを用い、構成される乗算合同(MC)法乱数生成機構(d、z、n)において、与えられた初期値nから順次得られる漸化合同式による正でd未満の整数列{x
(t)
|t=0、1、2、…}、但し

(0)
=mod(n、d)、

(t+1)
=mod(zx
(t)
、d)、t=0、1、…、
による一様独立乱数列{v
(t)
:=x
(t)
/d|t=0、1、2、…}を得る計算方法であって、孫子の定理の一つの形,部分法e

、e

、…、e

ぞれぞれだけに対する部分MC(e

、z

、n

)生成機構、即ち部分漸化合同式


(0)
=mod(n

、e

)、x

(t+1)
=mod(z



(t)
、e

)、
k=1、2、…、m、t=0、1、…、


:=mod(z,e

)、k=1、2、…、m、


:=mod(n,e

)、k=1、2、…、m、
が与える部分MC乱数列
{x

(t)
|k=1、2、…m、t=0、1、2、…}
を用い、互いに素な部分法e

、e


発明の詳細な説明【技術分野】
【0001】
互いに素な(共通素因数を持たない、最大公約数1の)正の奇数
m個、mは2以上、の組e

、e

、…、e

の積d、
d=e



…e

、($)
を法とする乗算合同multiplicative congruential(MC)法乱数生成機構(d、z、n)、即ち法d>0、dとは素で『乗数』と呼ばれる正でd未満の整数z、dとは素で『初期値或いは種或いはseed』と呼ばれる正でd未満の整数n、が与える乗算合同(MC)法乱数生成機構は、開区間(0、d)内の整数の列{z

,z

,z

,…}をdを法とする再帰的合同関係


=mod(n、d)、

k+1
=mod(z×z

、d)、k=0、1、2、… (¥)
で生成する。よく知られたmod関数の定義は、すぐ下に紛れなく定義し、乗法の記号×は今後省略する。ここに述べる発明は、MC法に必ず用いられる合同算法(¥)の形の法dの計算が孫子の定理の下で持つ重要な構造の指摘である。この利用方法の必要は乱数問題での素数の性質に関係する。シミュレーション問題が必要とする乱数列は見本過程だから、統計的一様独立性は『その様に見える』という事、仮説検定の問題である。本格的なMC乱数生成方法はFishmanとMooreの有名な素数、整数単精度限界に近いメルセンヌ素数2
31
-1の利用に始まる。彼らの行った検定が示す事は、『よい性能と見える』MC乱数生成機構の法を与え得る素数は整数単精度限界2
32
に近い大きさが必要だという経験である。この詳細は(文献1)を見て頂きたい。大きさが小さいと検定で『適格』と看做さる乱数の発見は難しい。さらにシミュレーションの経験は、『倍精度実数計算』でなければ十分な精度は得られない、乱数周期もそれに相応しい巨大さでなければならない。これらに適合する乱数を構成する道は、2つ以上の単精度限界に近い素数の積を法とする事である。この、(¥)の形のMC乱数にはシミュレーションの要請から単精度限界に近い2つ以上の部分法の積である法dが必要である事情、の説明から始める。
(文献1)Naoya Nakazawa/Hiroshi Nakazawa: “Random Number Generator on Computers”、JENNY STANFORD、校正刷段階のものを添付する。
まもなく出版予定。
続きを表示(約 8,300 文字)【0002】
実倍精度MC乱数生成機構の技術設計の実際的可能性は
(1)1つの巨大な奇素数の法d=pの場合、
(2)2以上のm個の『互いに異なる大きい奇素数の積』d=p



…p

の場合、
の2つに大別される。計算実現の容易な場合として、上の(2)でm=2の奇素数の積の法dの場合、単精度整数である奇素数p

とp

が条件『積の2倍、2d=2p



、が倍精度用整数2
64
限界未満を満たす場合』は特願2022-024277として出願され、審査中である。ここでは『積の個数mが2以上任意である場合』への一般化、
『互いに素な部分法e

、e

、…、e

には異なる単精度の
素数(従って互いに素)である以外の条件を付けない』
を可能とする新しい技術を述べる。まず(1)の場合が技術的に適さない理由を説明する。現在コンピュータシミュレーションで多く必要になるのは倍精度実数計算である。それに適合する倍精度実数乱数をMC法で1つの素数の法d=pで与え、しかも乱数周期を通常のシミュレーションに不足しないほど巨大にするには、大きさが2
64
程度、倍精度整数、の巨大な法d=pや乗数zが必要になる。しかしMC乱数数列{z

、z

、z

、…}の算出の各段階では法dの合同漸化式

k+1
=mod(z×z

,d) (*)
の計算が必要で(乗法記号×は以後省略する)、z

が倍精度整数であるとこの掛け算部分はどうしても4倍精度実数による算術を経なければならず、それは大幅な(10倍程度以上もの)計算時間の増大を招き、しかも現在(2024年)までに発見されたMC乱数生成機構の優れた素数の法の最大周期は2
34
程度で、実用シミュレーションには短かすぎ、効果に対して算出の負担は過大である。
【0003】
前段落に指摘された困難を避ける道は、法dがm個の『単精度整数限界内』の大きさの奇素数m個
(注1)


、e

、…、e

の積での形
d=e



…e

を採用する事であり、さらに『各部分法が与える単精度整数部分MC乱数生成機構に倍精度整数高速演算を可能にし、再現可能性も移植可能性も確保する』事である。前出願ではシミュレーション用の倍精度実数乱数出力が『m=2で、かつd=e



の2倍が倍精度整数限界内に留まる』条件を満たす場合について、『倍精度整数演算だけを用いる方法』でこの『再現可能性と移植可能性とを持つ高速MC実倍精度乱数生成機構』を得た。ここでは倍精度『実数』演算も用いて再現可能性と移植可能性を確保する方法を『部分単精度整数の法の個数mが制限を持たない形』に提示したい。
【0004】
まず正整数の法dと正の整数Aを念頭において、以後多用されるmod関数mod(A、d)の定義を紛れなく準備する。
(定義1)0以上の正の整数Aと正整数の法dに対するmod(A、d)は『Aから法である正の整数dの整数商q倍を除いて得られる0以上d未満の整数の余りである』と定義する。割り算の等式で言えば、
A=qd+r、 rは0以上d未満の整数、
に基づいて、mod(A、d)=rと定義する。(定義1終り)
実用コンピュータ計算では用いる事の可能な数全体に単精度、倍精度、4倍精度などの区別が厳しいが、議論の上ではいずれでも(定義1)を用いる事ができる。また計算諸言語では、変数Aや法dが実数であっても(定義1)と同じ形に定められる定義でのmod関数も既に実装されている。ここでは計算速度の考察が4倍精度計算を必要としない形の技術を必須とするが、それは計算プログラムの構成で述べるので、mod関数はすべて上の(定義1)による、とする。大切なのは現在の問題状況に見事に適合している孫子の定理の理解である。
(定理2.孫子の定理)整数の法d>0が正で互いに素な(最大公約数1の)整数の積d=e



…e

の形、mは2以上、だとする。『任意の正の整数A』は
A=A





-1
+A





-1
+…+A





-1



=mod(A、e

)、A

は0以上e

未満、
k=1、2、…、m (*)
の形に分解され、『法dで一意に』定まる。但しD

=d/e

、D

-1
は法e

でのD

の正の逆数であって
mod(D



-1
、e

)=δ
jk
(#)
が成り立つ。ここでδ
jk
はクロネッカーのデルタでj=kなら1、そうでなければ0である。
(証明)e

、e

、…、e

が互いに素、すなわち最大公約数が1だから、e

を考えるとe

と残りの部分法の積を表すD

=e/e

とは互いに素である。故にユークリッドの互除法の結論、整数MとNがあって最大公約数1を次の『等式』で与えられ、
MD

+Ne
【0005】
互いに素な正の部分法m個の積d=e



…e

を法とするMC乱数の構造を考える。部分法の表記のために(d、z、n)が生成するMC乱数列を一般に
{z
(t)
=mod(nz

、d)| t=0,1、2、…、}
と表す;jは見難いので、一般的に時刻と考えてtを用いる。これは或いは漸化式形式で

(0)
=mod(n、d)、

(t+1)
=mod(zz
(t)
、d)、t=0、1、2、…(#1


とも記す。法dが互いに素な正の部分法による形d=e



…e

を持つとき、
部分乗数、部分出発値を
部分乗数:{z

= mod(z、e

)、k=1、2、…、m}、
部分初期値:{n

= mod(n、e

)、k=1、2、…、m}。
と定義する。これらが定める『部分e

のMC乱数生成機構』を
{(e

、z

、n

)|k=1、2、…、m}
と記し、それらが生成する『MC部分整数乱数列』を
{mod(n

(z



、e

)、t=0,1、2、…、
k=1、2、…、m}(#2)
或いは漸化式形式で


(0)
=mod(n

、e

)、


(t+1)
=mod(z



(t)
、e

)、
t=0、1、2、…、k=1、2、…、m(#2
【0007】
(d、z、n)MC乱数の生成の技術として第一の鍵は、法d=e



…e

の奇数の部分法e

、e

、…、e

を整数単精度で互いに素に選ぶ事である。これによって『部分MC乱数生成機構
{(e

、z

、n

)|k=1,…、m}
の個数mには制限がなくなる』。この場合部分乱数の生成は『倍精度整数演算だけ』を用いて『再現可能かつ移植可能』に行う事ができる。それらの孫子の定理による(d、z、n)MC乱数出力への合成は、再現可能性を考える必要がないので倍精度実数として行う事によって、幾つかの困難を減らし、しかも高速に実現される。これが現在の出願の骨子である。但し法dの大きさにはやはり制限が残り、個数mも現実的に考えて2ないし3が可能限界であろう。例えば4倍精度実数として計算するにしても、dは2
128
を越える使い方はできないし、限界に近い使い方では計算中に大きさが限界に達する不安は残る。実数でも規格を目いっぱい使う事は困難である。ただ漸化式のz×z
(t)
を小さい部分法で倍精度整数内で行う事は確かに可能性を広げている。次の段落でその実際プログラムを、m=3の場合で例示し、どの計算段階が新しい工夫であるかを明確に示す。
【0008】
異なる3個の素数e

、e

、e

を用いる法d=e





による乱数MC計算プログラムをFORTRAN形式で次ページ図1として掲げる。但しこのMC乱数の統計性能は優れたものではないので御了解頂きたい。現在の視点から最も分りやすい表記を目指し、プログラムの中に変数の単、倍、4倍などの大きさの種別を詳しく記す。まず生成速度を実測する。
図1.m=3個の素数の積の法d=e





で1000万個の
乱数を発生するメインプログラム
program main
implicit integer

8(i-p),real

8(a-h,r-z)
common p1,p2,p3,d,iz1,iz2,iz3,d1,d2,d3,invd1,invd2,invd3
p1=134265023! p1はおよそ2

(27)の素数単精度整数
p2=1000919 ! p2はおよそ2

(20)の素数単精度整数
p3=257 ! p3はおよそ2

(8)の素数単精度整数
num=10000000!発生させる乱数の個数を設定
!d:=p1

p2

p3 ! 法dはおよそ2

(54.94)の整数
d1=p2

p3 ! D1:=d/p1(倍精度実数)
d2=p3

p1 ! D2:=d/p2(倍精度実数)
d3=p1

p2 ! D3:=d/p3(倍精度実数)
d=p1

p2

p3 ! d=p1

p2

p3(倍精度実数)
iz1=19061252!p1の原始根iz1
iz2=64545 !p2の原始根iz2
iz3=53 !p3の原始根iz3
invd1=38789367 !invd1:=mod(D1

(-1),p1)
invd2=388498 !invd2:=mod(D2

(-1),p2)
invd3=83 !invd3:=mod(D3

(-1),p3)
n1=1 !法p1での部分MC初期値
n2=1 !法p2での部分MC初期値
【0009】
前段落[0008]と同じ法d=e





で、部分法に分解することなく4倍精度実数演算で直接乗算を行う原始的な方法のプログラムを次の図3に掲げる。
図3.法dでの4倍精度実数乗算による方法のプログラム
program main
implicit interger

8(i-p),real

8(a-h,r-z),real

16(q)
num=10000000!発生させる乱数の個数を設定
p1=134265023! p1はおよそ2

(27)の素数単精度整数
p2=1000919 ! p2はおよそ2

(20)の素数単精度整数
p3=257 ! p3はおよそ2

(8)の素数単精度整数
!d:=p1

p2

p3 ! 法dはおよそ2

(54.94)の整数
qd=p1

p2

p3 ! qd=p1

p2

p3(4倍精度実数)
qz=1950909605842899d0!qz:乗数(4倍精度実数)
qmz=1 !法dでのMC乱数列(4倍精度実数)、初期値は1
!乱数をnum=1000万回呼び発生出力させる
do i=1,num
qmz=mod(qmz

qz,qd)!法dでのMC乱数列(4倍精度実数)
rand=qmz/qd !出力
end do
end
(図3.終り)
このプログラムで上の図1および図2と同じ出力結果が得られることが確認できる。図3は法dでの乗算を単純に繰り返すだけなので、プログラム構造としては一見簡単である。しかし、CPU時間はおよそ2.7秒/1000万個で、図2のサブルーチンと比べ10倍近い時間を要する。このことは、本発明で提示される、孫子の定理の構造を利用して倍精度整数と倍精度実数のみによる生成方式を実用にすべき一つの重大な理由である。さらに、本発明の生成方式は、2
64
を超える合成数の法dでのMC乱数列出力を『倍精度実数演算のみ』で実現しうるものでもあり、単純な4倍精度乗算を用いるだけの方式と比べて、可能性と発展性が大きい。
【0010】
乱数をシミュレーションやゲームなどのソフトウェアで実際に利用することを念頭に置いて、一つのプログラム例を挙げる。下の図4は、原始的で簡単ながら指定した個数だけ乱数を発生させるメインプログラムである。
図4.乱数をnum個だけ発生させるメインプログラム
program main
implicit integer

8(i-p),real

8(a-h,r-z)
common p1,p2,p3,d,iz1,iz2,iz3,d1,d2,d3,invd1,invd2,invd3
num=10 ! 発生させる乱数の個数
p1=134265023! p1はおよそ2

(27)の素数単精度整数
p2=1000919 ! p2はおよそ2

(20)の素数単精度整数
p3=257 ! p3はおよそ2

(8)の素数単精度整数
d=p1

p2

p3 ! 法dはおよそ2

(54.94)の整数
d1=p2

p3 ! D1:=d/p1(倍精度実数)
d2=p3

p1 ! D2:=d/p2(倍精度実数)
d3=p1

p2 ! D3:=d/p3(倍精度実数)
iz1=19061252!p1の原始根
iz2=64545 !p2の原始根
iz3=53 !p3の原始根
invd1=38789367 !invd1:=mod(D1

(-1),ip1)
invd2=388498 !invd2:=mod(D2

(-1),ip2)
invd3=83 !invd3:=mod(D3

(-1),ip3)
n1=10 !法p1での部分MC初期値
n2=22 !法p2での部分MC初期値
n3=41 !法p3での部分MC初期値
mz1=mod(n1,p1)!法p1での部分MC乱数列の初期設定
mz2=mod(n2,p2)!法p2での部分MC乱数列の初期設定
mz3=mod(n3,p3)!法p3での部分MC乱数列の初期設定
!倍精度整数mz1,mz2,mz3は乱数発生の度に値が更新される
!randgenerateサブルーチンを呼び、乱数をnum個発生させる
!引数mz1、mz2、mz3にはnum番目の各部分法MC乱数(倍精度整数)が保存され
!次の乱数生成に引き継ぎが可能
call randgenerate(mz1,mz2,mz3,num)!randgenerateサブルーチン(図5)
end
(図4.終り)
基本構造としては、前段落の図2のメインプログラムと同様である。ただし、シミュレーションやゲームなどのプログラム開発を想定して、『必要な個数だけ』の乱数生成をサブルーチンとして随時呼び出せるように手を加えている。乱数を任意のnum個だけ発生させるサブルーチンを図5に掲げる。
図5.乱数をnum個だけ発生させるサブルーチン
subroutine randgenerate(mz1,mz2,mz3,num)
implicit integer


特許ウォッチbot のツイートを見る
この特許をJ-PlatPat(特許庁公式サイト)で参照する

関連特許

個人
詐欺保険
28日前
個人
縁伊達ポイン
28日前
個人
5掛けポイント
4日前
個人
RFタグシート
15日前
個人
QRコードの彩色
1か月前
個人
ペルソナ認証方式
12日前
個人
地球保全システム
1か月前
個人
情報処理装置
7日前
個人
自動調理装置
14日前
個人
残土処理システム
1か月前
個人
農作物用途分配システム
27日前
個人
表変換編集支援システム
2か月前
個人
知的財産出願支援システム
1か月前
個人
インターネットの利用構造
11日前
個人
タッチパネル操作指代替具
21日前
個人
携帯端末障害問合せシステム
20日前
個人
行動時間管理システム
2か月前
個人
パスワード管理支援システム
2か月前
個人
スケジュール調整プログラム
20日前
個人
システム及びプログラム
1か月前
株式会社キーエンス
受発注システム
1か月前
株式会社キーエンス
受発注システム
1か月前
株式会社キーエンス
受発注システム
1か月前
個人
海外支援型農作物活用システム
1か月前
個人
AIキャラクター制御システム
2か月前
個人
食品レシピ生成システム
1か月前
個人
エリアガイドナビAIシステム
12日前
個人
SaaS型勤務調整支援システム
2か月前
大同特殊鋼株式会社
疵判定方法
1か月前
キヤノン株式会社
印刷システム
20日前
株式会社ケアコム
項目選択装置
7日前
トヨタ自動車株式会社
通知装置
18日前
キヤノン株式会社
情報処理装置
5日前
株式会社ケアコム
項目選択装置
7日前
株式会社ワコム
電子ペン
6日前
個人
音声対話型帳票生成支援システム
2か月前
続きを見る