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