(57)【要約】【課題】任意の桁数の２進数に対してロジスティック写像を施す場合に、ｎビットの乗算器を用いて、精度の高い乱数を生成することができる乱数生成装置を提供する。【解決手段】乱数生成装置は、固定小数点表示で表現した０より大きく１より小さな数を、ｍ×ｎ（ｍ、ｎは２以上の整数）ビットで格納する格納レジスタと、格納レジスタに初期値を設定する初期値設定部と、格納レジスタに格納された値の補数を生成する補数生成部と、補数生成部が生成した補数をｍ×ｎビットで格納する補数レジスタと、格納レジスタの値と補数レジスタの値とを乗算して（２ｍ×ｎ−２）ビットで出力する演算処理部と、演算処理部が出力する値の上位（ｍ×ｎ）ビットを抽出して、格納レジスタに格納させる抽出部と、加算レジスタが格納する値の少なくとも一部を乱数の値として出力する乱数出力部と、乱数の出力を繰り返し行わせる繰り返し制御部とを備える。【選択図】図１
2005228169.tif 000002
【特許請求の範囲】
【請求項１】
乱数を生成する乱数生成装置であって、
小数点以下の桁がｍ×ｎ（ｍ、ｎは２以上の整数）ビットの固定小数点表示で表現した０より大きく１より小さな数を、ｍ×ｎビットの２進コードで格納する格納レジスタと、
前記格納レジスタに初期値を設定する初期値設定部と、
前記格納レジスタに格納された２進コードの補数を生成する補数生成部と、
前記補数生成部により生成されるｍ×ｎビットの前記補数を格納する補数レジスタと、
ｎビットの２進コード同士の積を、２ｎビットの２進コードで出力する乗算部と、
前記乗算部が前記積として出力する２ｎビットの２進コードにおける、下位の（２ｎ−２）ビットを格納する積格納レジスタと、
整数ｉ、ｊ（１≦ｉ、ｊ≦ｍ）の各組み合わせに対応して、前記格納レジスタにおける、下位の｛（ｉ−１）×ｎ＋１｝ビット目から（ｉ×ｎ）ビット目までの値が示す２進コードと、前記補数レジスタにおける、下位の｛（ｊ−１）×ｎ＋１｝ビット目から（ｊ×ｎ）ビット目までの値が示す２進コードとの積を、前記乗算部に順次出力させ、前記積格納レジスタに格納させる演算制御部と、
整数ｉ、ｊの各組み合わせに対応する前記積を前記乗算部が前記積格納レジスタに格納した場合に、当該積を、｛（ｉ＋ｊ−２）×ｎ｝ビット上位にシフトさせるビットシフト部と、
（２ｍ×ｎ−２）ビットの加算レジスタと、
前記加算レジスタに格納されている値を読み出し、読み出した当該値と、前記ビットシフト部がビットシフトを行った２進コードとを加算した値に、前記加算レジスタを書き換える加算処理部と、
前記加算レジスタに格納されている値における、上位（ｍ×ｎ）ビットの値が示す２進コードを抽出して、前記格納レジスタに格納させる抽出部と、
前記加算レジスタが格納する２進コードの少なくとも一部を、乱数の値として出力する乱数出力部と、
前記格納レジスタが新たな２進コードを格納した場合に、前記補数生成部と、前記演算制御部と、前記抽出部と、前記乱数出力部とに、当該新たな２進コードに対応して、新たな補数の生成と、前記乗算部の制御と、新たな加算結果の出力と、更に新たな２進コードの抽出と、乱数の値の出力とを行わせる繰り返し制御部と
を備える乱数生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、乱数を生成する乱数生成装置に関する。
【背景技術】
【０００２】
従来、ロジスティック写像Ｘｔ＋１＝ＣＸｔ（１−Ｘｔ）、Ｘｔ＝Ｘｔ＋１が、Ｃ＝４の場合に精度の高い乱数を生成することが知られている（例えば、非特許文献１参照）。
【非特許文献１】庄野克房著「カオス  エンジニアリンング」シュプリンガー・フェアラーク東京株式会社、２００２年１１月１８日
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかし、汎用のコンピュータに用いられている乗算器は、３２ビット幅のものが多く、丸め誤差等によって、ロジスティック写像の結果に周期性が現れ、精度の高い乱数を生成するのが困難であった。
【０００４】
そこで本発明は、上記の課題を解決することのできる乱数生成装置を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【課題を解決するための手段】
【０００５】
本発明の第１の形態は、乱数を生成する乱数生成装置であって、小数点以下の桁がｍ×ｎ（ｍ、ｎは２以上の整数）ビットの固定小数点表示で表現した０より大きく１より小さな数を、ｍ×ｎビットの２進コードで格納する格納レジスタと、格納レジスタに初期値を設定する初期値設定部と、格納レジスタに格納された２進コードの補数を生成する補数生成部と、補数生成部により生成されるｍ×ｎビットの補数を格納する補数レジスタと、ｎビットの２進コード同士の積を、２ｎビットの２進コードで出力する乗算部と、乗算部が積として出力する２ｎビットの２進コードにおける、下位の（２ｎ−２）ビットを格納する積格納レジスタと、整数ｉ、ｊ（１≦ｉ、ｊ≦ｍ）の各組み合わせに対応して、格納レジスタにおける、下位の｛（ｉ−１）×ｎ＋１｝ビット目から（ｉ×ｎ）ビット目までの値が示す２進コードと、補数レジスタにおける、下位の｛（ｊ−１）×ｎ＋１｝ビット目から（ｊ×ｎ）ビット目までの値が示す２進コードとの積を、乗算部に順次出力させ、積格納レジスタに格納させる演算制御部と、整数ｉ、ｊの各組み合わせに対応する積を乗算部が積格納レジスタに格納した場合に、当該積を、｛（ｉ＋ｊ−２）×ｎ｝ビット上位にシフトさせるビットシフト部と、（２ｍ×ｎ−２）ビットの加算レジスタと、加算レジスタに格納されている値を読み出し、読み出した当該値と、ビットシフト部がビットシフトを行った２進コードとを加算した値に、加算レジスタを書き換える加算処理部と、加算レジスタに格納されている値における、上位（ｍ×ｎ）ビットの値が示す２進コードを抽出して、格納レジスタに格納させる抽出部と、加算レジスタが格納する２進コードの少なくとも一部を、乱数の値として出力する乱数出力部と、格納レジスタが新たな２進コードを格納した場合に、補数生成部と、演算制御部と、抽出部と、乱数出力部とに、当該新たな２進コードに対応して、新たな補数の生成と、乗算部の制御と、新たな加算結果の出力と、更に新たな２進コードの抽出と、乱数の値の出力とを行わせる繰り返し制御部とを備える。このように、ｎビットの乗算器を繰り返し用いることにより、乱数生成装置は、ｍ×ｎビットの桁数の２進コードの値に基づいて、精度の高い乱数を生成することができる。
【０００６】
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明を実施するための最良の形態】
【０００７】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【０００８】
図１は、本発明の一実施形態に係る乱数生成装置１００の構成を示す。本実施形態の乱数生成装置１００は、ｍ×ｎ（ｍ、ｎは２以上の整数）ビットの２進コードに対してロジスティック写像を施す場合に、ｎビットの乗算器を用いて、ｎビットの乗算を繰り返し行うことにより、精度の高い乱数を生成する。乱数生成装置１００は、初期値設定部１０２、格納レジスタ１０４、補数生成部１０６、補数レジスタ１０８、演算処理部１１０、抽出部１１２、乱数出力部１１４、および繰り返し制御部１１６を備える。
【０００９】
格納レジスタ１０４は、小数点以下の桁がｍ×ｎビットの固定小数点表示で表現した０より大きく１より小さな数（Ｘｔ）を、ｍ×ｎビットの２進コードで格納する。例えば、ｍ＝３、ｎ＝２の場合、０．１７１８７５は、００１０１１という６ビットの２進コードで表現される。初期値設定部１０２は、格納レジスタ１０４に初期値（Ｘ０）を設定する。なお、０．２５、０．５、０．７５、全てのビットが１で表現される値、および全てのビットが０で表現される値は、ロジスティック写像を施すと、結果が収束することが知られている（非特許文献１参照。）。そのため、初期値としては、０．２５、０．５、０．７５、全てのビットが１で表現される値、および全てのビットが０で表現される値は、格納レジスタ１０４に設定されない。
【００１０】
補数生成部１０６は、格納レジスタ１０４に格納された２進コードの補数（１−Ｘｔ）を生成する。本例において、補数とは、２の補数である。補数レジスタ１０８は、補数生成部１０６により生成されるｍ×ｎビットの補数を格納する。演算処理部１１０は、格納レジスタ１０４が格納しているｍ×ｎビットの数（Ｘｔ）と補数レジスタ１０８が格納しているｍ×ｎビットの補数（１−Ｘｔ）とを乗算し、その結果（Ｘｔ（１−Ｘｔ））を（２ｍ×ｎ−２）ビットの２進コードで出力する。抽出部１１２は、演算処理部１１０が出力する２進コードにおける、上位（ｍ×ｎ）ビットの値が示す２進コードを抽出して、格納レジスタ１０４に格納させる。
【００１１】
乱数出力部１１４は、２ビット上位へシフトさせることにより、演算処理部１１０が出力する２進コードを４倍して、（２ｍ×ｎ）ビットの乱数の値（４Ｘｔ（１−Ｘｔ））として出力する。この場合、乱数出力部１１４は、生成した乱数の値の一部を出力してもよい。演算処理部１１０が出力する乱数の値の最上位ビットは、精度の高い乱数であることが知られている（非特許文献１参照。）。また、乱数出力部１１４は、（２ｍ×ｎ）ビットの乱数の値を１回のロジスティック写像で生成することができるので、生成された乱数の系列はＰＮ（Ｐｓｅｕｄｏ  Ｎｏｉｓｅ）信号として利用することができる。
【００１２】
繰り返し制御部１１６は、格納レジスタ１０４が新たな２進コードを格納した場合に、補数生成部１０６と、演算処理部１１０と、抽出部１１２と、乱数出力部１１４とに、当該新たな２進コードに対応して、新たな補数の生成と、乗算結果の出力と、更に新たな２進コードの抽出と、乱数の値の出力とを行わせる。このようにして、乱数生成装置１００は、初期値設定部１０２によって設定された初期値に基づいて乱数を生成する。
【００１３】
図２は、格納レジスタ１０４の詳細な構成の一例を示す。以降、ｍ＝３、ｎ＝３２の場合を例に説明する。格納レジスタ１０４は、９６ビットの２進コードを格納する。格納レジスタ１０４は、ブロック２０２−１、ブロック２０２−２、およびブロック２０２−３を備える。格納レジスタ１０４が格納する２進コードの下位３２ビットであるビット０から３１は、ブロック２０２−１に、上位３２ビットであるビット６４から９５は、ブロック２０２−３にそれぞれ格納される。格納レジスタ１０４が格納する２進コードのビット３２から６３は、ブロック２０２−２に格納される。
【００１４】
図３は、補数レジスタ１０８の詳細な構成の一例を示す。本例における補数レジスタ１０８は、格納レジスタ１０４に格納された２進コードの補数を９６ビットの２進コードで格納する。補数レジスタ１０８は、ブロック２０４−１、ブロック２０４−２、およびブロック２０４−３を備える。補数レジスタ１０８が格納する２進コードの下位３２ビットであるビット０から３１は、ブロック２０４−１に、上位３２ビットであるビット６４から９５は、ブロック２０４−３にそれぞれ格納される。補数レジスタ１０８が格納する２進コードのビット３２から６３は、ブロック２０４−２に格納される。
【００１５】
図４は、演算処理部１１０の乗算動作を説明するための概念図である。Ａ１、Ａ２、およびＡ３は、ブロック２０２−１、ブロック２０２−２、およびブロック２０２−３にそれぞれ対応し、Ｂ１、Ｂ２、およびＢ３は、ブロック２０４−１、ブロック２０４−２、およびブロック２０４−３にそれぞれ対応している。演算処理部１１０は、整数ｉ、ｊ（１≦ｉ、ｊ≦ｍ）の組み合わせに対応して、ＡｉとＢｊとを乗算し、積Ｃｉ，ｊを出力する。本例において、ｍの値は３なので、演算処理部１１０は、整数ｉ、ｊ（１≦ｉ、ｊ≦３）の組み合わせに対応して９通りの積Ｃｉ，ｊを出力する。
【００１６】
次に、演算処理部１１０は、積Ｃ１，２および積Ｃ２，１を３２ビット上位へ、積Ｃ３，１、積Ｃ２，２、および積Ｃ１，３を６４ビット上位へ、積Ｃ３，２および積Ｃ２，３を９６ビット上位へ、積Ｃ３，３を１２８ビット上位へ、それぞれシフトさせる。そして、演算処理部１１０は、Ｃ１，１にシフトさせた後の全ての積Ｃｉ，ｊを加算して加算結果Ｄを生成し、抽出部１１２および乱数出力部１１４へ出力する。このようにして、演算処理部１１０は、１回の乗算に３２ビットの乗算器を繰り返し使用することにより、ｍ×ｎビットの２進コードの乗算を行うことができる。これにより、例えば、汎用のＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）等に使用されている３２ビットの乗算器を用いて精度の高い乱数を生成することができるので、乱数生成器を安価に構成することができる。
【００１７】
図５は、演算処理部１１０の詳細な構成の一例を示す。演算処理部１１０は、演算制御部３０２、格納レジスタ読み出し部３０４、補数レジスタ読み出し部３０６、乗算部３０８、積格納レジスタ３１０、および加算部３１２を備える。乗算部３０８は、ｎビットの２進コード同士の積を、２ｎビットの２進コードで出力する。本例において、乗算部３０８は、３２ビットの２進コード同士の積を、６４ビットの２進コードで出力する。積格納レジスタ３１０は、乗算部３０８が積として出力する２ｎビットの２進コードにおける、下位の（２ｎ−２）ビットを格納する。
【００１８】
本例において、ロジスティック写像の特性から、格納レジスタ１０４には、０．５、即ち最上位ビットが１であり、かつそれ以外のビットが０である２進コードが初期値として設定されることはない。そのため、補数レジスタ１０８にも最上位ビットが１であり、かつそれ以外のビットが０である２進コードが設定されることはない。更に、最上位ビットが１であり、かつそれ以外のビットが０である２進コード以外の２進コードとその２の補数との乗算結果は、上位２ビットが００になる。そのため、積格納レジスタ３１０は、乗算部３０８が出力する２ｎビットの積Ｃの、下位（２ｎ−２）ビットを格納する。これにより、レジスタのビット数および配線を削減することができるので、回路規模を削減することができる。
【００１９】
格納レジスタ読み出し部３０４は、格納レジスタ１０４のいずれかのブロック２０２を、演算制御部３０２の制御信号に基づいて読み出して、乗算部３０８へ送る。補数レジスタ読み出し部３０６は、補数レジスタ１０８のいずれかのブロック２０４を、演算制御部３０２の制御信号に基づいて読み出して、乗算部３０８へ送る。演算制御部３０２は、整数ｉ、ｊ（１≦ｉ、ｊ≦ｍ）の各組み合わせに対応して、格納レジスタ１０４における、下位の｛（ｉ−１）×ｎ＋１｝ビット目から（ｉ×ｎ）ビット目までの値が示す２進コードと、補数レジスタ１０８における、下位の｛（ｊ−１）×ｎ＋１｝ビット目から（ｊ×ｎ）ビット目までの値が示す２進コードとの積を、乗算部３０８に順次出力させ、積格納レジスタ３１０に格納させる。加算部３１２は、整数ｉ、ｊ（１≦ｉ、ｊ≦ｍ）の各組み合わせに対応して積格納レジスタ３１０が格納する積を、それぞれ｛（ｉ＋ｊ−２）×ｎ｝ビット上位へシフトさせて順次加算することにより、加算結果Ｄを生成する。
【００２０】
図６は、加算部３１２の詳細な構成の一例を示す。加算部３１２は、ビットシフト部４０２、加算処理部４０４、および加算レジスタ４０６を備える。ビットシフト部４０２は、整数ｉ、ｊの各組み合わせに対応する積を乗算部３０８が積格納レジスタ３１０に格納した場合に、当該積を、｛（ｉ＋ｊ−２）×ｎ｝ビット上位にシフトさせる。加算レジスタ４０６は、（２ｍ×ｎ−２）ビットのレジスタである。本例において、ｍ＝３、ｎ＝３２なので、加算レジスタ４０６は、１９０ビットのビット幅である。加算処理部４０４は、加算レジスタ４０６に格納されている値を読み出し、読み出した当該値と、ビットシフト部４０２がビットシフトを行った２進コードとを加算した値に、加算レジスタ４０６を書き換える。そして、抽出部１１２は、加算レジスタ４０６に格納されている値における、上位（ｍ×ｎ）ビットの値が示す２進コードを抽出して、格納レジスタ１０４に格納させる。また、乱数出力部１１４は、加算レジスタ４０６が格納する２進コードを上位へ２ビットシフトさせることにより４倍し、１９２ビットの乱数を生成する。そして、乱数出力部１１４は、生成した乱数の少なくとも一部を出力する。
【００２１】
図７は、乱数生成装置１００の動作の一例を示すフローチャートである。所定のタイミングにより、本フローチャートに示す乱数生成装置１００の動作は開始する。まず、初期値設定部１０２は、格納レジスタ１０４に初期値Ｘ０を設定する（Ｓ１０２）。そして、補数生成部１０６は、格納レジスタ１０４に格納された値Ｘｔの補数（１−Ｘｔ）を生成し、補数レジスタ１０８に格納する（Ｓ１０４）。次に、乱数生成装置１００は、加算レジスタ４０６の値Ｄを０に初期化する（Ｓ１０６）。演算制御部３０２は、変数Ｅを０に、変数ｉおよびｊを１にそれぞれ初期化する（Ｓ１０８）。そして、演算制御部３０２は、乗算部３０８に、変数ｉ、ｊの組み合わせに対応する格納レジスタ１０４のブロック２０２であるＡｉと、補数レジスタ１０８のブロック２０４であるＢｊとの積Ｃｉ，ｊを出力させ、積格納レジスタ３１０に格納させる（Ｓ１１０）。
【００２２】
次に、ビットシフト部４０２は、積格納レジスタ３１０に格納された積Ｃｉ，ｊを、｛（ｉ＋ｊ−２）×３２｝ビット上位へシフトさせる（Ｓ１１２）。そして、加算処理部４０４は、加算レジスタ４０６に格納されている値を読み出し、読み出した当該値と、ビットシフト部４０２がビットシフトを行った２進コードとを加算し、加算した当該値に、加算レジスタ４０６を書き換える（Ｓ１１４）。次に、演算制御部３０２は、変数ｉの値が３であるか否かを判定する（Ｓ１１６）。変数ｉの値が３ではない場合（Ｓ１１６：Ｎｏ）、演算制御部３０２は、変数ｉの値に１を加える（Ｓ１１８）。そして、演算制御部３０２は、再び、乗算部３０８に、変数ｉ、ｊの組み合わせに対応するＡｉとＢｊとの積Ｃｉ，ｊを出力させ、積格納レジスタ３１０に格納させる（Ｓ１１０）。
【００２３】
変数ｉの値が３である場合（Ｓ１１６：Ｙｅｓ）、演算制御部３０２は、変数ｉの値を１に初期化する（Ｓ１２０）。そして、演算制御部３０２は、変数ｊの値が３であるか否かを判定する（Ｓ１２２）。変数ｊの値が３ではない場合（Ｓ１２２：Ｎｏ）、演算制御部３０２は、変数ｊの値に１を加える（Ｓ１２４）。そして、演算制御部３０２は、再び、乗算部３０８に、変数ｉ、ｊの組み合わせに対応するＡｉとＢｊとの積Ｃｉ，ｊを出力させ、積格納レジスタ３１０に格納させる（Ｓ１１０）。
【００２４】
変数ｊの値が３である場合（Ｓ１２２：Ｙｅｓ）、乱数出力部１１４は、加算レジスタ４０６に格納された加算結果Ｄを２ビット上位へシフトさせることにより４倍して１９２ビットの２進コードを生成し、生成した２進コードの一部を乱数の値として出力し（Ｓ１２６）、本フローチャートに示す乱数生成装置１００の動作は終了する。なお、ステップ１０８からステップ１２６を繰り返すことにより、初期値Ｘ０に応じた乱数の系列を生成し続けることもできる。
【００２５】
上記説明から明らかなように、本実施形態の乱数生成装置１００によれば、ｍ×ｎビットの２進コードに対してロジスティック写像を施す場合に、ｎビットの乗算器を用いて、ｎビットの乗算を繰り返し行うことにより、精度の高い乱数を生成することができる。本実施形態の乱数生成装置１００によって生成された乱数の値を用いて、暗号化を行うことにより、秘匿性の高い通信を行うことができる。また、本実施形態の乱数生成装置１００によって生成された乱数を用いることにより、巡回セールスマン問題等を、従来の汎用ＰＣよりも高速に解くことができる。
【００２６】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【図面の簡単な説明】
【００２７】
【図１】本発明の一実施形態に係る乱数生成装置１００の構成を示す図である。
【図２】格納レジスタ１０４の詳細な構成の一例を示す図である。
【図３】補数レジスタ１０８の詳細な構成の一例を示す図である。
【図４】演算処理部１１０の乗算動作を説明するための概念図である。
【図５】演算処理部１１０の詳細な構成の一例を示す図である。
【図６】加算部３１２の詳細な構成の一例を示す図である。
【図７】乱数生成装置１００の動作の一例を示すフローチャートである。
【符号の説明】
【００２８】
１００  乱数生成装置
１０２  初期値設定部
１０４  格納レジスタ
１０６  補数生成部
１０８  補数レジスタ
１１０  演算処理部
１１２  抽出部
１１４  乱数出力部
１１６  繰り返し制御部
２０２  ブロック
２０４  ブロック
３０２  演算制御部
３０４  格納レジスタ読み出し部
３０６  補数レジスタ読み出し部
３０８  乗算部
３１０  積格納レジスタ
３１２  加算部
４０２  ビットシフト部
４０４  加算処理部
４０６  加算レジスタ
【図１】
2005228169.tif 000003
【図２】
2005228169.tif 000004
【図３】
2005228169.tif 000005
【図４】
2005228169.tif 000006
【図５】
2005228169.tif 000007
【図６】
2005228169.tif 000008
【図７】
2005228169.tif 000009