JPH10177472A - 乱数列の発生方法 - Google Patents
乱数列の発生方法Info
- Publication number
- JPH10177472A JPH10177472A JP8338583A JP33858396A JPH10177472A JP H10177472 A JPH10177472 A JP H10177472A JP 8338583 A JP8338583 A JP 8338583A JP 33858396 A JP33858396 A JP 33858396A JP H10177472 A JPH10177472 A JP H10177472A
- Authority
- JP
- Japan
- Prior art keywords
- random number
- decimal
- digits
- digit
- array
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims description 57
- 238000004422 calculation algorithm Methods 0.000 claims abstract description 19
- 238000006243 chemical reaction Methods 0.000 claims description 8
- 238000004364 calculation method Methods 0.000 claims description 6
- 238000012545 processing Methods 0.000 description 49
- 230000006870 function Effects 0.000 description 28
- 238000013507 mapping Methods 0.000 description 14
- 238000010586 diagram Methods 0.000 description 9
- 238000003491 array Methods 0.000 description 5
- 101100269850 Caenorhabditis elegans mask-1 gene Proteins 0.000 description 3
- 238000012790 confirmation Methods 0.000 description 3
- 238000007620 mathematical function Methods 0.000 description 2
- 238000005259 measurement Methods 0.000 description 2
- OKUGPJPKMAEJOE-UHFFFAOYSA-N S-propyl dipropylcarbamothioate Chemical compound CCCSC(=O)N(CCC)CCC OKUGPJPKMAEJOE-UHFFFAOYSA-N 0.000 description 1
- 230000000739 chaotic effect Effects 0.000 description 1
- 230000008030 elimination Effects 0.000 description 1
- 238000003379 elimination reaction Methods 0.000 description 1
- 230000001771 impaired effect Effects 0.000 description 1
- 230000000737 periodic effect Effects 0.000 description 1
Abstract
(57)【要約】
【課題】 ストリーム暗号化方式に用いる2進乱数列を
電算機で発生させるために、0と1との出現確率が、
0.5にほぼ等しい、周期性の無い、再現性の確実な2
進乱数列を無尽蔵に作る。 【解決手段】 ステップボックスS105で10進乱数
を連続して発生させ、ステップボックスS110,S1
11,S112でその1桁づつを2進数に変換すること
により、2進乱数列を作成する。また、ステップボック
スS110〜S112で10進乱数を2進数に変換する
操作である。
電算機で発生させるために、0と1との出現確率が、
0.5にほぼ等しい、周期性の無い、再現性の確実な2
進乱数列を無尽蔵に作る。 【解決手段】 ステップボックスS105で10進乱数
を連続して発生させ、ステップボックスS110,S1
11,S112でその1桁づつを2進数に変換すること
により、2進乱数列を作成する。また、ステップボック
スS110〜S112で10進乱数を2進数に変換する
操作である。
Description
【0001】
【発明の属する技術分野】本発明は、解読が不可能であ
ると認められている完全暗号を実行するに必要な周期の
無い2進乱数列の発生方法に関する。
ると認められている完全暗号を実行するに必要な周期の
無い2進乱数列の発生方法に関する。
【0002】
【従来の技術】周期性が無く、再現可能な2進乱数列を
無限に作り出すことは、従来不可能であると考えられて
いた。これを可能にしたのが、特願平8−108058
(以下先願と記す)である。しかしながら先願の方法
は、長大な整数を1桁毎に配列要素(レジスタ)に格納
するので、乱数発生の演算速度が遅いこと、およびロジ
スティック写像が短い周期に入る場合があること等の欠
点を持っていた。
無限に作り出すことは、従来不可能であると考えられて
いた。これを可能にしたのが、特願平8−108058
(以下先願と記す)である。しかしながら先願の方法
は、長大な整数を1桁毎に配列要素(レジスタ)に格納
するので、乱数発生の演算速度が遅いこと、およびロジ
スティック写像が短い周期に入る場合があること等の欠
点を持っていた。
【0003】乱数を発生させる場合、通常「種」と呼ば
れる初期値を用いて乱数を演算で求め、次に今求めた乱
数を種として次の乱数を求めるという操作を続ける。こ
の場合、乱数が次々に変化して行くという意味で軌道値
という言葉を用いる。
れる初期値を用いて乱数を演算で求め、次に今求めた乱
数を種として次の乱数を求めるという操作を続ける。こ
の場合、乱数が次々に変化して行くという意味で軌道値
という言葉を用いる。
【0004】ロジスティック写像の周期解は論理的に求
められており、例えばカオス入門長島弘幸・馬場良和著
培風館 p.119に記述され次式で表わされる。
められており、例えばカオス入門長島弘幸・馬場良和著
培風館 p.119に記述され次式で表わされる。
【0005】
【数1】 つまり、乱数の軌道値が、末尾の桁の丸めや打切りによ
ってこの値にほぼ一致した場合に周期に入る。このこと
は軌道値の桁数をいくら多くとっても避けることは出来
ない。
ってこの値にほぼ一致した場合に周期に入る。このこと
は軌道値の桁数をいくら多くとっても避けることは出来
ない。
【0006】
【発明が解決しようとする課題】周期性の無い2進乱数
列を必要とするだけ無制限に、使用する電算機の種類お
よび使用する言語に依存せずに再現することを目的とし
た先願の方法を発展させ 1)短い周期性(1010以下)を完全に排除すること 2)長い周期性(1030以上)をさらに長大化すること 3)2進乱数の発生を高速化すること 4)10進乱数の演算に用いるアルゴリズムをカオス写
像に限定せず、従来のアルゴリズムも使用できるように
すること が本発明の課題である。
列を必要とするだけ無制限に、使用する電算機の種類お
よび使用する言語に依存せずに再現することを目的とし
た先願の方法を発展させ 1)短い周期性(1010以下)を完全に排除すること 2)長い周期性(1030以上)をさらに長大化すること 3)2進乱数の発生を高速化すること 4)10進乱数の演算に用いるアルゴリズムをカオス写
像に限定せず、従来のアルゴリズムも使用できるように
すること が本発明の課題である。
【0007】すなわち、ストリーム暗号化方式に用いる
2進乱数列を電算機で発生させるために、0と1との出
現確率が、0.5にほぼ等しい、周期性の無い、再現性
の確実な2進乱数列を無尽蔵に作ることを目的とする。
2進乱数列を電算機で発生させるために、0と1との出
現確率が、0.5にほぼ等しい、周期性の無い、再現性
の確実な2進乱数列を無尽蔵に作ることを目的とする。
【0008】周期性が無いという意味について明確にし
ておく。1回の演算で作る乱数が、有限桁である限り周
期性を無くすことは理論的に不可能である。しかしその
周期が軌道値の個数で10100 であったらどうであろう
か。実用的に周期は無いと考えてよい。本発明では、許
される周期の目安として1030程度を考えている。
ておく。1回の演算で作る乱数が、有限桁である限り周
期性を無くすことは理論的に不可能である。しかしその
周期が軌道値の個数で10100 であったらどうであろう
か。実用的に周期は無いと考えてよい。本発明では、許
される周期の目安として1030程度を考えている。
【0009】
【課題を解決するための手段】請求項1は、2進乱数の
元となる10進乱数を作成する演算において、長大な桁
数(30〜30,000)の10進乱数を1回の演算で
求め、その1桁づつを2進数に変換することを要旨とす
る。すなわち、2進乱数の元となる10進乱を作成する
演算において、30桁以上の10進乱数を発生する10
進乱数発生工程と、この10進乱数の各桁毎に2進数に
変換する工程とを備えている。
元となる10進乱数を作成する演算において、長大な桁
数(30〜30,000)の10進乱数を1回の演算で
求め、その1桁づつを2進数に変換することを要旨とす
る。すなわち、2進乱数の元となる10進乱を作成する
演算において、30桁以上の10進乱数を発生する10
進乱数発生工程と、この10進乱数の各桁毎に2進数に
変換する工程とを備えている。
【0010】請求項2は、10進乱数を発生させる場
合、アルゴリズムが異なるか、又は同一アルゴリズムで
パラメータが異なる演算ルーチンを2種類以上組み合わ
せて使用し、10進乱数の周期を長大化することを要旨
とする。
合、アルゴリズムが異なるか、又は同一アルゴリズムで
パラメータが異なる演算ルーチンを2種類以上組み合わ
せて使用し、10進乱数の周期を長大化することを要旨
とする。
【0011】請求項3は、上記10進乱数を発生させる
演算において、整数の場合はそのままとし、小数点以下
の数字は小数点を無視した整数として、その数値を配列
に格納するが、この場合個々の配列要素には最大5桁ま
での整数を格納し、計算速度を向上させることを要旨と
する。
演算において、整数の場合はそのままとし、小数点以下
の数字は小数点を無視した整数として、その数値を配列
に格納するが、この場合個々の配列要素には最大5桁ま
での整数を格納し、計算速度を向上させることを要旨と
する。
【0012】請求項4は、10進乱数の各1桁を2進数
に変換する場合、理論的に252通りある変換方法のう
ち複数通りを用いて、2進乱数の発生速度を向上させる
ことを要旨とする。
に変換する場合、理論的に252通りある変換方法のう
ち複数通りを用いて、2進乱数の発生速度を向上させる
ことを要旨とする。
【0013】請求項5は、電算機のメモリー上に9桁の
整数が格納できる配列要素を10a個(3≦a≦7)確
保し、10進乱数の特定桁をa+9個取り出し、そのう
ちのa桁をアドレスとして用い、残りの9桁を、そのア
ドレスを持つ配列要素に記録することによって、10進
乱数の再現性を調べ、周期性を排除することを要旨とす
る。
整数が格納できる配列要素を10a個(3≦a≦7)確
保し、10進乱数の特定桁をa+9個取り出し、そのう
ちのa桁をアドレスとして用い、残りの9桁を、そのア
ドレスを持つ配列要素に記録することによって、10進
乱数の再現性を調べ、周期性を排除することを要旨とす
る。
【0014】
【発明の実施の形態】初めに本発明の概要を述べる。1
0進乱数の発生アルゴリズムにロジスティック写像を用
いると、乱数の桁数をいかに大きくとっても周期に入る
場合があることを記述した。
0進乱数の発生アルゴリズムにロジスティック写像を用
いると、乱数の桁数をいかに大きくとっても周期に入る
場合があることを記述した。
【0015】この場合、乱数を作成する都度その値を記
録し、追加すべきものが新規かどうか調べる必要があ
る。1016以下の周期性を除去する方法は、図1と、請
求項5に述べた。
録し、追加すべきものが新規かどうか調べる必要があ
る。1016以下の周期性を除去する方法は、図1と、請
求項5に述べた。
【0016】図1に示す方法は、ステップボックスS1
02で一個の要素が9桁の整数を収容できる配列are
a[100000]をゼロクリアする。
02で一個の要素が9桁の整数を収容できる配列are
a[100000]をゼロクリアする。
【0017】次に、ステップボックスS103で10進
乱数の初期値Xoを入力し、ステップボックスS104
で10進乱数発生ルーチンを何回か実行し、指定桁数
(N)の乱数Xiを作る。この処理は乱数ルーチンのウ
ォームアップと呼ばれるものである。
乱数の初期値Xoを入力し、ステップボックスS104
で10進乱数発生ルーチンを何回か実行し、指定桁数
(N)の乱数Xiを作る。この処理は乱数ルーチンのウ
ォームアップと呼ばれるものである。
【0018】次に、ステップボックスS105で10進
乱数発生ルーチンを用いて次の乱数Xi+1 を作る。そし
て、Xi+1 の上位5桁を取り出し、整数dとする、また
Xi+1 の上位6桁〜14桁を取り出し整数vとする。
乱数発生ルーチンを用いて次の乱数Xi+1 を作る。そし
て、Xi+1 の上位5桁を取り出し、整数dとする、また
Xi+1 の上位6桁〜14桁を取り出し整数vとする。
【0019】次に、ステップボックスS107でare
a[d]はvに等しいかどうかを判断する。
a[d]はvに等しいかどうかを判断する。
【0020】ステップボックスS107でarea
[d]はvに等しいと判断したときは、ステップボック
スS108でXi+1 の最上位何桁かと最下位の同じ桁数
の数字を入れ換えて新しいXi+1 とした後に処理をステ
ップボックスS106に戻す。
[d]はvに等しいと判断したときは、ステップボック
スS108でXi+1 の最上位何桁かと最下位の同じ桁数
の数字を入れ換えて新しいXi+1 とした後に処理をステ
ップボックスS106に戻す。
【0021】また、ステップボックスS107でare
a[d]はvに等しくないと判断したときは、ステップ
ボックスS109でarea[d]にvを入れる。
a[d]はvに等しくないと判断したときは、ステップ
ボックスS109でarea[d]にvを入れる。
【0022】次に、ステップボックスS110でN桁の
Xi+1 を一桁づつ見て行き偶数なら0、奇数なら1の2
進化を行い出力する。次に、ステップボックスS111
で同じXi+1 を一桁づつ見て行き0〜4なら0、5〜9
なら1の2進化を行い出力する。次に、ステップボック
スS112で同じく0,3,4,7,8なら0,1,
2,5,6,9なら1の2進化を行い出力する。
Xi+1 を一桁づつ見て行き偶数なら0、奇数なら1の2
進化を行い出力する。次に、ステップボックスS111
で同じXi+1 を一桁づつ見て行き0〜4なら0、5〜9
なら1の2進化を行い出力する。次に、ステップボック
スS112で同じく0,3,4,7,8なら0,1,
2,5,6,9なら1の2進化を行い出力する。
【0023】そして、ステップS113で必要な長さに
達したかどうかを判断し、必要な長さに到達していると
きは、本処理を終了する。また、必要な長さに到達して
いない場合は、処理をステップボックスS105に戻
す。
達したかどうかを判断し、必要な長さに到達していると
きは、本処理を終了する。また、必要な長さに到達して
いない場合は、処理をステップボックスS105に戻
す。
【0024】すなわち、ステップボックスS105で1
0進乱数を連続して発生させ、ステップボックスS11
0,S111,S112でその1桁づつをを2進数に変
換することにより、2進乱数列を作成する。1個の10
進乱数の桁数(以下Nを用いる)は、30から30,0
00程度の値を用いる。
0進乱数を連続して発生させ、ステップボックスS11
0,S111,S112でその1桁づつをを2進数に変
換することにより、2進乱数列を作成する。1個の10
進乱数の桁数(以下Nを用いる)は、30から30,0
00程度の値を用いる。
【0025】また、Nを大きくとることにより、10進
乱数は周期はいくらでも大きくすることは可能である
が、使用するアルゴリズムやパラメータによっては、短
い周期(1010以下)が入り込む可能性がある。この短
い周期を排除するのが、ステップボックスS102,S
106,S107,S108の操作である。
乱数は周期はいくらでも大きくすることは可能である
が、使用するアルゴリズムやパラメータによっては、短
い周期(1010以下)が入り込む可能性がある。この短
い周期を排除するのが、ステップボックスS102,S
106,S107,S108の操作である。
【0026】10進乱数の発生アルゴリズムは、その桁
数Nが計算機の通常扱う整数の範囲を越えていることに
注意すれば、先願の方法を含め従来のものが使える。
数Nが計算機の通常扱う整数の範囲を越えていることに
注意すれば、先願の方法を含め従来のものが使える。
【0027】前述したようにステップボックスS110
〜S112は、10進乱数を2進数に変換する操作であ
る。図1では3通り書かれているが、暗号の安全性より
処理スピードを優先するならば、更に何通りかの変換方
法を追加する。
〜S112は、10進乱数を2進数に変換する操作であ
る。図1では3通り書かれているが、暗号の安全性より
処理スピードを優先するならば、更に何通りかの変換方
法を追加する。
【0028】2進数を暗号化/復号化に用いる操作につ
いては、省略してある。この方法は、良く知られている
ように、2進数で表現されている平文/暗号文と、2進
乱数との排他的OR演算を行えばよい。
いては、省略してある。この方法は、良く知られている
ように、2進数で表現されている平文/暗号文と、2進
乱数との排他的OR演算を行えばよい。
【0029】さらに、10進乱数の種は、ステップボッ
クスS102の状態を保存しておけば、一連の処理の最
後の乱数を次回に使用できる。
クスS102の状態を保存しておけば、一連の処理の最
後の乱数を次回に使用できる。
【0030】また、10進乱数の発生アルゴリズムでよ
り長い周期のものを求めるには、上記のロジスティック
写像の場合を例外とするならば、乱数の桁数をより大き
くとればよい。乱数の桁数を大きくせずに周期を長くす
る方法は、請求項2で述べたように異なる乱数列を複数
個使い、それを組み合わせて長周期のものを作る。
り長い周期のものを求めるには、上記のロジスティック
写像の場合を例外とするならば、乱数の桁数をより大き
くとればよい。乱数の桁数を大きくせずに周期を長くす
る方法は、請求項2で述べたように異なる乱数列を複数
個使い、それを組み合わせて長周期のものを作る。
【0031】即ち、 Xn =f1 (Xn-1 )mod m Yn =f2 (Yn-1 )mod m Zn =(aXn +bYn )mod m ここでf1 ,f2 はアルゴリズムが異なるか或は同一ア
ルゴリズムでパラメータが異なる乱数発生の関数、a,
bは整数、mは乱数の桁数をNとした時、10Nであ
り、Zn はXn ,Yn に比べ周期の長い乱数列となる。
ルゴリズムでパラメータが異なる乱数発生の関数、a,
bは整数、mは乱数の桁数をNとした時、10Nであ
り、Zn はXn ,Yn に比べ周期の長い乱数列となる。
【0032】また、10進乱数の演算アルゴリズムは従
来のものが使える。以下に例をあげる。 (1)ロジスティック写像を用いた変換 Xn =4Xn-1 (1−Xn-1 ) ここでXは0.0以上1.0以下の数である。最大桁の
左側に小数点があると考えて整数として扱う。
来のものが使える。以下に例をあげる。 (1)ロジスティック写像を用いた変換 Xn =4Xn-1 (1−Xn-1 ) ここでXは0.0以上1.0以下の数である。最大桁の
左側に小数点があると考えて整数として扱う。
【0033】(2)エノン写像を用いた変換 Xn =1+Yn-1 −1.4X2 n-1 Yn =0.3Xn-1 ここでYの絶対値は1.0を越えないが、Xの絶対値は
1.0を越える場合がある。但し、Yは乱数として使用
しない。Xの値を乱数として使う場合は符号を無視し、
小数点以下の数を取り出し整数として扱う。
1.0を越える場合がある。但し、Yは乱数として使用
しない。Xの値を乱数として使う場合は符号を無視し、
小数点以下の数を取り出し整数として扱う。
【0034】(3)線型合同法 Xn =(aXn-1 +C)mod m a,c,mの例として次の数値をあげておく。
【0035】
【数2】 a=31415926535897932384626433832795028841971621 c=27182818284690452353602874713526624977572470 m=100000000000000000000000000000000000000000000
=1044 ここに用いたa,c,mの決定方法については、D.
E.Knuth著 渋谷政昭訳 The art of
Computer Programming第3分冊
サイエンス社のp.173〜174に書かれている。
=1044 ここに用いたa,c,mの決定方法については、D.
E.Knuth著 渋谷政昭訳 The art of
Computer Programming第3分冊
サイエンス社のp.173〜174に書かれている。
【0036】10進乱数の発生演算においては、長大な
整数を1桁毎に配列要素に格納すると演算速度が遅くな
るので、配列要素に複数個入れてこれを改善する。格納
する桁数は大きい程演算速度は向上するが、掛け算によ
るオーバーフローを考慮しなければならない。乱数の桁
数Nが100程度で4桁格納するのが最適である。また
長大な桁数の整数同志の掛け算で、その後にmod演算
を行う線型合同法の場合、必要桁数以上の演算は省略す
る。
整数を1桁毎に配列要素に格納すると演算速度が遅くな
るので、配列要素に複数個入れてこれを改善する。格納
する桁数は大きい程演算速度は向上するが、掛け算によ
るオーバーフローを考慮しなければならない。乱数の桁
数Nが100程度で4桁格納するのが最適である。また
長大な桁数の整数同志の掛け算で、その後にmod演算
を行う線型合同法の場合、必要桁数以上の演算は省略す
る。
【0037】0から9までの10個の数を5個づつ2組
に分け0の組、1の組とする方法は、10C5 =252通
りある。つまり、10進乱数が1個求められた時、上記
の変換方法を複数個使って変換を行えば、2進乱数の発
生速度が向上する。ただしあまり多くの変換方法を使う
と、2進数から10進数が推定可能となり、暗号の安全
性が損なわれる。
に分け0の組、1の組とする方法は、10C5 =252通
りある。つまり、10進乱数が1個求められた時、上記
の変換方法を複数個使って変換を行えば、2進乱数の発
生速度が向上する。ただしあまり多くの変換方法を使う
と、2進数から10進数が推定可能となり、暗号の安全
性が損なわれる。
【0038】すなわち、本発明によって周期が実用的に
無いとみなせる2進乱数列を必要なだけ制限なく高速に
発生可能である。2進乱数の元となる10進乱数の周期
は、その桁数を大きくすれば長くなるが、ロジスティッ
ク写像を用いたアルゴリズムでは、乱数の軌道値が短い
周期(1010以下)に入ってしまう場合があるので、請
求項5の方法で除去する。この方法はロジスティック写
像以外のアルゴリズムを用いた場合にも、パラメータの
選択が適当でない場合の保険として役立つ。
無いとみなせる2進乱数列を必要なだけ制限なく高速に
発生可能である。2進乱数の元となる10進乱数の周期
は、その桁数を大きくすれば長くなるが、ロジスティッ
ク写像を用いたアルゴリズムでは、乱数の軌道値が短い
周期(1010以下)に入ってしまう場合があるので、請
求項5の方法で除去する。この方法はロジスティック写
像以外のアルゴリズムを用いた場合にも、パラメータの
選択が適当でない場合の保険として役立つ。
【0039】次に、10進数を2進数に変換する方法
(実施例1)、ロジスティック写像を用いたときのプロ
グラム(実施例2)、エノン写像を用いたときのプログ
ラム(実施例3)、線型合同法を用いたプログラム(実
施例4)を説明する。
(実施例1)、ロジスティック写像を用いたときのプロ
グラム(実施例2)、エノン写像を用いたときのプログ
ラム(実施例3)、線型合同法を用いたプログラム(実
施例4)を説明する。
【0040】実施例の記述に当り以下の略号を用いる。 SB ステップボックス LN ラインナンバー
【0041】[実施例1]図2は10進数を2進数に変
換する方法の1例を示すフローチャートである。SB
S201は10進乱数から2進乱数を作成する関数の開
始を宣言する。SB S202は8個の符号無し整数型
の配列mask1を定義する。夫々8ビットの2進数で
1桁だけが1で他はゼロである。SB S203は8個
の符号無し整数型の配列mask0を定義する。夫々8
ビットの2進数で1桁だけがゼロで他は1である。SB
S204は関数の引数の定義である。nは入力で10
進乱数の桁数を与える。orbitは入力で、符号無し
整数配列である。10進乱数を与える。out−byt
eは出力で符号無し文字型配列である。1要素に8ビッ
ト格納できるので、10進乱数の桁数nの1/8のサイ
ズに結果が入れられる。SB S205はmをnの8分
の1に定義する。SB S206はiを0からm−1ま
で1づつ増して行うループを定義する。このとき始めに
kも0とする。SB S207はjを7から0まで1づ
つ減して行うループを定義する。
換する方法の1例を示すフローチャートである。SB
S201は10進乱数から2進乱数を作成する関数の開
始を宣言する。SB S202は8個の符号無し整数型
の配列mask1を定義する。夫々8ビットの2進数で
1桁だけが1で他はゼロである。SB S203は8個
の符号無し整数型の配列mask0を定義する。夫々8
ビットの2進数で1桁だけがゼロで他は1である。SB
S204は関数の引数の定義である。nは入力で10
進乱数の桁数を与える。orbitは入力で、符号無し
整数配列である。10進乱数を与える。out−byt
eは出力で符号無し文字型配列である。1要素に8ビッ
ト格納できるので、10進乱数の桁数nの1/8のサイ
ズに結果が入れられる。SB S205はmをnの8分
の1に定義する。SB S206はiを0からm−1ま
で1づつ増して行うループを定義する。このとき始めに
kも0とする。SB S207はjを7から0まで1づ
つ減して行うループを定義する。
【0042】このjのループはiのループの内側に入っ
ている。以下2つのループの終点S212までの処理で
は、iは出力out−byteの文字位置を、kは10
進乱数の桁の位置を、jは使用するマスクmask1或
はmask0のビット位置を指す。SB S208は、
10進乱数のk番目の桁が4より大きいか否かを判定し
て分岐する処理である。
ている。以下2つのループの終点S212までの処理で
は、iは出力out−byteの文字位置を、kは10
進乱数の桁の位置を、jは使用するマスクmask1或
はmask0のビット位置を指す。SB S208は、
10進乱数のk番目の桁が4より大きいか否かを判定し
て分岐する処理である。
【0043】SB S209は上記の判定がYESの場
合の処理で出力文字out−byte[i]のj番目の
ビットを1にし、その他のビットは変えない。SB S
210は上記の判定がNOの場合の処理で出力文字ou
t−byte[i]のj番目のビットを0にし、その他
のビットは変えない。SB S211はkを1プラスす
る処理である。SB S212はi,j2つのループの
終点である。ループを夫々規定通り完了すると、SB
S213へ抜ける。SB S213は関数の終点で処理
が完了したのでこの関数を呼んだ上位のプログラムに戻
る。
合の処理で出力文字out−byte[i]のj番目の
ビットを1にし、その他のビットは変えない。SB S
210は上記の判定がNOの場合の処理で出力文字ou
t−byte[i]のj番目のビットを0にし、その他
のビットは変えない。SB S211はkを1プラスす
る処理である。SB S212はi,j2つのループの
終点である。ループを夫々規定通り完了すると、SB
S213へ抜ける。SB S213は関数の終点で処理
が完了したのでこの関数を呼んだ上位のプログラムに戻
る。
【0044】10進乱数は配列orbit[ ]の1要
素に1桁づつ格納されてこのサブルーチンに渡される。
10進乱数の桁数はnで8の倍数にとる。これは出力の
out−byte[]が文字形で8ビットを1文字とす
るためである。
素に1桁づつ格納されてこのサブルーチンに渡される。
10進乱数の桁数はnで8の倍数にとる。これは出力の
out−byte[]が文字形で8ビットを1文字とす
るためである。
【0045】図2に示すステップボックスS209の処
理はmask1[j]とのORをとることによってou
t−byteの対応するビットに何が入っていようとも
1つにしてしまい、その他のビットは変えないようにす
るものである。
理はmask1[j]とのORをとることによってou
t−byteの対応するビットに何が入っていようとも
1つにしてしまい、その他のビットは変えないようにす
るものである。
【0046】ステップボックスS210の処理は、ma
sk0[j]とのANDをとることによってout−b
yteの対応するビットに何が入っていようとも0にし
てしまい、その他のビットは変えないようにするもので
ある。
sk0[j]とのANDをとることによってout−b
yteの対応するビットに何が入っていようとも0にし
てしまい、その他のビットは変えないようにするもので
ある。
【0047】ステップボックスS208の処理は、0〜
9の数字を、0〜4と5〜9の2組に分けるものであ
る。ここを変えることにより容易に変換方法を変化出来
る。 例えば、1,3,5,7,9と0,2,4,6,8 0,3,4,7,8と1,2,5,6,9 3,4,5,8,9と0,1,2,6,7等、252通
りである。
9の数字を、0〜4と5〜9の2組に分けるものであ
る。ここを変えることにより容易に変換方法を変化出来
る。 例えば、1,3,5,7,9と0,2,4,6,8 0,3,4,7,8と1,2,5,6,9 3,4,5,8,9と0,1,2,6,7等、252通
りである。
【0048】本例ではorbitの配列1要素には1桁
の10進数が入っている場合を示したが、何桁入ってい
ても考え方は変わらない。
の10進数が入っている場合を示したが、何桁入ってい
ても考え方は変わらない。
【0049】[実施例2]図3,図4,図5はロジステ
ィック写像を用いて10進乱数を発生させる処理を3通
りの方法で行ってその処理時間を比較するための、C言
語で書かれたプログラムの主な部分である。3通りの方
法とは、10進乱数を格納する配列要素に、夫々1桁,
2桁,4桁を入れて配列長を変えたものである。
ィック写像を用いて10進乱数を発生させる処理を3通
りの方法で行ってその処理時間を比較するための、C言
語で書かれたプログラムの主な部分である。3通りの方
法とは、10進乱数を格納する配列要素に、夫々1桁,
2桁,4桁を入れて配列長を変えたものである。
【0050】LN1〜4はインクルードすべきヘッダー
ファイルの宣言である。標準入出力ヘッダーファイル、
数学関数のヘッダーファイル及び時間計測のためのヘッ
ダーファイルをインクルードする。LN6は10進乱数
の桁数Nを128と定義している。LN7はNの2倍を
Mと定義している。LN8はNの1/2をHと定義して
いる。LN9はNの1/4をQと定義している。
ファイルの宣言である。標準入出力ヘッダーファイル、
数学関数のヘッダーファイル及び時間計測のためのヘッ
ダーファイルをインクルードする。LN6は10進乱数
の桁数Nを128と定義している。LN7はNの2倍を
Mと定義している。LN8はNの1/2をHと定義して
いる。LN9はNの1/4をQと定義している。
【0051】LN11はmain関数の定義でLN12
からLN83迄がその範囲である。LN13は時点を定
義する構造体の記憶領域を4個確保する。構造体の型枠
名はtmsである。
からLN83迄がその範囲である。LN13は時点を定
義する構造体の記憶領域を4個確保する。構造体の型枠
名はtmsである。
【0052】LN14は10進乱数の初期値を1桁づつ
受け付ける配列strを定義している。誤ってその桁数
Nを越えてもプログラムを破壊しないようM個とってあ
る。
受け付ける配列strを定義している。誤ってその桁数
Nを越えてもプログラムを破壊しないようM個とってあ
る。
【外1】 LN16はサイズMの2個の整数配列mn,mmを宣言
している。LN17は比較を開始する時の10進乱数を
保存する配列で、1要素に1桁入れる。LN18,19
は10進乱数の配列要素に、2桁及び4桁を格納する場
合に用いられる配列名でLN15およびLN16に対応
するワーク配列である。LN20はループのカウンター
やテンポラリーに使われる整数i,j,kと入力で指定
される繰り返し回数repeatの定義である。
している。LN17は比較を開始する時の10進乱数を
保存する配列で、1要素に1桁入れる。LN18,19
は10進乱数の配列要素に、2桁及び4桁を格納する場
合に用いられる配列名でLN15およびLN16に対応
するワーク配列である。LN20はループのカウンター
やテンポラリーに使われる整数i,j,kと入力で指定
される繰り返し回数repeatの定義である。
【0053】LN21は10進乱数の初期値を1文字づ
つ取り込んだための2要素の文字型配列dummyを宣
言する。LN22は文字型配列の終了マーク及び改行マ
ークを夫々C1,C2と定義する。
つ取り込んだための2要素の文字型配列dummyを宣
言する。LN22は文字型配列の終了マーク及び改行マ
ークを夫々C1,C2と定義する。
【0054】LN23はLN21で定義したdummy
の第2要素に終了マークを入れておこうとするものであ
る。
の第2要素に終了マークを入れておこうとするものであ
る。
【0055】
【外2】 ゼロクリアする。これによって入力する桁がNに満たな
い場合ゼロが入る。
い場合ゼロが入る。
【0056】LN27は10進乱数の初期値を受け付け
るプロンプトで“と”の間の文字と空白が画面に表示さ
れる。
るプロンプトで“と”の間の文字と空白が画面に表示さ
れる。
【0057】LN28〜LN30が、改行キー(リター
ンキー)が押される迄の文字(10進数)を1桁づつ文
字型配列strにとり込む処理である。LN31はLN
29とLN30で作るループの回数即ち入力した10進
乱数の桁数がNを越えている時Nにしてしまう処理であ
る。
ンキー)が押される迄の文字(10進数)を1桁づつ文
字型配列strにとり込む処理である。LN31はLN
29とLN30で作るループの回数即ち入力した10進
乱数の桁数がNを越えている時Nにしてしまう処理であ
る。
【0058】LN32〜LN35はstrに入っている
文字型の10進乱数の初期値を1桁
文字型の10進乱数の初期値を1桁
【外3】
【0059】LN36は画面表示のポインターを次行の
先頭に移動する。LN37はセットされた10進乱数の
初期値をN桁表示する。チェックを容易にするため1桁
づつ空白を入れてある。LN38はLN36と同じ。L
N40は繰り返し回数repeatの入力を受け付ける
プロンプトである。LN41はキー入力された10進数
を変数repeatに取り込む。LN42はLN36と
同じ。
先頭に移動する。LN37はセットされた10進乱数の
初期値をN桁表示する。チェックを容易にするため1桁
づつ空白を入れてある。LN38はLN36と同じ。L
N40は繰り返し回数repeatの入力を受け付ける
プロンプトである。LN41はキー入力された10進数
を変数repeatに取り込む。LN42はLN36と
同じ。
【0060】
【外4】 末尾にゼロが続かないようにするため10進乱数発生関
数hpr_chaos()を空迴しする。hpr_ch
aos( )は、LN85〜LN114で説明
数hpr_chaos()を空迴しする。hpr_ch
aos( )は、LN85〜LN114で説明
【外5】 LN46はプログラムの処理がここを通過する時点をs
tartという名称で記憶する。
tartという名称で記憶する。
【0061】LN47〜LN57は10進乱数を配列の
1要素に1桁入れた場合の処理である。LN49は比較
を開始する時点の10進乱数を確保するものである。
1要素に1桁入れた場合の処理である。LN49は比較
を開始する時点の10進乱数を確保するものである。
【0062】LN50〜LN52は1要素1桁の10進
乱数をrepeat回発生させる。
乱数をrepeat回発生させる。
【外6】 LN53は1要素1桁の処理が終了したことを画面表示
する。
する。
【0063】LN54〜LN56はrepeat回迴わ
した最後の10進乱数を画面表示する。LN57はプロ
グラムの処理がここを通過する時点をafter1とい
う名称で記憶する。
した最後の10進乱数を画面表示する。LN57はプロ
グラムの処理がここを通過する時点をafter1とい
う名称で記憶する。
【0064】LN58〜LN67は10進乱数を配列の
1要素に2桁入れた場合の処理である。LN59はLN
49で確保した1桁1要素の初期値initialから
2桁づつまとめてorbitに入れる処理である。LN
60〜LN62は1要素2桁の10進乱数をrepea
t回発生させる。10進乱数orbitはhpr_2が
呼ばれる都度更新される。hpr_2()はLN116
〜LN136で説明する。
1要素に2桁入れた場合の処理である。LN59はLN
49で確保した1桁1要素の初期値initialから
2桁づつまとめてorbitに入れる処理である。LN
60〜LN62は1要素2桁の10進乱数をrepea
t回発生させる。10進乱数orbitはhpr_2が
呼ばれる都度更新される。hpr_2()はLN116
〜LN136で説明する。
【0065】LN63は1要素2桁の処理が終了したこ
とを画面表示する。LN64〜LN66は関数hpr_
2( )をrepeat回迴わした最後の10進乱数を
画面表示し、LN54〜LN56で表示した内容と一致
することを確認するためのものである。
とを画面表示する。LN64〜LN66は関数hpr_
2( )をrepeat回迴わした最後の10進乱数を
画面表示し、LN54〜LN56で表示した内容と一致
することを確認するためのものである。
【0066】LN67はプログラムの処理がここを通過
する時点をafter_2という名称で記憶する。LN
68〜LN78は10進乱数を配列の1要素に4桁入れ
た場合の処理である。LN69はLN49で確保した1
桁1要素の初期値initialから4桁づつまとめて
orbitに入れる処理である。LN70〜72は1要
素4桁の10進乱数をrepeat回発生させる。10
進乱数のorbitはhpr_4が呼ばれる都度更新さ
れる。hpr_4はLN137〜LN158で説明す
る。
する時点をafter_2という名称で記憶する。LN
68〜LN78は10進乱数を配列の1要素に4桁入れ
た場合の処理である。LN69はLN49で確保した1
桁1要素の初期値initialから4桁づつまとめて
orbitに入れる処理である。LN70〜72は1要
素4桁の10進乱数をrepeat回発生させる。10
進乱数のorbitはhpr_4が呼ばれる都度更新さ
れる。hpr_4はLN137〜LN158で説明す
る。
【0067】LN74は1要素4桁の処理が終了したこ
とを画面表示する。LN75〜LN77は関数hpr_
4( )をrepeat回迴わした最後の10進乱数を
画面表示し、LN54〜LN56及びLN64〜LN6
6で表示した内容と一致することを確認するためのもの
である。
とを画面表示する。LN75〜LN77は関数hpr_
4( )をrepeat回迴わした最後の10進乱数を
画面表示し、LN54〜LN56及びLN64〜LN6
6で表示した内容と一致することを確認するためのもの
である。
【0068】LN78はプログラムの処理がここを通過
する時点をafter_4という名称で記憶する。LN
79は1要素1桁の処理に要した時間を表示する。LN
80は1要素2桁の処理に要した時間を表示する。LN
81は1要素4桁の処理に要した時間を表示する。LN
82は処理の終了である。
する時点をafter_4という名称で記憶する。LN
79は1要素1桁の処理に要した時間を表示する。LN
80は1要素2桁の処理に要した時間を表示する。LN
81は1要素4桁の処理に要した時間を表示する。LN
82は処理の終了である。
【0069】LN85は1個の配列要素に1桁の10進
乱数を格納する場合の、ロジスティック写像を用いた乱
数発生の関数の宣言である。 LN86 nは入力整数で、10進乱数の桁数である。 LN87 orbit[ ]は10進乱数で、呼ばれた
時は入力で、関数の処理が終了した時は次の乱数に更新
されている。orbit[0]が小数第1位の桁であ
る。
乱数を格納する場合の、ロジスティック写像を用いた乱
数発生の関数の宣言である。 LN86 nは入力整数で、10進乱数の桁数である。 LN87 orbit[ ]は10進乱数で、呼ばれた
時は入力で、関数の処理が終了した時は次の乱数に更新
されている。orbit[0]が小数第1位の桁であ
る。
【0070】LN88 work_n[ ]サイズがn
の整数のワーク配列である。 LN89 work_2n[ ]サイズが2nの整数の
ワーク配列である。 LN90 new_2n[ ]サイズが2nの整数のワ
ーク配列である。 LN91 この関数はこのラインからLN114迄であ
る。 LN92 テンポラリーに使う4個の整数i,j,m,
swを宣言する。
の整数のワーク配列である。 LN89 work_2n[ ]サイズが2nの整数の
ワーク配列である。 LN90 new_2n[ ]サイズが2nの整数のワ
ーク配列である。 LN91 この関数はこのラインからLN114迄であ
る。 LN92 テンポラリーに使う4個の整数i,j,m,
swを宣言する。
【0071】LN93 mはnの2倍とする。 LN95〜LN99 初期をx0 とした時、1−x0 を
計算し結果を配列work_nに格納する。 LN101〜LN103 サイズがmの配列work_
2nをゼロクリアする。
計算し結果を配列work_nに格納する。 LN101〜LN103 サイズがmの配列work_
2nをゼロクリアする。
【0072】LN104 iを0からn−1迄1づつ増
して行うループを開始する。 LN105 jを0からn−1迄1づつ増して行うルー
プを開始する。
して行うループを開始する。 LN105 jを0からn−1迄1づつ増して行うルー
プを開始する。
【0073】LN106 4*x0 *(1−x0 )を夫
々1桁づつ演算し、結果をwork_2n[ ]に足し
込む処理を行う。i,jのループはLN106で完結す
る。 LN107〜LN110 LN106で行った掛け算の
work_2n[ ]のサイズはMになっている。また
各配列要素には、10以上の値が入っていることがあ
る。このため、work_2n[ ]が10以上であれ
ば桁上げ処理(LN109)を行い、10進の1桁だけ
を取り出しnew_2n[ ]に移す。
々1桁づつ演算し、結果をwork_2n[ ]に足し
込む処理を行う。i,jのループはLN106で完結す
る。 LN107〜LN110 LN106で行った掛け算の
work_2n[ ]のサイズはMになっている。また
各配列要素には、10以上の値が入っていることがあ
る。このため、work_2n[ ]が10以上であれ
ば桁上げ処理(LN109)を行い、10進の1桁だけ
を取り出しnew_2n[ ]に移す。
【0074】LN111 上記のループで行われなかっ
た最後の桁の移しかえである。 LN113 M桁のnew_2n[ ]の上位N桁を次
の乱数としてorbitに移す。 LN116 1個の配列要素に2桁の10進乱数を格納
する場合の、ロジスティック写像を用いた乱数発生の関
数の宣言である。 LN117 nは入力整数で10進乱数の桁数である。 LN118 orbit[ ]は10進乱数で、要素1
個に2桁の整数が格納されている。orbit[0]の
10位が小数第1位の桁である。呼ばれた時は入力で関
数の処理が終了した時は、次の乱数に更新されている。
た最後の桁の移しかえである。 LN113 M桁のnew_2n[ ]の上位N桁を次
の乱数としてorbitに移す。 LN116 1個の配列要素に2桁の10進乱数を格納
する場合の、ロジスティック写像を用いた乱数発生の関
数の宣言である。 LN117 nは入力整数で10進乱数の桁数である。 LN118 orbit[ ]は10進乱数で、要素1
個に2桁の整数が格納されている。orbit[0]の
10位が小数第1位の桁である。呼ばれた時は入力で関
数の処理が終了した時は、次の乱数に更新されている。
【0075】LN119 work_n[ ]はサイズ
がHの整数のワーク配列である。 LN120 work_n2[ ]はサイズがNの整数
のワーク配列である。 LN121 work_n3[ ]はサイズがNの整数
のワーク配列である。 LN122 work_2n[ ]はサイズがNの整数
のワーク配列である。 LN123 この関数開始行で終了はLN136であ
る。 LN124 テンポラリーに使う整数i,j,hを宣言
する。 LN125 hをn/2とする。 LN127,LN128でwork_n2[ ]に1.
0をセットする。第1要素には3桁の100が入る。使
用するサイズはHである。
がHの整数のワーク配列である。 LN120 work_n2[ ]はサイズがNの整数
のワーク配列である。 LN121 work_n3[ ]はサイズがNの整数
のワーク配列である。 LN122 work_2n[ ]はサイズがNの整数
のワーク配列である。 LN123 この関数開始行で終了はLN136であ
る。 LN124 テンポラリーに使う整数i,j,hを宣言
する。 LN125 hをn/2とする。 LN127,LN128でwork_n2[ ]に1.
0をセットする。第1要素には3桁の100が入る。使
用するサイズはHである。
【0076】LN129 サイズhの配列work_n
2からサイズhの配列orbitを各要素毎に引き、結
果をサイズhの配列work_nに入れる関数sub_
2()を実行する。work_2nはワーク配列で、サ
イズh迄が使われる。ここの処理で1−x0 がwork
_nに入る。sub_2では各配列要素に2桁の整数が
入っているとしている。
2からサイズhの配列orbitを各要素毎に引き、結
果をサイズhの配列work_nに入れる関数sub_
2()を実行する。work_2nはワーク配列で、サ
イズh迄が使われる。ここの処理で1−x0 がwork
_nに入る。sub_2では各配列要素に2桁の整数が
入っているとしている。
【0077】LN131 関数muls_2を用いてサ
イズhの2個の配列orbit,work_nの積を各
要素毎に演算し結果をサイズNの配列work_n2に
入れる。work_2nはサイズNのワーク配列であ
る。この処理が終った時点でwork_n2の各配列要
素には2桁以上の数が入っていることがある。
イズhの2個の配列orbit,work_nの積を各
要素毎に演算し結果をサイズNの配列work_n2に
入れる。work_2nはサイズNのワーク配列であ
る。この処理が終った時点でwork_n2の各配列要
素には2桁以上の数が入っていることがある。
【0078】LN133 関数muls_2を用いて配
列work_n2の各要素を4倍する。結果はwork
_n3に入る。この時ワーク配列work_2nを用
い、各配列要素に2桁入るように桁の切上げ、切捨て処
理を行う。
列work_n2の各要素を4倍する。結果はwork
_n3に入る。この時ワーク配列work_2nを用
い、各配列要素に2桁入るように桁の切上げ、切捨て処
理を行う。
【0079】LN134 4*x0 *(1−x0 )のN
桁の結果が入っているwork_n3の上位H桁を次の
乱数としてorbit[ ]に入れる。
桁の結果が入っているwork_n3の上位H桁を次の
乱数としてorbit[ ]に入れる。
【0080】LN137〜LN158 1個の配列要素
に4桁の10進乱数を格納する場合の、ロジスティック
写像を用いた乱数発生の関数で、容易に2桁の場合から
類推出来るので説明を省略する。
に4桁の10進乱数を格納する場合の、ロジスティック
写像を用いた乱数発生の関数で、容易に2桁の場合から
類推出来るので説明を省略する。
【0081】[実施例3]図6,図7はエノン写像を用
いて10進乱数を発生させるための関数をC言語で書い
たプログラムである。パラメータは次式のように固定し
ている。 xn =1+yn-1 −1.4x2 n-1 yn =0.3xn-1 LN1 関数enon_1の宣言である。_1は配列要
素に1桁の整数を格納する意味をもっている。
いて10進乱数を発生させるための関数をC言語で書い
たプログラムである。パラメータは次式のように固定し
ている。 xn =1+yn-1 −1.4x2 n-1 yn =0.3xn-1 LN1 関数enon_1の宣言である。_1は配列要
素に1桁の整数を格納する意味をもっている。
【0082】LN2〜LN5は引数の宣言で以下に説明
する。nはx[ ]を乱数として使う桁数で、x[0]
とx[1]の間に小数点がある。またx[n+1]は、
yn =0.3xn-1 の演算の便宜上に使われる。y[]
の桁も同様。*xs,*ysは夫々x,yの符号で、整
数のアドレスが渡される。call時はxn-1 ,yn-1
の符号,return時はxn ,yn の符号である。
する。nはx[ ]を乱数として使う桁数で、x[0]
とx[1]の間に小数点がある。またx[n+1]は、
yn =0.3xn-1 の演算の便宜上に使われる。y[]
の桁も同様。*xs,*ysは夫々x,yの符号で、整
数のアドレスが渡される。call時はxn-1 ,yn-1
の符号,return時はxn ,yn の符号である。
【0083】x[ ],y[ ]はcall時は
xn-1 ,yn-1 ,return時はxn ,yn となる配
列である。y[0]は常に0,x[0]は1又は0であ
る。wx1[ ],wy1[ ]は整数のワーク配列で
サイズはn+2である。wx2[ ],wy2[ ]
は、上記配列の2倍のサイズを持つ整数のワーク配列で
ある。 LN6 関数の開始行である。終了行LN67に対応し
ている。 LN7 テンポラリーに使う6個の整数を宣言する。 LN9 nnをn+2とする。 LN10 nmをnnの2倍とする。 LN11 yn =0.3xn-1 の演算を行う。結果はw
y1[1]〜wy1[n+1]に入る。
xn-1 ,yn-1 ,return時はxn ,yn となる配
列である。y[0]は常に0,x[0]は1又は0であ
る。wx1[ ],wy1[ ]は整数のワーク配列で
サイズはn+2である。wx2[ ],wy2[ ]
は、上記配列の2倍のサイズを持つ整数のワーク配列で
ある。 LN6 関数の開始行である。終了行LN67に対応し
ている。 LN7 テンポラリーに使う6個の整数を宣言する。 LN9 nnをn+2とする。 LN10 nmをnnの2倍とする。 LN11 yn =0.3xn-1 の演算を行う。結果はw
y1[1]〜wy1[n+1]に入る。
【0084】LN12 wy1[0]は未定儀であるか
らゼロを入れる。 LN13 配列wy1を1要素に1桁の整数が入るよう
に桁上げを行う。 LN14 wy1[n+1]をゼロにする。 LN15 アドレスxsの中味をtsにコピーする。 LN16 配列wx2の全要素をゼロクリアする。 LN17,LN18 x2 の計算を行い結果をwx2
[ ]に入れる。 LN19 x2 の整数部は2桁になり、1位はwx2
[1]である。これが4以上であればエラーとする。
らゼロを入れる。 LN13 配列wy1を1要素に1桁の整数が入るよう
に桁上げを行う。 LN14 wy1[n+1]をゼロにする。 LN15 アドレスxsの中味をtsにコピーする。 LN16 配列wx2の全要素をゼロクリアする。 LN17,LN18 x2 の計算を行い結果をwx2
[ ]に入れる。 LN19 x2 の整数部は2桁になり、1位はwx2
[1]である。これが4以上であればエラーとする。
【0085】LN20 wx2[ ]の内容をwy2
[ ]にコピーする。 LN21 0.4*x2 をwy2[ ]に加え、wy2
[ ]に1.4x2 が入る。 LN22〜LN38 は入力時のyの符号が負の場合の
処理である。 LN23 yは負であるから、加算して、y−1.4x
2 を求めwy2[ ]に入れる。
[ ]にコピーする。 LN21 0.4*x2 をwy2[ ]に加え、wy2
[ ]に1.4x2 が入る。 LN22〜LN38 は入力時のyの符号が負の場合の
処理である。 LN23 yは負であるから、加算して、y−1.4x
2 を求めwy2[ ]に入れる。
【0086】LN24 wy2[ ]を1要素1桁とな
るように桁上げを行う。小数点はwy2[1]とwy2
[2]の間にある。またwy2[ ]の符号は負であ
る。 LN25〜LN29 wy2[1]が1より大きけれ
ば、wy2[1]から1を引いてwy2[1]にすれ
ば、次のxがLN27で求められ、その符号は負であ
る。
るように桁上げを行う。小数点はwy2[1]とwy2
[2]の間にある。またwy2[ ]の符号は負であ
る。 LN25〜LN29 wy2[1]が1より大きけれ
ば、wy2[1]から1を引いてwy2[1]にすれ
ば、次のxがLN27で求められ、その符号は負であ
る。
【0087】LN30〜LN37は、LN25のif文
の反対でwy2[1]がゼロの場合の処理である。この
場合は1−|y−1.4x2 |が次のxになる。 LN31〜LN35 wy2[ ]にはy−1.4x2
が入っており、整数部はゼロである。ここで1−|y−
1.4x2 |を計算し次のxとする。符号は正である。
の反対でwy2[1]がゼロの場合の処理である。この
場合は1−|y−1.4x2 |が次のxになる。 LN31〜LN35 wy2[ ]にはy−1.4x2
が入っており、整数部はゼロである。ここで1−|y−
1.4x2 |を計算し次のxとする。符号は正である。
【0088】LN39〜LN63は、LN22に対応し
入力時のyが正の場合の処理である。ここでwy2
[ ]には1.4x2 が入っている。 LN40 先ずwy2[ ]を1要素1桁に整頓する。 LN41〜LN45 wy2[ ]即ち1.4x2 の整
数部が2の時の処理である。
入力時のyが正の場合の処理である。ここでwy2
[ ]には1.4x2 が入っている。 LN40 先ずwy2[ ]を1要素1桁に整頓する。 LN41〜LN45 wy2[ ]即ち1.4x2 の整
数部が2の時の処理である。
【0089】LN42 wy2[1]即ち整数1位をマ
イナス1する。 LN43 wy2[ ]からy[ ]を引きx[ ]に
入れる。 LN44 次のxの符号は負である。このあとLN64
の処理へ続く。
イナス1する。 LN43 wy2[ ]からy[ ]を引きx[ ]に
入れる。 LN44 次のxの符号は負である。このあとLN64
の処理へ続く。
【0090】LN46〜LN57 wy2[1]即ち
1.4x2 の整数部が1の時の処理である。この場合正
であり1.0以下のy[ ]と負であり1.0以下の
1.4x2 (1は差引いて考えている)との大小関係で
次のxの符号がきまる。 LN47 初めに*xsをゼロとしておく。
1.4x2 の整数部が1の時の処理である。この場合正
であり1.0以下のy[ ]と負であり1.0以下の
1.4x2 (1は差引いて考えている)との大小関係で
次のxの符号がきまる。 LN47 初めに*xsをゼロとしておく。
【0091】LN48〜LN52 y[ ]とwy2
[ ]の小数第1位から順に調べて行き大小の判定がつ
いたらこのループを出る。y[ ]>wy2[ ]なら
*xs=1、反対なら*xs=−1とする。
[ ]の小数第1位から順に調べて行き大小の判定がつ
いたらこのループを出る。y[ ]>wy2[ ]なら
*xs=1、反対なら*xs=−1とする。
【0092】LN53 大小判定がつかなかったらエラ
ーとする。 LN54 wy2[1]をゼロにする。即ち、1−1.
4x2 が行われた。 LN55 *xs=1ならy[ ]−wy2[ ]をx
[ ]とする。 LN56 *xs=−1ならwy2[ ]−y[ ]を
x[ ]とする。このあとLN64の処理へ続く。
ーとする。 LN54 wy2[1]をゼロにする。即ち、1−1.
4x2 が行われた。 LN55 *xs=1ならy[ ]−wy2[ ]をx
[ ]とする。 LN56 *xs=−1ならwy2[ ]−y[ ]を
x[ ]とする。このあとLN64の処理へ続く。
【0093】LN58〜LN62 wy2[1]がゼロ
即ち−1.4x2 の整数部がゼロの時の処理である。 LN59 y[0]に1を加える。 LN60 y[ ]からwy2[ ]を差引いてx
[ ]とする。 LN61 次のxの符号は正である。 LN64 LN15でとっておいたtsの値即ちCAL
L時のxsを次のyの符号とする。 LN65 LN11〜LN14で計算した0.3xの値
をwy1[ ]からy[ ]に移す。 LN66 正常に処理が完了した。
即ち−1.4x2 の整数部がゼロの時の処理である。 LN59 y[0]に1を加える。 LN60 y[ ]からwy2[ ]を差引いてx
[ ]とする。 LN61 次のxの符号は正である。 LN64 LN15でとっておいたtsの値即ちCAL
L時のxsを次のyの符号とする。 LN65 LN11〜LN14で計算した0.3xの値
をwy1[ ]からy[ ]に移す。 LN66 正常に処理が完了した。
【0094】[実施例4]図8〜図11は、線型合同法
を用いて10進乱数を発生させる処理を3通りの方法で
行って、その処理時間を比較するためのC言語で書かれ
たプログラムの主な部分である。3通りの方法とは、1
0進乱数を格納する配列要素に夫々1桁,2桁,4桁を
入れて配列長を変えたものである。
を用いて10進乱数を発生させる処理を3通りの方法で
行って、その処理時間を比較するためのC言語で書かれ
たプログラムの主な部分である。3通りの方法とは、1
0進乱数を格納する配列要素に夫々1桁,2桁,4桁を
入れて配列長を変えたものである。
【0095】LN1〜LN4はインクルードすべきヘッ
ダーファイルの宣言である。標準入出力ヘッダーファイ
ル、数学関数のヘッダーファイル及び時間計測のための
ヘッダーファイルをインクルードする。
ダーファイルの宣言である。標準入出力ヘッダーファイ
ル、数学関数のヘッダーファイル及び時間計測のための
ヘッダーファイルをインクルードする。
【0096】LN6 10進乱数の桁数Nを32と定義
している。LN15〜LN22で定義されているパラメ
ータa,cの桁数から最大128迄がこのプログラムで
は許される。
している。LN15〜LN22で定義されているパラメ
ータa,cの桁数から最大128迄がこのプログラムで
は許される。
【0097】LN7 MはNの2倍とする。 LN8 HはNの1/2とする。 LN9 QはNの1/4とする。 LN11 main関数の宣言である。その範囲はLN
12〜LN116である。
12〜LN116である。
【0098】LN13 時点を定義する構造体の記憶領
域を4個確保する。構造体の型枠名は、tmsである。 LN14 10進乱数の初期値を1桁づつ受付ける配列
strを定義する。誤ってその桁数Nを越えてもプログ
ラムを破壊しないようM個とってある。 LN15〜LN18 パラメータとして用いるaを12
8桁,1配列要素に4桁づつとってある。この数値は円
周率からとったものであるから1000桁程度とするこ
とも可能である。
域を4個確保する。構造体の型枠名は、tmsである。 LN14 10進乱数の初期値を1桁づつ受付ける配列
strを定義する。誤ってその桁数Nを越えてもプログ
ラムを破壊しないようM個とってある。 LN15〜LN18 パラメータとして用いるaを12
8桁,1配列要素に4桁づつとってある。この数値は円
周率からとったものであるから1000桁程度とするこ
とも可能である。
【0099】LN19〜LN22 パラメータとして用
いるcを128桁,1配列要素に4桁づつとってある。
この数値は自然対数の底からとったものであるから10
00桁程度とすることも可能である。 LN23〜LN30 上記のパラメータを1要素2桁と
した配列を用意した。この配列はLN15〜LN22の
配列から計算で作ることも可能である。
いるcを128桁,1配列要素に4桁づつとってある。
この数値は自然対数の底からとったものであるから10
00桁程度とすることも可能である。 LN23〜LN30 上記のパラメータを1要素2桁と
した配列を用意した。この配列はLN15〜LN22の
配列から計算で作ることも可能である。
【0100】LN31 パラメータa,cを1要素1桁
とした配列aaa,cccの領域を確保する。値はプロ
グラムで、aa[ ],cc[ ]から作る。 LN32〜LN39 プログラムで用いる定数、ワーク
エリアの確保である。 LN41〜LN58は実施例2の図3 LN23〜LN
42と同一である。
とした配列aaa,cccの領域を確保する。値はプロ
グラムで、aa[ ],cc[ ]から作る。 LN32〜LN39 プログラムで用いる定数、ワーク
エリアの確保である。 LN41〜LN58は実施例2の図3 LN23〜LN
42と同一である。
【0101】LN60〜LN61 D.E.Knuth
著 渋谷政昭訳 準数値算法/乱数サイエンス社のp1
73に書かれているようにa mod200=21とす
るための処理である。1要素4桁の場合である。 LN62〜LN64 上記と同じ処理を1要素2桁の場
合について行っている。 LN67〜LN74 1要素1桁の場合のパラメータa
aa[ ]とccc[]をaa[ ]及びcc[ ]か
ら作成している。
著 渋谷政昭訳 準数値算法/乱数サイエンス社のp1
73に書かれているようにa mod200=21とす
るための処理である。1要素4桁の場合である。 LN62〜LN64 上記と同じ処理を1要素2桁の場
合について行っている。 LN67〜LN74 1要素1桁の場合のパラメータa
aa[ ]とccc[]をaa[ ]及びcc[ ]か
ら作成している。
【0102】LN75も実施例2のLN44と同一のウ
ォーミングアップであるが、10進乱数の発生関数が異
なる。 mkr_1( )は1要素1桁の場合の線型合同法によ
る10進乱数発生ルーチンである。 LN77 10進乱数の初期値を1要素1桁としてin
itial[ ]に保存する。
ォーミングアップであるが、10進乱数の発生関数が異
なる。 mkr_1( )は1要素1桁の場合の線型合同法によ
る10進乱数発生ルーチンである。 LN77 10進乱数の初期値を1要素1桁としてin
itial[ ]に保存する。
【0103】LN79 プログラムの処理がここを通過
する時点をstartという名称で記憶する。 LN81〜LN89は1要素1桁の場合の処理である。 LN81 先ず初期値をorbit[ ]に移す。 LN82〜LN84 乱数をrepeat回ループの中
で発生させる。この例では乱数は使われず更新されてし
まう。
する時点をstartという名称で記憶する。 LN81〜LN89は1要素1桁の場合の処理である。 LN81 先ず初期値をorbit[ ]に移す。 LN82〜LN84 乱数をrepeat回ループの中
で発生させる。この例では乱数は使われず更新されてし
まう。
【0104】LN85〜LN87 最後の乱数を確認の
ため画面に表示する。 LN88 cell_1 finishedと画面に表
示する。 LN89 プログラムの処理がここを通過する時点をa
fter_1という名称で記憶する。
ため画面に表示する。 LN88 cell_1 finishedと画面に表
示する。 LN89 プログラムの処理がここを通過する時点をa
fter_1という名称で記憶する。
【0105】LN91〜LN99は1要素2桁の場合の
処理である。 LN91 先ず初期値を2桁づつorbit[ ]に移
す。 LN92〜LN94 乱数をrepeat回ループの中
で発生させる。この例では乱数は使われず、更新されて
しまう。
処理である。 LN91 先ず初期値を2桁づつorbit[ ]に移
す。 LN92〜LN94 乱数をrepeat回ループの中
で発生させる。この例では乱数は使われず、更新されて
しまう。
【0106】LN95〜LN97 最後の乱数を確認の
ために表示する。 LN98 cell_2 finishedと画面に表
示する。 LN99 プログラムの処理がここを通過する時点をa
fter_2という名称で記憶する。
ために表示する。 LN98 cell_2 finishedと画面に表
示する。 LN99 プログラムの処理がここを通過する時点をa
fter_2という名称で記憶する。
【0107】LN101〜LN110は1要素4桁の場
合の処理である。 LN101〜LN102 初期値を4桁づつorbit
[ ]に入れる。 LN103〜LN105 乱数をrepeat回ループ
の中で発生させる。この例では乱数は使われずに更新さ
れてしまう。
合の処理である。 LN101〜LN102 初期値を4桁づつorbit
[ ]に入れる。 LN103〜LN105 乱数をrepeat回ループ
の中で発生させる。この例では乱数は使われずに更新さ
れてしまう。
【0108】LN106〜LN108 最後の乱数を確
認のため画面に表示する。 LN109 cell_4 finishedと画面に
表示する。 LN110 プログラムの処理がここを通過する時点を
after_4という名称で記憶する。
認のため画面に表示する。 LN109 cell_4 finishedと画面に
表示する。 LN110 プログラムの処理がここを通過する時点を
after_4という名称で記憶する。
【0109】LN111 1要素1桁の処理に要した時
間を表示する。 LN112 1要素2桁の処理に要した時間を表示す
る。 LN113 1要素4桁の処理に要した時間を表示す
る。 LN115 処理の終了である。
間を表示する。 LN112 1要素2桁の処理に要した時間を表示す
る。 LN113 1要素4桁の処理に要した時間を表示す
る。 LN115 処理の終了である。
【0110】LN118 1個の配列要素に4桁の10
進乱数を格納する場合の線型合同法を用いた乱数発生の
関数の宣言である。 LN119 nは入力整数で10進乱数の桁数である。
進乱数を格納する場合の線型合同法を用いた乱数発生の
関数の宣言である。 LN119 nは入力整数で10進乱数の桁数である。
【0111】LN120 orbit[ ]は10進乱
数で、呼ばれた時は入力で、関数の処理が終了した時
は、次の乱数に更新されている。要素数はn/4であ
る。 LN121 work_n[ ]はサイズがn/4の整
数配列で、ワークエリアとして使われる。 LN122 a[ ],c[ ]は夫々LN15〜LN
18,LN19〜LN22で定義し、LN60,61の
修正を行ったものである。
数で、呼ばれた時は入力で、関数の処理が終了した時
は、次の乱数に更新されている。要素数はn/4であ
る。 LN121 work_n[ ]はサイズがn/4の整
数配列で、ワークエリアとして使われる。 LN122 a[ ],c[ ]は夫々LN15〜LN
18,LN19〜LN22で定義し、LN60,61の
修正を行ったものである。
【0112】LN123〜LN135がmkr_4
( )の処理を記述する所である。 LN124 テンポラリーに使用する整数i,j,qを
宣言する。 LN125 q=n/4とする。 LN127 ワークエリアwork_n[ ]をq個ゼ
ロクリアする。 LN129・LN130 入力したままの乱数orbi
t[ ]にa[ ]を掛けwork_n[ ]に入れ
る。
( )の処理を記述する所である。 LN124 テンポラリーに使用する整数i,j,qを
宣言する。 LN125 q=n/4とする。 LN127 ワークエリアwork_n[ ]をq個ゼ
ロクリアする。 LN129・LN130 入力したままの乱数orbi
t[ ]にa[ ]を掛けwork_n[ ]に入れ
る。
【0113】この場合、積である整数は2n桁になる
が、上位のn桁は、mod演算をするために不要となる
から下位のn桁だけの演算を行うようiとjのループパ
ラメータをコントロールとしている。即ち、iは0から
q−1まで動かし、jはq−1−iからq−1まで動か
し、積の要素番号i+j+1−qが0からq−1までと
なるように工夫してある。
が、上位のn桁は、mod演算をするために不要となる
から下位のn桁だけの演算を行うようiとjのループパ
ラメータをコントロールとしている。即ち、iは0から
q−1まで動かし、jはq−1−iからq−1まで動か
し、積の要素番号i+j+1−qが0からq−1までと
なるように工夫してある。
【0114】LN132 上記の積の入っているwor
k_n[ ]にc[ ]を加える処理を関数sum_4
( )で行う。n桁以上になった場合無視するように作
られている。結果はorbit[ ]に入れられる。
k_n[ ]にc[ ]を加える処理を関数sum_4
( )で行う。n桁以上になった場合無視するように作
られている。結果はorbit[ ]に入れられる。
【0115】LN137〜LN154 1個の配列要素
に2桁の10進乱数を格納する場合の線型合同法を用い
た乱数発生の関数である。4桁の場合から容易に理解出
来るので説明を省略する。
に2桁の10進乱数を格納する場合の線型合同法を用い
た乱数発生の関数である。4桁の場合から容易に理解出
来るので説明を省略する。
【0116】LN155〜LN176 1個の配列要素
に1桁の10進乱数を格納する場合の線型合同法を用い
た乱数発生の関数である。同様の理由で説明を省略す
る。
に1桁の10進乱数を格納する場合の線型合同法を用い
た乱数発生の関数である。同様の理由で説明を省略す
る。
【0117】
【発明の効果】本発明によれば、電算機の種類、使用す
る言語に依存せず、簡単に完全暗号(又はone ti
me pad暗号、ヴァーナム暗号とも呼ばれる)を実
施できるという効果が得られる。
る言語に依存せず、簡単に完全暗号(又はone ti
me pad暗号、ヴァーナム暗号とも呼ばれる)を実
施できるという効果が得られる。
【図1】1016以下の周期性を除去する方法を示すフロ
ーチャートである。
ーチャートである。
【図2】10進数を2進数に変換する方法の一例を示す
フローチャートである。
フローチャートである。
【図3】実施例2を説明するためのC言語で書かれたプ
ログラムを示す図である。
ログラムを示す図である。
【図4】実施例2を説明するためのC言語で書かれたプ
ログラムを示す図である。
ログラムを示す図である。
【図5】実施例2を説明するためのC言語で書かれたプ
ログラムを示す図である。
ログラムを示す図である。
【図6】実施例3を説明するためのC言語で書かれたプ
ログラムを示す図である。
ログラムを示す図である。
【図7】実施例3を説明するためのC言語で書かれたプ
ログラムを示す図である。
ログラムを示す図である。
【図8】実施例4を説明するためのC言語で書かれたプ
ログラムを示す図である。
ログラムを示す図である。
【図9】実施例4を説明するためのC言語で書かれたプ
ログラムを示す図である。
ログラムを示す図である。
【図10】実施例4を説明するためのC言語で書かれた
プログラムを示す図である。
プログラムを示す図である。
【図11】実施例4を説明するためのC言語で書かれた
プログラムを示す図である。
プログラムを示す図である。
S102 ゼロクリアステップ S103 初期値入力ステップ S104 乱数Xi作成ステップ S105 乱数Xi-1 作成ステップ
Claims (5)
- 【請求項1】 2進乱数の元となる10進乱数を作成す
る演算において、長大な桁数(30〜30,000)の
10進乱数を、その桁数が格納出来る配列を用いて1回
の演算で求め、この演算をくり返して得られる10進数
の1桁づつを2進数に変換することを特徴とする乱数列
の発生方法。 - 【請求項2】 上記10進乱数を発生させる場合、アル
ゴリズムが異なるか、又は同一アルゴリズムでパラメー
タが異なる演算ルーチンを2種類以上組み合わせて使用
することを特徴とする乱数列の発生方法。 - 【請求項3】 上記10進乱数を発生させる演算におい
て、整数の場合はそのまま、小数点以下の数字の場合は
小数点を無視した整数として、その数値を配列に格納す
るが、この場合個々の配列要素には最大5桁までの整数
を格納することを特徴とする乱数列の発生方法。 - 【請求項4】 10進乱数の各1桁を2進数に変換する
場合、理論的に252通りある変換方法のうち複数通り
を用いることを特徴とする乱数列の発生方法。 - 【請求項5】 電算機のメモリー上に9桁の整数が格納
できる配列要素を、10a 個(3≦a≦7)確保し、1
0進乱数の特定桁をa+9個取り出し、そのうちのa桁
をアドレスとして用い、残りの9桁を、そのアドレスを
持つ配列要素に記録することによって、10進乱数の再
現性を調べることを特徴とする乱数列の発生方法。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP8338583A JPH10177472A (ja) | 1996-12-18 | 1996-12-18 | 乱数列の発生方法 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP8338583A JPH10177472A (ja) | 1996-12-18 | 1996-12-18 | 乱数列の発生方法 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JPH10177472A true JPH10177472A (ja) | 1998-06-30 |
Family
ID=18319548
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP8338583A Pending JPH10177472A (ja) | 1996-12-18 | 1996-12-18 | 乱数列の発生方法 |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JPH10177472A (ja) |
Cited By (3)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2002541518A (ja) * | 1999-03-30 | 2002-12-03 | ドイッチェ テレコム アーゲー | 識別番号を導出する方法 |
| CN100561546C (zh) | 2008-01-28 | 2009-11-18 | 和舰科技(苏州)有限公司 | 循环扩散偏移转码加密方法 |
| CN113138751A (zh) * | 2020-01-17 | 2021-07-20 | 北京新能源汽车股份有限公司 | 一种随机数的处理方法、装置及汽车 |
-
1996
- 1996-12-18 JP JP8338583A patent/JPH10177472A/ja active Pending
Cited By (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2002541518A (ja) * | 1999-03-30 | 2002-12-03 | ドイッチェ テレコム アーゲー | 識別番号を導出する方法 |
| CN100561546C (zh) | 2008-01-28 | 2009-11-18 | 和舰科技(苏州)有限公司 | 循环扩散偏移转码加密方法 |
| CN113138751A (zh) * | 2020-01-17 | 2021-07-20 | 北京新能源汽车股份有限公司 | 一种随机数的处理方法、装置及汽车 |
| CN113138751B (zh) * | 2020-01-17 | 2023-06-09 | 北京新能源汽车股份有限公司 | 一种随机数的处理方法、装置及汽车 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US5758152A (en) | Method and apparatus for the generation and manipulation of data structures | |
| US5787432A (en) | Method and apparatus for the generation, manipulation and display of data structures | |
| EP0074401B1 (en) | Method and apparatus for sequencing addresses of a fast fourier transform array | |
| US6567832B1 (en) | Device, method, and storage medium for exponentiation and elliptic curve exponentiation | |
| KR20190106673A (ko) | 연상 메모리 내의 장비트 가산 및 장비트 승산을 위한 시스템 및 방법 | |
| US7831650B2 (en) | Method for modular multiplication | |
| Assayag et al. | An object oriented visual environment for musical composition | |
| CN1080411A (zh) | 在模糊逻辑运算中决定组内资格的电路和方法 | |
| JPH10177472A (ja) | 乱数列の発生方法 | |
| US20020007385A1 (en) | Computer algebra system and method | |
| US5519646A (en) | Calculator with display of processing for mulas as processing progresses | |
| WO2003096180A2 (en) | Fast multiplication circuits | |
| JPS6118023A (ja) | キ−入力制御装置 | |
| US4951033A (en) | Input device of character data | |
| Simon | Division in idealized unit cost RAMs | |
| US5214599A (en) | Advanced dimensional processing with division | |
| JPS58129653A (ja) | 乗算方式 | |
| US7672989B2 (en) | Large number multiplication method and device | |
| JP2737933B2 (ja) | 除算装置 | |
| Bolchini et al. | Evolving classifiers on field programmable gate arrays: Migrating XCS to FPGAs | |
| JPH03240144A (ja) | 可変長データメモリインタフェース回路 | |
| JPH0749769A (ja) | べき乗演算装置 | |
| JPH09292978A (ja) | 周期性を考慮したカオス的乱数列の発生装置 | |
| JP2980588B1 (ja) | 乱数発生方法及び暗号通信方法並びに乱数発生プログラムを記憶した記憶媒体 | |
| JPH02114325A (ja) | 乗算器 |