(57)【特許請求の範囲】
【請求項１】
２進数で表現された乱数の各桁の値を要素に含む第１列を得る乱数取得部と、
前記第１列と、正の整数ｉに対して広義単調増加の関係にある個数の下位ｊ桁の要素が１であって残りの桁の要素が０である２進数で表現された第２列と、の要素単位の論理積演算結果である第３列を得る論理積演算部と、
前記第３列によって表される値がｉよりも大きい場合に、前記乱数取得部および前記論理積演算部の処理を再び実行させ、前記第３列によって表される値がｉ以下の場合に、ｉを増加させてから前記乱数取得部および前記論理積演算部の処理を実行させる制御部と、
を有し、
前記制御部は、前記第３列によって表される値がｉ以下の場合にｉの値を増加させ、２進数で表現されたｉの各桁の値を要素とする第４列と前記第２列との要素単位の論理和演算結果を新たな前記第２列とし、前記乱数取得部および前記論理積演算部の処理を実行させる、乱数生成装置。
【請求項２】
請求項１の乱数生成装置であって、
前記制御部は、前記第３列によって表される値がｉ以下の場合にｉの値を１増加させ、ｉの値を１増加させるたびに、２進数で表現されたｉの各桁の値を要素とする第４列と前記第２列との要素単位の論理和演算結果を新たな前記第２列とし、前記乱数取得部および前記論理積演算部の処理を実行させる、乱数生成装置。
【請求項３】
２進数で表現された乱数の各桁の値を要素に含む第１列を得る乱数取得部と、
前記第１列と、正の整数ｉに対して広義単調増加の関係にある個数の下位ｊ桁の要素が１であって残りの桁の要素が０である２進数で表現された第２列と、の要素単位の論理積演算結果である第３列を得る論理積演算部と、
前記第３列によって表される値がｉよりも大きい場合に、前記乱数取得部および前記論理積演算部の処理を再び実行させ、前記第３列によって表される値がｉ以下の場合に、ｉを増加させてから前記乱数取得部および前記論理積演算部の処理を実行させる制御部と、
を有し、
前記制御部は、前記第３列によって表される値がｉ以下の場合にｉの値を１増加させ、ｉの値を１増加させるたびに、２進数で表現されたｉの各桁の値を要素とする第４列と前記第２列との要素単位の論理和演算結果を新たな前記第２列とし、前記乱数取得部および前記論理積演算部の処理を実行させる、乱数生成装置。
【請求項４】
請求項１から３の何れかの乱数生成装置であって、
ｊは１＋ｌｏｇ２  ｉ以下の最大の整数であり、
前記制御部は、ｉがメルセンヌ数であると判定した場合にｉを増加させて前記乱数取得部および前記論理積演算部の処理を実行させる、乱数生成装置。
【請求項５】
２進数で表現された乱数の各桁の値を要素に含む第１列を得る乱数取得部と、
前記第１列と、正の整数ｉに対して広義単調増加の関係にある個数の下位ｊ桁の要素が１であって残りの桁の要素が０である２進数で表現された第２列と、の要素単位の論理積演算結果である第３列を得る論理積演算部と、
前記第３列によって表される値がｉよりも大きい場合に、前記乱数取得部および前記論理積演算部の処理を再び実行させ、前記第３列によって表される値がｉ以下の場合に、ｉを増加させてから前記乱数取得部および前記論理積演算部の処理を実行させる制御部と、
を有し、
ｊは１＋ｌｏｇ２  ｉ以下の最大の整数であり、
前記制御部は、ｉがメルセンヌ数であると判定した場合にｉを増加させて前記乱数取得部および前記論理積演算部の処理を実行させる、乱数生成装置。
【請求項６】
請求項１から５の何れかの乱数生成装置であって、
ｎは２以上の整数であり、
前記制御部は、１≦ｉ＜ｎの各ｉについて前記乱数取得部および前記論理積演算部の処理を実行させる、乱数生成装置。
【請求項７】
乱数取得部が、２進数で表現された乱数の各桁の値を要素に含む第１列を得る乱数取得ステップと、
論理積演算部が、前記第１列と、正の整数ｉに対して広義単調増加の関係にある個数の下位ｊ桁の要素が１であって残りの桁の要素が０である２進数で表現された第２列と、の要素単位の論理積演算結果である第３列を得る論理積演算ステップと、
前記第３列によって表される値がｉよりも大きい場合に、前記乱数取得ステップおよび前記論理積演算ステップの処理を再び実行させ、前記第３列によって表される値がｉ以下の場合に、ｉを増加させてから前記乱数取得ステップおよび前記論理積演算ステップの処理を実行させる制御ステップと、を有し、
前記制御ステップは、前記第３列によって表される値がｉ以下の場合にｉの値を増加させ、２進数で表現されたｉの各桁の値を要素とする第４列と前記第２列との要素単位の論理和演算結果を新たな前記第２列とし、前記乱数取得ステップおよび前記論理積演算ステップの処理を実行させる、乱数生成方法。
【請求項８】
乱数取得部が、２進数で表現された乱数の各桁の値を要素に含む第１列を得る乱数取得ステップと、
論理積演算部が、前記第１列と、正の整数ｉに対して広義単調増加の関係にある個数の下位ｊ桁の要素が１であって残りの桁の要素が０である２進数で表現された第２列と、の要素単位の論理積演算結果である第３列を得る論理積演算ステップと、
前記第３列によって表される値がｉよりも大きい場合に、前記乱数取得ステップおよび前記論理積演算ステップの処理を再び実行させ、前記第３列によって表される値がｉ以下の場合に、ｉを増加させてから前記乱数取得ステップおよび前記論理積演算ステップの処理を実行させる制御ステップと、
を有し、
前記制御ステップは、前記第３列によって表される値がｉ以下の場合にｉの値を１増加させ、ｉの値を１増加させるたびに、２進数で表現されたｉの各桁の値を要素とする第４列と前記第２列との要素単位の論理和演算結果を新たな前記第２列とし、前記乱数取得ステップおよび前記論理積演算ステップの処理を実行させる、乱数生成方法。
【請求項９】
乱数取得部が、２進数で表現された乱数の各桁の値を要素に含む第１列を得る乱数取得ステップと、
論理積演算部が、前記第１列と、正の整数ｉに対して広義単調増加の関係にある個数の下位ｊ桁の要素が１であって残りの桁の要素が０である２進数で表現された第２列と、の要素単位の論理積演算結果である第３列を得る論理積演算ステップと、
前記第３列によって表される値がｉよりも大きい場合に、前記乱数取得ステップおよび前記論理積演算ステップの処理を再び実行させ、前記第３列によって表される値がｉ以下の場合に、ｉを増加させてから前記乱数取得ステップおよび前記論理積演算ステップの処理を実行させる制御ステップと、
を有し、
ｊは１＋ｌｏｇ２  ｉ以下の最大の整数であり、
前記制御ステップは、ｉがメルセンヌ数であると判定した場合にｉを増加させて前記乱数取得ステップとおよび前記論理積演算ステップとの処理を実行させる、乱数生成方法。
【請求項１０】
請求項１から６の何れかの乱数生成装置としてコンピュータを機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、乱数生成技術に関し、特に、長さの異なる複数の乱数を生成する技術に関する。
【背景技術】
【０００２】
各１≦ｉ＜ｎ（ただし、ｎ≧２）について０以上ｉ以下の乱数を生成する。このような乱数の生成は、Ｌ個のランダムビットを生成し、それらを各桁の値とする２進数表現値に対応する１０進数表現値ａとｉとの大小判定を行い、ａ＞ｉであれば処理をやり直し、ａ≦ｉであればａを乱数として採用することで実現できる（例えば、非特許文献１参照）。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】ヨハネス ブーフマン、「暗号理論入門―暗号アルゴリズム、署名と認証、その数学的基礎」、シュプリンガー・フェアラーク東京、２００１年７月、Ｐ１１４．
【発明の概要】
【発明が解決しようとする課題】
【０００４】
上述の方法では、ｉが２Ｌに対して小さいときに乱数の生成確率が極度に低下し、乱数の生成速度が低下する。
【０００５】
本発明の課題は、複数のｉについて０以上ｉ以下の乱数を高速に生成することである。
【課題を解決するための手段】
【０００６】
２進数で表現された乱数の各桁の値を要素に含む第１列を得、当該第１列と第２列の要素単位の論理積演算結果である第３列を得、当該第３列によって表される値がｉよりも大きい場合にこれらの処理を再び実行し、当該第３列によって表される値がｉ以下の場合にｉを増加させてからこれらの処理を実行する。ただし、第２列は、下位ｉ桁の値がすべて１であり、かつ、残りの桁の値が０である、２進数で表現された列である。
【発明の効果】
【０００７】
本発明では、複数のｉについて０以上ｉ以下の乱数を高速に生成できる。
【図面の簡単な説明】
【０００８】
【図１】図１は実施形態の乱数生成装置の機能構成を説明するためのブロック図である。
【図２】図２は実施形態の乱数生成方法を説明するためのフロー図である。
【図３】図３は実施形態の処理を例示するための図である。
【図４】図４は実施形態の処理を例示するための図である。
【発明を実施するための形態】
【０００９】
以下、本発明の実施形態を説明する。
［概要］
実施形態では、次のように長さの異なる複数の乱数を生成する。まず、２進数で表現された乱数の各桁の値を要素に含む「第１列」を得る（乱数取得ステップ）。次に、「第１列」と「第２列」との要素単位の論理積演算結果（要素ごとのＡＮＤ演算結果、例えば、ビットＡＮＤ演算結果）である「第３列」を得る（論理積演算ステップ）。ただし、「第２列」は、正の整数ｉに対して広義単調増加（非減少）の関係にある個数の下位ｊ桁の要素が１であり、かつ、残りの桁の要素が０である、２進数で表現された列である。「第１列」「第２列」「第３列」の長さ（要素数、ビット数）は、例えば同一である。ここで「第３列」によって表される値がｉよりも大きい場合には、０以上ｉ以下の乱数の生成に失敗したとして、このｉに対して乱数取得ステップおよび論理積演算ステップの処理を再び実行する（やり直す）。一方、「第３列」によって表される値がｉ以下の場合には、０以上ｉ以下の乱数の生成に成功したとして当該乱数を採用し、新たなｉについて０以上ｉ以下の乱数を生成するために、ｉを増加させてから乱数取得ステップおよび論理積演算ステップの処理を実行する。この方法では、「第１列」によって表される値とｉとを比較するのではなく、「第２列」によって「第１列」をマスクして得られる「第３列」によって表される値とｉとを比較する。そのため、０以上ｉ以下の乱数の生成に成功する確率が向上し、高速で０以上ｉ以下の乱数を生成できる。なお、「ｊ」は「ｉ」に対して広義単調増加する関係にある正の整数であればよいが、ｊが１＋ｌｏｇ２ ｉ以下の最大の整数である場合に最も効率がよい。すなわち、床関数ｆｌｏｏｒに対してｊ＝ｆｌｏｏｒ（１＋ｌｏｇ２ ｉ）であることが望ましい。ｊ＝ｆｌｏｏｒ（１＋ｌｏｇ２ ｉ）である場合、特にｉがメルセンヌ数であれば（ｉ＝２Ｎ−１、ただしＮは正整数）、０以上ｉ以下の乱数が生成される確率が１００％となる。そのため、ｉがメルセンヌ数であると判定された場合、「第３列」によって表される値とｉとを比較することなく、０以上ｉ以下の乱数の生成に成功したとして当該乱数を採用し、新たなｉについて０以上ｉ以下の乱数を生成するために、ｉを増加させてから乱数取得ステップおよび論理積演算ステップの処理を実行してもよい。
【００１０】
好ましくは、「第３列」によって表される値がｉ以下の場合、０以上ｉ以下の乱数の生成に成功したとして当該乱数を採用し、新たなｉについて０以上ｉ以下の乱数を生成するためにｉの値を増加させ、「第４列」と「第２列」との要素単位の論理和演算結果（要素ごとのＯＲ演算結果、例えば、ビットＯＲ演算結果）を新たな「第２列」とし、乱数取得ステップおよび論理積演算ステップの処理を実行する。ただし、「第４列」は２進数で表現されたｉの各桁の値を要素とする列である。要素単位の論理和演算は低コストであるため、高速で「第２列」を得ることができる。また、要素単位の論理和演算に必要な記憶容量も小さい。
【００１１】
より好ましくは、「第３列」によって表される値がｉ以下の場合に０以上ｉ以下の乱数の生成に成功したとして当該乱数を採用し、新たなｉについて０以上ｉ以下の乱数を生成するために、ｉの値を１増加させ、ｉの値を１増加させるたびに、「第４列」と「第２列」との要素単位の論理和演算結果を新たな「第２列」とし、乱数取得ステップおよび論理積演算ステップの処理を実行する。この場合、ｉの値が１増加するたびに新たな「第２列」が生成されるが、これによって常に「第２列」が異なる列に更新されるとは限らない。すなわち、ｉの値によっては「第４列」と「第２列」との要素単位の論理和演算結果が当該「第４列」と同一となる場合もある。例えば、ｊ＝ｆｌｏｏｒ（１＋ｌｏｇ２ ｉ）である場合、「第４列」が変更されるのはｉが２ｊ−１になったときのみである。そのため、ｉの値を１増加するたびに必ず新たな「第２列」を生成することは一見非効率に見える。しかしながら、通常、ｉが「第２列」を変更する値に増加したか否か（例えば、ｉ＝２ｊ−１になるか否か）を判定するための演算コストは、「第２列」を生成するための要素単位の論理和演算の演算コストよりも大きい。そのため、ｉの値を１増加するたびに必ず新たな「第２列」を生成するほうが演算コストを低く抑えることができる。ただし、ｉが「第２列」を変更する値に増加したか否かを判定するための演算コストが、「第２列」を生成するための要素単位の論理和演算の演算コストよりも小さい環境であれば、ｉが「第２列」を変更する値に増加したか否かを判定し、ｉが「第２列」を変更する値に増加した場合にのみ「第２列」を更新してもかまわない。
【００１２】
上述のような処理を１≦ｉ＜ｎ（ただし、ｎは２以上の整数）の各ｉについて実行することで、これらの各ｉについて０以上ｉ以下の乱数を高速に生成できる。このようなｎ−１個の乱数は、例えば、ｎ個の元をランダムに置換するｎ−ランダム置換に利用できる。すなわち、ｎ−ランダム置換後の集合のサイズはｎ！であり、１〜ｎ−１番目の要素の置換先をランダムに決めれば、残りの１個の要素の置換先も決まる。上記のｎ−１個の乱数は１〜ｎ−１番目の要素の置換先を決めるために利用でき、ｎ−ランダム置換された列と一対一に対応する。
【００１３】
また、上記の処理が並列処理されてもよい。例えば、乱数取得ステップにおいて、複数の「第１列」を含む「第１集合列」を得、論理積演算ステップにおいて、「第１集合列」と「第２集合列」との要素単位の論理積演算結果である「第３集合列」を得る。ただし、「第１集合列」が含む複数の「第１列」は互いに独立した列であり、複数の「第１列」の相互間に関係はない。「第２集合列」は複数の「第２列」を含み、「第３集合列」は複数の「第３列」を含む。その他の処理は上述した通りである。
【００１４】
［第１実施形態］
次に、第１実施形態を説明する。
＜構成＞
図１に例示するように、本形態の乱数生成装置１は、バイナリ乱数生成部１１、記憶部１２、カウンタ１３、論理和演算部１４、乱数取得部１５、論理積演算部１６、制御部１７、および出力部１８を有する。乱数生成装置１は、例えば、ＣＰＵ（central processing unit）等のプロセッサ（ハードウェア・プロセッサ）やＲＡＭ（random-access memory）・ＲＯＭ（read-only memory）等のメモリ等を備える汎用または専用のコンピュータが所定のプログラムを実行することで構成される装置である。このコンピュータは１個のプロセッサやメモリを備えていてもよいし、複数個のプロセッサやメモリを備えていてもよい。このプログラムはコンピュータにインストールされてもよいし、予めＲＯＭ等に記録されていてもよい。また、ＣＰＵのようにプログラムが読み込まれることで機能構成を実現する電子回路（circuitry）ではなく、プログラムを用いることなく処理機能を実現する電子回路を用いて一部またはすべての処理部が構成されてもよい。また、１個の装置を構成する電子回路が複数のＣＰＵを含んでいてもよい。
【００１５】
＜処理＞
本形態では、１≦ｉ＜ｎ（ただし、ｎは２以上の整数）の各ｉについて０以上ｉ以下の乱数を生成する。「第１列」「第２列」「第３列」をそれぞれＬ個の要素からなるベクトルとして扱い、乱数生成装置１がＬビット精度で演算を行うものとする。本形態ではｊ＝ｆｌｏｏｒ（１＋ｌｏｇ２ ｉ）であり、Ｌがｆｌｏｏｒ（１＋ｌｏｇ２ （ｎ−１））よりも大きな正の整数である場合を説明する。
【００１６】
図２に例示するように、まず、カウンタ１３が正の整数ｉを１に初期化し（ｉ：＝１）、論理和演算部１４がＬ個の要素からなるベクトルＭ０∈｛０，１｝Ｌ（第２列）を全ての要素が０のベクトルに初期化する（Ｍ０：＝０）。なお、「α：＝β」はαをβと定義することを意味する（ステップＳ１３）。
【００１７】
カウンタ１３はｉを出力し、ｉは論理和演算部１４に入力される。論理和演算部１４は、２進数で表現されたｉの各桁の値を要素とするＬ個の要素からなるベクトルＢｉ∈｛０，１｝Ｌ（第４列）とベクトルＭｉ−１∈｛０，１｝Ｌ（第２列）との要素単位の論理和演算（ビットＯＲ演算）を行い、新たなベクトルＭｉ∈｛０，１｝Ｌ（新たな第２列）を得る（Ｍｉ：＝Ｍｉ−１ ＯＲ Ｂｉ）。ただし、「α ＯＲ β」はαとβとの要素単位の論理和演算を表す。ベクトルＢｉまたはＭｉ−１の第ｋ要素（ただし、ｋ＝０，・・・，Ｌ−１）が１である場合、ベクトルＭｉの第ｋ要素は１となり、ベクトルＢｉおよびＭｉ−１の第ｋ要素がともに０の場合、ベクトルＭｉの第ｋ要素は０となる。例えば、図３に例示するように、ｉ＝１，２，３，４，５，・・・の場合のベクトルＭｉは、それぞれ、Ｍ１＝（００…０００１），Ｍ２＝（００…００１１），Ｍ３＝（００…００１１），Ｍ４＝（００…０１１１），Ｍ５＝（００…０１１１），・・・となる。すなわち、ベクトルＭｉは下位ｊ＝ｆｌｏｏｒ（１＋ｌｏｇ２ ｉ）桁の要素が１であって残りの桁の要素が０となる。
【００１８】
乱数取得部１５は記憶部１２にＬ個の要素からなるＬビットのバイナリ乱数ベクトルｒ∈｛０，１｝Ｌ（第１列）が残存しているかを判定する（ステップＳ１２）。バイナリ乱数ベクトルｒが残存している場合には、乱数取得部１５は記憶部１２からバイナリ乱数ベクトルｒを読み出して出力する（ステップＳ１５）。読み出されたバイナリ乱数ベクトルｒは記憶部１２から削除される。一方、バイナリ乱数ベクトルｒが残存していない場合には、バイナリ乱数生成部１１がＬビットのバイナリ乱数ベクトルｒ∈｛０，１｝Ｌを生成して記憶部１２に格納し、乱数取得部１５は記憶部１２からバイナリ乱数ベクトルｒを読み出して出力する。なお、処理の高速化のため、バイナリ乱数生成部１１は並列処理によって複数個のバイナリ乱数ベクトルｒを生成して記憶部１２に格納することが望ましい。出力されたバイナリ乱数ベクトルｒは論理積演算部１６に送られる（ステップＳ１５）。
【００１９】
論理積演算部１６は、バイナリ乱数ベクトルｒとベクトルＭｉとの要素単位の論理積演算（ビットＡＮＤ演算、等号判定）を行い、その演算結果であるベクトルｔｉ∈｛０，１｝Ｌ（第３列）を得て出力する（ｔｉ：＝ｒ ＡＮＤ Ｍｉ）。ただし、「α ＡＮＤ β」はαとβとの要素単位の論理積演算を表す。ベクトルＭｉの第ｋ要素（ただし、ｋ＝０，・・・，Ｌ−１）が０である場合、ベクトルｔｉの第ｋ要素は０となり、ベクトルＭｉの第ｋ要素が１である場合、ベクトルｔｉの第ｋ要素はバイナリ乱数ベクトルｒの第ｋ要素となる。すなわち、ベクトルｔｉはバイナリ乱数ベクトルｒをベクトルＭｉでマスク（等号処理）して得られるベクトルである。図４の例では、ベクトルＭｉの下位ｊ＝ｆｌｏｏｒ（１＋ｌｏｇ２ ｉ）個の要素がすべて１であり、上位Ｌ−ｊ個の要素がすべて０である。そのため、ベクトルｔｉの下位ｊ個はバイナリ乱数ベクトルｒ＝（ｒＬ−１，・・・，ｒ１，ｒ０）の下位ｊ個の要素ｒｊ−１，・・・，ｒ１，ｒ０となり、ベクトルｔｉの上位Ｌ−ｊビットはすべて０となる。ベクトルｔｉは制御部１７に送られる（ステップＳ１６）。
【００２０】
制御部１７は、さらにカウンタ１３から出力されたｉを入力とし、ベクトルｔｉによって表される値（ベクトルｔｉの１０進数表現値）と整数ｉとを比較する。本形態の例では、制御部１７がベクトルｔｉによって表される値が整数ｉ以下であるかを判定する（ステップＳ１７１）。ベクトルｔｉによって表される値がｉよりも大きいと判定された場合には、０以上ｉ以下の乱数の生成に失敗したとし、処理がステップＳ１２に戻される。これにより、同じｉについて乱数取得部１５よび論理積演算部１６の処理が再び実行される。一方、ベクトルｔｉによって表される値がｉ以下であると判定された場合には、０以上ｉ以下の乱数の生成に成功したとし、ｉ＝ｎ−１であるかが判定される（ステップＳ１７２）。ｉ＝ｎ−１でなければ、ｉ＋１を新たなｉ（ｉ：＝ｉ＋１）とし（ステップＳ１７３）、処理がステップＳ１４に戻される。一方、ｉ＝ｎ−１であれば、すべてのｉ＝１，・・・，ｎ−１について０以上ｉ以下の乱数の生成が成功したとし、生成された乱数ｔ１，・・・，ｔｎ−１を出力する（ステップＳ１８）。さらに多くの乱数必要な場合には、上述の処理を繰り返せばよい。
【００２１】
＜本形態の特徴＞
従来のようにバイナリ乱数ベクトルｒ∈｛０，１｝Ｌが表す値とｉとの大小判定によって０以上ｉ以下の乱数を生成する場合、２Ｌに対してｉが小さいと、０以上ｉ以下の乱数の生成確率が極度に低下し、乱数の生成速度が低下してしまう。一方、本形態では、バイナリ乱数ベクトルｒ∈｛０，１｝Ｌを、下位ｊ＝ｆｌｏｏｒ（１＋ｌｏｇ２ ｉ）桁の要素が１であって他の要素が０であるベクトルＭｉでマスクして得られるベクトルｔｉが表す値とｉとの大小判定を行う。２ｊ（２のＭｉのビット数ｊべき）は、ｉの高々２倍であるから，１／２以上の確率で０以上ｉ以下の乱数の生成に成功する。
【００２２】
また、最初からｉのビット数分だけ乱数を生成しようとすると、ｉによって処理が異なるために却って速度は低下する。コンピュータではできるだけ同じ処理の繰り返しの方が高速である。本形態では各ｉについて同じ処理を繰り返すため高速である。
【００２３】
ベクトルＭｉの計算は、毎回ｉのビット数を計算するのではなく、２進数で表現されたｉの各桁の値を要素とするＬ個の要素からなるベクトルＢｉとベクトルＭｉ−１との要素単位の論理和演算（ビットＯＲ演算）を繰り返すことによって実現される。要素単位の論理和演算は、多くのコンピュータで最も高速な演算の一つである。
【００２４】
［第２実施形態］
ｉがメルセンヌ数である場合、ベクトルｔｉによって表される値は必ずｉ以下となる。そのため、ｉがメルセンヌ数であると判定された場合には、ベクトルｔｉによって表される値と整数ｉとを比較することなく、０以上ｉ以下の乱数の生成に成功したことにしてもよい。以下では、これまで説明した事項との相違点を中心に説明し、既に説明した事項については同じ参照番号を引用して説明を省略する。
【００２５】
＜構成＞
図１に例示するように、本形態の乱数生成装置２は、バイナリ乱数生成部１１、記憶部１２、カウンタ１３、論理和演算部１４、乱数取得部１５、論理積演算部１６、制御部２７、および出力部１８を有する。乱数生成装置２は、例えば、上述したコンピュータに所定のプログラムが読み込まれることで構成されてもよいし、少なくとも一部の要素がハードウェアのみによって構成されてもよい。
【００２６】
＜処理＞
ステップＳ１１〜Ｓ１６の処理は第１実施形態と同じである。ただし、第２実施形態では、ステップＳ１６の後、ｉがメルセンヌ数であるか（ｉ＝２ｊ−１−１であるか）を判定する（ステップＳ２７５）。ここで、ｉがメルセンヌ数でなければステップＳ１７１の処理に進み、ｉがメルセンヌ数であれば０以上ｉ以下の乱数の生成に成功したとし、ステップＳ１７２の処理に進む。その他は第１実施形態と同じである。
【００２７】
＜本形態の特徴＞
ｊ＝ｆｌｏｏｒ（１＋ｌｏｇ２ ｉ）である場合、ｉがメルセンヌ数であるならば、ステップＳ１６で生成されたベクトルｔｉによって表される値は必ず０以上ｉ以下となる。本形態では、このような場合にステップＳ１７１の大小判定を省略するため、環境によっては、第１実施形態よりも演算コストを低減できる。
【００２８】
［第３実施形態］
ｊ＝ｆｌｏｏｒ（１＋ｌｏｇ２ ｉ）である場合、ステップＳ１４の処理（Ｍｉ：＝Ｍｉ−１ ＯＲ Ｂｉ）によってＭｉ≠Ｍｉ−１となるのは、ステップＳ１７３によって更新されたｉが２ｊ−１の場合のみである。本形態では、ｉが２ｊ−１に更新される場合のみにステップＳ１４の処理（Ｍｉ：＝Ｍｉ−１ ＯＲ Ｂｉ）を行い、その他の場合にはステップＳ１４の処理を行うことなく、Ｍｉ−１をそのままＭｉとして用いる。
【００２９】
＜構成＞
図１に例示するように、本形態の乱数生成装置３は、バイナリ乱数生成部１１、記憶部１２、カウンタ１３、論理和演算部１４、乱数取得部１５、論理積演算部１６、制御部３７、および出力部１８を有する。乱数生成装置３は、例えば、上述したコンピュータに所定のプログラムが読み込まれることで構成されてもよいし、少なくとも一部の要素がハードウェアのみによって構成されてもよい。
【００３０】
＜処理＞
ステップＳ１１〜Ｓ１７３の処理は第１または２実施形態と同じである。本形態では、ステップＳ１７３の処理の後、制御部３７がｉ＝２ｊ−１であるか否かを判定する（ステップＳ３７４）。ｉ＝２ｊ−１でない場合にはステップＳ１４の処理に戻る。一方、ｉ＝２ｊ−１である場合には、Ｍｉ：＝Ｍｉ−１としてステップＳ１２の処理に戻る。その他は第１または２実施形態と同じである。
【００３１】
＜本形態の特徴＞
ｉ＝２ｊ−１であるか否かの判定のための演算コストがＭｉ：＝Ｍｉ−１ ＯＲ Ｂｉの演算コストよりも小さい環境では、第１実施形態よりも処理を高速化できる場合もある。また、第２実施形態と第３実施形態とを組み合わせる場合、ステップＳ２７５でｉ＝２ｊ−１−１と判定された場合には、ステップＳ３７４で必ずｉ＝２ｊ−１となる。そのため、ステップＳ２７５でｉ＝２ｊ−１−１と判定され、ステップＳ１７２でｉ＝ｎ−１でないと判定された場合には、ステップＳ３７４の判定処理を行うことなく、Ｍｉ：＝Ｍｉ−１としてステップＳ１２の処理に戻ってもよい。
【００３２】
［その他の変形例等］
なお、本発明は上述の実施の形態に限定されるものではない。例えば、上記の処理はｊ＝ｆｌｏｏｒ（１＋ｌｏｇ２ ｉ）の場合に最も効率がよいが、ｊがｉに対して広義単調増加の関係にあれば、従来よりも高速に０以上ｉ以下の乱数を生成できる。また、各ｉについてステップＳ１６の処理を実行するのではなく、一部のｉのみについてステップＳ１６が実行されてもよい。例えば、ｉが素数のときのみにステップＳ１６を実行することで素体上の乱数を高速に生成できる。特に、ｉがメルセンヌ素数のときのみにステップＳ１６を実行すれば、ステップＳ１７１の大小判定を行うことなく、素体上の乱数を高速に生成できる。また、ステップＳ１７３ではｉを１ずつ増加させたが、下位ｊ桁の要素がすべて１であって残りの桁の要素がすべて０であるベクトルＭｉが得られるのであれば、ｉを１ずつ増加させなくてもよい。例えば、ｉ＝２ｊ−１を満たすようにｉを増加させてもよい。その他、上記の処理が並列処理によって実行されてもよい。
【００３３】
上述の各種の処理は、記載に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。その他、本発明の趣旨を逸脱しない範囲で適宜変更が可能であることはいうまでもない。
【００３４】
上述の構成をコンピュータによって実現する場合、各装置が有すべき機能の処理内容はプログラムによって記述される。このプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。この処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体の例は、非一時的な（non-transitory）記録媒体である。このような記録媒体の例は、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリ等である。
【００３５】
このプログラムの流通は、例えば、そのプログラムを記録したＤＶＤ、ＣＤ−ＲＯＭ等の可搬型記録媒体を販売、譲渡、貸与等することによって行う。さらに、このプログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することにより、このプログラムを流通させる構成としてもよい。
【００３６】
このようなプログラムを実行するコンピュータは、例えば、まず、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、一旦、自己の記憶装置に格納する。処理の実行時、このコンピュータは、自己の記録装置に格納されたプログラムを読み取り、読み取ったプログラムに従った処理を実行する。このプログラムの別の実行形態として、コンピュータが可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することとしてもよく、さらに、このコンピュータにサーバコンピュータからプログラムが転送されるたびに、逐次、受け取ったプログラムに従った処理を実行することとしてもよい。サーバコンピュータから、このコンピュータへのプログラムの転送は行わず、その実行指示と結果取得のみによって処理機能を実現する、いわゆるＡＳＰ（Application Service Provider）型のサービスによって、上述の処理を実行する構成としてもよい。
【００３７】
上記実施形態では、コンピュータ上で所定のプログラムを実行させて本装置の処理機能が実現されたが、これらの処理機能の少なくとも一部がハードウェアで実現されてもよい。
【産業上の利用可能性】
【００３８】
本発明は、例えば、秘密分散、秘密計算、公開鍵暗号、共通鍵暗号、電子署名等の各種の暗号技術に利用でき、特にｎ−ランダム置換に利用できる。
【符号の説明】
【００３９】
１〜３  乱数生成装置
【要約】
【課題】複数のｉについて０以上ｉ以下の乱数を高速に生成する。
【解決手段】乱数取得部１５が、２進数で表現された乱数の各桁の値を要素に含む第１列を得、論理積演算部１６が、当該第１列と第２列の要素単位の論理積演算結果である第３列を得る。当該第３列によって表される値がｉよりも大きい場合、制御部１７は、乱数取得部１５および論理積演算部１６の処理を再び実行させる。一方、当該第３列によって表される値がｉ以下の場合、制御部１７はｉを増加させてからこれらの処理を再び実行する。ただし、第２列は、下位ｉ桁の値がすべて１であり、かつ、残りの桁の値が０である、２進数で表現された列である。
【選択図】図１【図１】
0005875719.tif 000002
【図２】
0005875719.tif 000003
【図３】
0005875719.tif 000004
【図４】
0005875719.tif 000005