(57)【要約】  高速に置換処理を行う。要素数決定部（２２）は、各振り分け先に含まれる要素の数を計算する。開始位置決定部（２３）は、各振り分け先に対応する開始位置を計算する。振り分け先決定部（２４）は、バッファ内の振り分け先を表す値の列を計算する。置換生成部（２５）は、各振り分け先の中での置換先を表す値の列を計算する。初期位置設定部（３１）は、各振り分け先に対応する処理中の位置を示す値に開始位置を設定する。並べ替え部（３２）は、バッファの各振り分け先へベクトルの要素を設定する。置換実行部（３３）は、各振り分け先に対して任意の逆置換アルゴリズムを実行することで出力ベクトルを生成する。
2019073858.tif 000002
【特許請求の範囲】
【請求項１】
Dを所定の分割数とし、a→を長さmのベクトルとし、b→をバッファ内の振り分け先を表すD未満の値の列とし、x→を各振り分け先の中での置換先を表す値の列とし、d→を長さmのバッファを表すベクトルとし、iを0以上D未満の各整数とし、jを0以上m未満の各整数とし、Siをi番目の振り分け先に対応する開始位置とし、Niをi番目の振り分け先に含まれる要素の数とし、
各整数iについて、i番目の振り分け先に対応する処理中の位置を示す値Piに上記開始位置Siを設定する初期位置設定部と、
各整数jについて、上記バッファd→のPb_j番目の要素dP_b_jへ上記ベクトルa→のj番目の要素ajを設定する並べ替え部と、
各整数iについて、上記バッファd→のSi番目の要素からNi個の要素dS_i, …, dS_i+N_i-1に対して上記列x→のSi番目の要素からNi個の要素を用いて任意の逆置換アルゴリズムを実行することで、出力ベクトルc→のSi番目の要素からNi個の要素cS_i, …, cS_i+N_i-1を生成する置換実行部と、
を含む置換装置。
【請求項２】
Dを所定の分割数とし、a→を長さmのベクトルとし、b→をバッファ内の振り分け先を表すD未満の値の列とし、x→を各振り分け先の中での置換先を表す値の列とし、d→を長さmのバッファを表すベクトルとし、iを0以上D未満の各整数とし、jを0以上m未満の各整数とし、Siをi番目の振り分け先に対応する開始位置とし、Niをi番目の振り分け先に含まれる要素の数とし、
各整数iについて、上記ベクトルa→のSi番目の要素からNi個の要素に対して上記列x→のSi番目の要素からNi個の要素を用いて任意の置換アルゴリズムを実行することで、上記バッファd→のSi番目の要素からNi個の要素dS_i, …, dS_i+N_i-1を設定する置換実行部と、
各整数iについて、i番目の振り分け先に対応する処理中の位置を示す値Piに上記開始位置Siを設定する初期位置設定部と、
各整数jについて、出力ベクトルc→のj番目の要素cjへ上記バッファd→のPb_j番目の要素dP_b_jを設定する並べ替え部と、
を含む置換装置。
【請求項３】
請求項１または２に記載の置換装置であって、
D未満のm個の乱数bjを生成して上記列b→とする振り分け先決定部と、
各整数iについて、上記列b→における整数iの出現数を集計することで上記要素数Niを決定する要素数決定部と、
各整数iについて、Si:=Σj<iNjを計算することで上記開始位置Siを決定する開始位置決定部と、
任意のランダム置換アルゴリズムにより上記列x→を生成する置換生成部と、
をさらに含む置換装置。
【請求項４】
請求項１または２に記載の置換装置であって、
π→:=(π0, π1, …, πm-1)を長さmの置換とし、q:=m/Dとし、r:=m mod Dとし、
各整数iについて、Ni:=q+(i<r?1:0)を計算することで上記要素数Niを決定する要素数決定部と、
各整数iについて、Si:=iq+min(r, i)を計算することで上記開始位置Siを決定する開始位置決定部と、
各整数jについて、上記置換π→のj番目の要素πjのqによる商をk'とし、その余りをsとし、bj:=k'-(s<min(r, k')?1:0)を計算することで上記列b→を生成する振り分け先決定部と、
各整数jについて、xP_b_j:=πj-Sjを計算することで上記列x→を生成する置換生成部と、
をさらに含む置換装置。
【請求項５】
Dを所定の分割数とし、a→を長さmのベクトルとし、b→をバッファ内の振り分け先を表すD未満の値の列とし、x→を各振り分け先の中での置換先を表す値の列とし、d→を長さmのバッファを表すベクトルとし、iを0以上D未満の各整数とし、jを0以上m未満の各整数とし、Siをi番目の振り分け先に対応する開始位置とし、Niをi番目の振り分け先に含まれる要素の数とし、
初期位置設定部が、各整数iについて、i番目の振り分け先に対応する処理中の位置を示す値Piに上記開始位置Siを設定し、
並べ替え部が、各整数jについて、上記バッファd→のPb_j番目の要素dP_b_jへ上記ベクトルa→のj番目の要素ajを設定し、
置換実行部が、各整数iについて、上記バッファd→のSi番目の要素からNi個の要素dS_i, …, dS_i+N_i-1に対して上記列x→のSi番目の要素からNi個の要素を用いて任意の逆置換アルゴリズムを実行することで、出力ベクトルc→のSi番目の要素からNi個の要素cS_i,…, cS_i+N_i-1を生成する、
置換方法。
【請求項６】
Dを所定の分割数とし、a→を長さmのベクトルとし、b→をバッファ内の振り分け先を表すD未満の値の列とし、x→を各振り分け先の中での置換先を表す値の列とし、d→を長さmのバッファを表すベクトルとし、iを0以上D未満の各整数とし、jを0以上m未満の各整数とし、Siをi番目の振り分け先に対応する開始位置とし、Niをi番目の振り分け先に含まれる要素の数とし、
置換実行部が、各整数iについて、上記ベクトルa→のSi番目の要素からNi個の要素に対して上記列x→のSi番目の要素からNi個の要素を用いて任意の置換アルゴリズムを実行することで、上記バッファd→のSi番目の要素からNi個の要素dS_i, …, dS_i+N_i-1を設定し、
初期位置設定部が、各整数iについて、i番目の振り分け先に対応する処理中の位置を示す値Piに上記開始位置Siを設定し、
並べ替え部が、各整数jについて、出力ベクトルc→のj番目の要素cjへ上記バッファd→のPb_j番目の要素dP_b_jを設定する、
置換方法。
【請求項７】
請求項１から４のいずれかに記載の置換装置としてコンピュータを機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、置換処理を高速に行う技術に関する。
【背景技術】
【０００２】
置換技術はコンピュータ等での基本的なデータ処理の一つであり、様々な場面で利用されている。従来の置換技術としては、置換情報に記載された位置へ順番にデータを移動する自明な置換や、配列をランダムに入れ替えるFisher-Yatesアルゴリズム（例えば、非特許文献１参照）などが知られている。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】Fisher, Ronald A., Yates, Frank, "Statistical tables for biological, agricultural and medical research",Oliver & Boyd, pp. 26-27, 1938.
【発明の概要】
【発明が解決しようとする課題】
【０００４】
従来の置換技術では、置換処理を行う際にIOアクセスがランダムアクセスとなる。また、対象データがキャッシュメモリより大きいと非キャッシュメモリへのアクセスが発生する。通常、キャッシュメモリと非キャッシュメモリとでは１桁以上、シーケンシャルアクセスとランダムアクセスとでは１桁以上速度が異なる。そのため、従来の置換技術では、対象データが大きい場合、非キャッシュメモリへのランダムアクセスが発生し、処理が低速になるという課題がある。【０００５】
この発明の目的は、上記のような点を鑑みて、従来よりも高速に置換処理を行うことができる置換技術を提供することである。
【課題を解決するための手段】
【０００６】
上記の課題を解決するために、この発明の第一の態様の置換装置は、Dを所定の分割数とし、a→を長さmのベクトルとし、b→をバッファ内の振り分け先を表すD未満の値の列とし、x→を各振り分け先の中での置換先を表す値の列とし、d→を長さmのバッファを表すベクトルとし、iを0以上D未満の各整数とし、jを0以上m未満の各整数とし、Siをi番目の振り分け先に対応する開始位置とし、Niをi番目の振り分け先に含まれる要素の数とし、各整数iについて、i番目の振り分け先に対応する処理中の位置を示す値Piに開始位置Siを設定する初期位置設定部と、各整数jについて、バッファd→のPb_j番目の要素dP_b_jへベクトルa→のj番目の要素ajを設定する並べ替え部と、各整数iについて、バッファd→のSi番目の要素からNi個の要素dS_i, …, dS_i+N_i-1に対して列x→のSi番目の要素からNi個の要素を用いて任意の逆置換アルゴリズムを実行することで、出力ベクトルc→のSi番目の要素からNi個の要素cS_i, …, cS_i+N_i-1を生成する置換実行部と、を含む。【０００７】
上記の課題を解決するために、この発明の第二の態様の置換装置は、Dを所定の分割数とし、a→を長さmのベクトルとし、b→をバッファ内の振り分け先を表すD未満の値の列とし、x→を各振り分け先の中での置換先を表す値の列とし、d→を長さmのバッファを表すベクトルとし、iを0以上D未満の各整数とし、jを0以上m未満の各整数とし、Siをi番目の振り分け先に対応する開始位置とし、Niをi番目の振り分け先に含まれる要素の数とし、各整数iについて、ベクトルa→のSi番目の要素からNi個の要素に対して列x→のSi番目の要素からNi個の要素を用いて任意の置換アルゴリズムを実行することで、バッファd→のSi番目の要素からNi個の要素dS_i, …, dS_i+N_i-1を設定する置換実行部と、各整数iについて、i番目の振り分け先に対応する処理中の位置を示す値Piに開始位置Siを設定する初期位置設定部と、各整数jについて、出力ベクトルc→のj番目の要素cjへバッファd→のPb_j番目の要素dP_b_jを設定する並べ替え部と、を含む。
【発明の効果】
【０００８】
この発明によれば、事前に置換の対象データをキャッシュに収まるバッファに振り分ける処理を行うことで、非キャッシュメモリへのランダムアクセスを抑えることができるため、従来よりも高速に置換処理を行うことができる。
【図面の簡単な説明】
【０００９】
【図１】図１は、第一実施形態の置換装置の機能構成を例示する図である。
【図２】図２は、第一実施形態の置換方法の処理手続きを例示する図である。
【図３】図３は、第二実施形態の置換装置の機能構成を例示する図である。
【図４】図４は、第二実施形態の置換方法の処理手続きを例示する図である。
【図５】図５は、第三実施形態の置換装置の機能構成を例示する図である。
【図６】図６は、第三実施形態の置換方法の処理手続きを例示する図である。
【図７】図７は、第四実施形態の置換装置の機能構成を例示する図である。
【図８】図８は、第四実施形態の置換方法の処理手続きを例示する図である。
【図９】図９は、第五実施形態の置換装置の機能構成を例示する図である。
【図１０】図１０は、第五実施形態の置換方法の処理手続きを例示する図である。
【発明を実施するための形態】
【００１０】
本明細書中で使用する「x→」はベクトルxまたは列xを表す。「→」の直前の文字に対する下付き添え字はベクトルまたは列中の要素の番号を表す。例えば、「xi」は、ベクトルx→のi番目の要素を表す。
【００１１】
下付き添え字の中で使用する記号「_」は、直後の文字を下付き添え字とすることを表す。例えば、Ab_cは、Aにbcが下付き添え字として付くことを表している。同様に、AB_c_dは、AにBc_dが下付き添え字として付くことを表している。
【００１２】
本発明の置換技術は、m（≧2）個のデータを置換する際に、キャッシュに収まる大きさのD（≧2）個のバッファに粗く振り分ける処理をE（≧1）回実行し（この部分は非キャッシュメモリへのシーケンシャルアクセス処理である）、m/DE個のデータでのキャッシュヒット率が十分に高くなったところでランダムアクセスを伴う通常の置換（この部分はキャッシュメモリへのランダムアクセス処理である）に切り替え、低速な非キャッシュメモリへのランダムアクセスを抑えることで高速な置換を実現する。以降、Dは分割数と呼び、Eは再帰深さと呼ぶ。
【００１３】
“キャッシュに収まるD個のバッファ”とは、D個の各バッファのサイズがキャッシュメモリのサイズ以下という意味ではない。プログラムがある記憶領域にアクセスしたとき、キャッシュ機構はその周辺のデータをキャッシュに格納する。その格納単位をXとし、キャッシュサイズをCとすれば、アクセス箇所がC/X個程度に限定されれば、キャッシュは常にヒットすることになる。また、D箇所それぞれでシーケンシャルアクセスを行えば、各箇所でシーケンシャルにアクセスしてキャッシュに入っていない領域に突入したときのみのキャッシュミスとなり、この場合は通常のシーケンシャルアクセスと同じ速度となる。したがって、DはC/X程度の値とすることが望ましい。
【００１４】
上述したとおり、キャッシュメモリと非キャッシュメモリとでは１桁以上、またシーケンシャルアクセスとランダムアクセスとでは１桁以上速度が異なる。そのため、非キャッシュメモリへのランダムアクセスを１回行う従来技術よりも、非キャッシュメモリへのシーケンシャルアクセスを数回とキャッシュメモリへのランダムアクセスを１回行う本発明の方が高速である。例えば、４バイトのデータ100万個で、キャッシュメモリが256キロバイト、キャッシュの格納単位が16キロバイトのとき、データサイズは４メガバイトでキャッシュヒット率は８％ほどになる。一方、分割数Dを16とし、再帰深さEを１として本発明による置換を行うと、１回のシーケンシャルアクセス相当の処理でデータを16分割して256キロバイトずつに分割でき、残りの処理をキャッシュヒット率がほぼ100％のランダムアクセスとすることができる。これにより、最も遅い非キャッシュメモリへのランダムアクセスを回避することができる。
【００１５】
本発明の方法でランダム置換を行う場合のアルゴリズム（Scheme 1）を以下に示す。分割はランダムに行われるため、分割後のバッファの各部分のサイズは不定である。ただし、mの値が十分に大きければ非常に高い確率で各部分のサイズがそれぞれm/D付近のサイズになる。また、本発明を適用するのはデータがキャッシュに収まらない場合であるため、元々mは大きい前提である。
【００１６】
再帰深さEは、データ数mの大きさに依存して定める。バッファの各部分のサイズ（上記の例ではm/D程度）がキャッシュに収まる大きさであれば、E=1とする。バッファの各部分のサイズがキャッシュに収まらない場合、E≧2として、キャッシュに収まるサイズになるまで各部分のデータを対象として再帰的にアルゴリズムを実行すればよい。
【００１７】
Scheme 1  ランダム置換アルゴリズム
入力：長さmのベクトルa→、再帰深さE（≧1）
パラメータ：分割数D（≧2）
出力：一様ランダムに置換されたπa→
1: ランダム置換生成
2:   D未満のm個の乱数b0, b1, …, bm-1を生成しb→:=(b0, b1, …, bm-1)とする。
3:   b→のうち、各i<Dについて、iが何個現れたか集計しNiとする。
4: 置換実施
5:   各i<Dで、Si=Pi:=Σj<iNjとする。ただしS0=P0:=0とする。
6:   for j=0 to m-1
7:     dP_b_j:=ajとする。
8:     Pb_j:=Pb_j+1とする。
9:   for i=0 to D-1
10:     dS_i, …, dS_i+N_i-1を入力ベクトルとして、E≧2なら再帰深さをE-1としてScheme 1を再帰的に実行する。E=1なら任意のランダム置換アルゴリズムを実行し、結果として得られる置換後のベクトルcS_i, …, cS_i+N_i-1を出力する。
【００１８】
本発明は、ランダムでない置換に適用することもできる。その場合、以下に示すアルゴリズム（Scheme 2）を用いて本発明の処理手続きに合致するように与えられた通常の置換を振り分け先を表す値の列と振り分け先の中での置換先を表す値の列とに形式変換する。
【００１９】
Scheme 2  通常の置換からの形式変換アルゴリズム
入力：通常の置換π→
出力：振り分け先を表すD未満の値の列b→、振り分け先の中での置換先を表す値の列x→
1: q:=m/D
2: r:=m mod D
3: 各i<Dで、Si=Pi:=iq+min(r, i)とおく。
4: for j=0 to m-1
5:   πjのqによる商をk'とおき、余りをsとおく。
6:   bj:=k'-(s<min(r, k')?1:0)とする。
7:   xP_b_j:=πj-Sjとする。
8:   Pb_j:=Pb_j+1と更新する。
ただし、「?1:0」は直前の命題が真の場合は１、偽の場合は０とする演算子である。
【００２０】
Scheme 2の中で商k'と余りsを求めているが、そのまま除算で計算すると低速になってしまう。そのため、qが反復中は固定であることを利用し、除算を乗算に変換する方法を用いることが望ましい。例えば、Mは一定以上の桁の２べき数とし、qp≧Mを満たす最小のpを計算し、πj÷qをπjp>>Mにより計算する(>>はシフト演算)。qp≒Mであるため、pはほぼqの逆数Mとなる。除算を乗算に変換する方法は、例えば、下記参考文献１に記載されている。
【００２１】
〔参考文献１〕Torbjorn Granlund, Peter L. Montgomery, "Division by invariant integers using multiplication", PLDI 1994, pp. 61-72.
【００２２】
上記のScheme 2を適用すると、長さmをD箇所の部分に均等に振り分けるための振り分け先を表す値の列b→と、各振り分け先の中での置換先を表す値の列x→が出力される。なお、“長さmをD箇所の部分に均等に振り分ける”とは、例えば、m=80のとき、D=16だと５要素ずつの部分に分割し、その中で例えば置換先が６番である値は、16箇所のうち１番目の部分、つまり全体で５〜９番に当たる部分へ出現順に移動する、ということである。なお、ここでは、順番はすべて０スタートである。
【００２３】
以下で説明するScheme 3, 4では、Ni, Siを用いるが、Scheme 2とScheme 3, 4とを組み合わせて実行する場合、Ni, Siを以下として実行すればよい。
【００２４】
各i番目の部分の要素数：Ni=q+(i<r?1:0)
各i番目の部分の開始位置：Si=iq+min(r, i)
【００２５】
この方法が適用できるのはm≧256のときであるが、前述したように、mはかなり大きい値である前提のため問題とはならない。Ni, Siが上記となることの証明は後述する。
【００２６】
例えばE=1のときのScheme 1において、Scheme 2で生成した振り分け先を表す値の列b→をScheme 1のステップ１で生成するランダム置換b→の代わりに用い、さらにScheme 1のステップ10のi番目の置換においてSi番目の要素からNi個の要素を置換として逆置換を行うと、a→を置換として見て逆置換を行ったときと同じ結果となる。各iに対してx→のSi番目の要素からNi個の要素が置換になっているため、再帰的にScheme 2を行うことで、E≧2のときのScheme 1に対応する置換を生成することができる。なお、置換は入力のどの位置から値を取得するかを記述する形式のときに通常の置換になるため、Scheme 2とScheme 1とを組み合わせたときは逆写像である逆置換となることに注意すべきである。
【００２７】
具体的に、E=1の場合にScheme 2の出力を使って逆置換するアルゴリズム（Scheme 3）を以下に示す。E≧2の場合、Scheme 3のステップ７で実行する任意の逆置換アルゴリズムをScheme 3自身として再帰的に処理すればよい。
【００２８】
Scheme 3  逆置換アルゴリズム
入力：長さmのベクトルa→、振り分け先を表すD未満の値の列b→、振り分け先の中での置換先を表す値の列x→、再帰深さE（≧1）
パラメータ：分割数D（≧2）
出力：a→をb→, x→で逆置換した列c→
1: 長さmのバッファd→を確保する。
2: 各i<Dで、Pi:=Siとする。
入力されたb→, x→がScheme 1を用いて生成したものである場合、Si:=Σj<iNjを計算すればよい。このとき、NiはScheme 1で生成したものを記憶しておけばよい。
入力されたb→, x→がScheme 2を用いて生成したものである場合、Si:= iq+min(r, i)を計算すればよい。このとき、q, rは、q:=m/D, r:=m mod Dにより計算すればよい。
3: for j=0 to m-1
4:   dP_b_j:=ajとする。
5:   Pb_j:=Pb_j+1とする。
6:   for i=0 to D-1
7:     dS_i, …, dS_i+N_i-1を入力ベクトルとして、E≧2なら再帰深さをE-1としてScheme 3を再帰的に実行する。E=1なら任意の逆置換アルゴリズムを実行し、結果として得られる置換後のベクトルcS_i, …, cS_i+N_i-1を出力する。
【００２９】
なお、ステップ６〜７の繰り返しは並列に処理することができる。
【００３０】
具体的に、E=1の場合にScheme 2の出力を使って置換するアルゴリズム（Scheme 4）を以下に示す。E≧2の場合、Scheme 3と同様に、Scheme 4のステップ３で実行する任意の置換アルゴリズムをScheme 4自身として再帰的に処理すればよい。
【００３１】
Scheme 4  置換アルゴリズム
入力：長さmのベクトルa→、振り分け先を表すD未満の値の列b→、振り分け先の中での置換先を表す値の列x→、再帰深さE（≧1）
パラメータ：分割数D（≧2）
出力：a→をb→, x→で逆置換した列c→
1: 長さmのバッファd→を確保する。
2: for i=0 to D-1
3:   aS_i, …, aS_i+N_i-1とxS_i, …, xS_i+N_i-1とを入力ベクトルとして、E≧2なら再帰深さをE-1としてScheme 4を再帰的に実行する。E=1なら任意の置換アルゴリズムを実行し、結果として得られる置換後のベクトルdS_i, …, dS_i+N_i-1を出力する。
入力されたb→, x→がScheme 1を用いて生成したものである場合、NiはScheme 1で生成したものを記憶しておき、Si:=Σj<iNjを計算すればよい。
入力されたb→, x→がScheme 2を用いて生成したものである場合、Si:= iq+min(r, i), Ni=q+(i<r?1:0)を計算すればよい。このとき、q, rは、q:=m/D, r:=m mod Dにより計算すればよい。
4: 各i<Dで、Pi:=Siとする。
5: for j=0 to m-1
6:   cj:=dP_b_jとする。
7:   Pb_j:=Pb_j+1とする。
【００３２】
なお、ステップ２〜３の繰り返しは並列に処理することができる。一方、ステップ５〜７の繰り返しは並列に処理することはできない。
【００３３】
＜証明＞
Scheme 2とScheme 3, 4とを組み合わせて実行する場合に、Ni, Siが上述した値となることの証明を以下に示す。
【００３４】
ある移動先j=k'q+sの要素がk番目のバッファに格納される必要十分条件は、処理の定義から以下となる。
【００３５】
(k'=k∧s≧min(r, k'))∨(k'=k+1∧s<min(r, k'))
k'=kとk'=k+1が排反だから、∨で挟まれた左項と右項は排反であり、k番目のバッファに格納される要素数は左項を満たすjと右項を満たすjの数の和となる。
【００３６】
左項を考える。k'=kを満たすjについて考えると、k'=kなのでmin(r, k')=min(r, k)である。k≧rのとき、min(r, k)=rであり、s≧min(r, k)⇔s≧rである。k<rのときは同様にs≧kであり、左項は
k'=k∧((k≧r∧s≧r)∨(k<r∧s≧k))
と同値となる。右項を考えると同様に、
k'=k+1∧((k≧r∧s<r)∨(k<r∧s<k+1))
と同値となる。合計して、k≧rのとき
(k'=k∧s≧r)∨(k'=k+1∧s<r)
k < r のとき
(k'=k∧s≧k)∨(k'=k+1∧s<k+1)
となる。ここで、m≧256のときq≧16である。
【００３７】
(i) mが16の倍数でないときk'≦16であり、k'=16を満たすjは、j=16q, 16q+1, …, 16q+r-1である（mが16の倍数でないのでr>0であることに注意）。
【００３８】
上記は背理法による。k'≧17とすると、q≧16よりk'q>16q+r=mとなり矛盾する。k'=16にならないとすると、jの最大値はm-1だから、m-1≦15q+(q-1)となり、m=16q+rに矛盾する。よってk'≦16であり、m-1=16q+r-1に注意すると、k'=16を満たすjはj=16q, 16q+1, …,16q+r-1である。
【００３９】
k≦15のとき、sは0〜q-1の全ての値をとり、k'=kとなるjはq個でsとなる。このとき、k'=k∧s≧rを満たすjの数はq-r個、k'=k∧s≧kを満たすjの数はq-k個となる。
【００４０】
k≦14のとき、k'=k+1∧s<rを満たすjの数はr個、k'=k+1∧s<k+1を満たすjの数はk+1個となる。よってk≦14では、k<rのときjの個数はq+1個、k≧rのときq個となる。
【００４１】
k=15では、常にk≧rであり、k'=k∧s≧rを満たすjの数はq-r個で、k'=16を満たすjはj=16q, 16q+1, …, 16q+r-1だから、s<rとなるjはr個である。よってk=15となるjの個数はq個である。するとk≦15で、k<rでq+1個、k≧rでq個なので、q+(k<r?1:0)に等しい。なおk≦15の合計が16q+rになるので、k=16の個数は0である。
【００４２】
(ii) mが16の倍数のとき、r=0だから、s<min(r, k')は常に偽であり、k=k'となる。すると0番から15番目までの全てのバッファで、jの個数はq個である。rが0なのでk<rも常に偽で、q+(k<r?1:0)=qなので命題は正しい。
【００４３】
以下、この発明の実施の形態について詳細に説明する。なお、図面中において同じ機能を有する構成部には同じ番号を付し、重複説明を省略する。
【００４４】
＜第一実施形態＞
本発明の第一実施形態は、Scheme 1に示したランダム置換を実行する置換装置および方法である。
【００４５】
第一実施形態の置換装置１は、図１に例示するように、振り分け先決定部１１、要素数決定部１２、開始位置決定部１３、初期位置設定部１４、並べ替え部１５、および置換実行部１６を含む。置換装置１は、長さmのベクトルa→:=(a0, a1, …, am-1)と、再帰深さE（≧1）とを入力とし、ベクトルa→を一様ランダムに置換した出力ベクトルc→を出力する。この置換装置１が、図２に例示する各ステップの処理を行うことにより第一実施形態の置換方法が実現される。
【００４６】
置換装置１は、例えば、中央演算処理装置（CPU: Central Processing Unit）、主記憶装置（RAM: Random Access Memory）などを有する公知又は専用のコンピュータに特別なプログラムが読み込まれて構成された特別な装置である。置換装置１は、例えば、中央演算処理装置の制御のもとで各処理を実行する。置換装置１に入力されたデータや各処理で得られたデータは、例えば、主記憶装置に格納され、主記憶装置に格納されたデータは必要に応じて中央演算処理装置へ読み出されて他の処理に利用される。置換装置１の各処理部は、少なくとも一部が集積回路等のハードウェアによって構成されていてもよい。
【００４７】
図２を参照して、第一実施形態の置換装置１が実行する置換方法について説明する。
【００４８】
ステップＳ１１において、振り分け先決定部１１は、D未満のm個の乱数b0, b1, …, bm-1を生成し、乱数の列b→:=(b0, b1, …, bm-1)を生成する。乱数b0, b1, …, bm-1は、置換対象となるベクトルa→の各要素a0, a1, …, am-1をバッファ内で振り分けるときの振り分け先を表す値である。
【００４９】
ステップＳ１２において、要素数決定部１２は、0以上D未満の各整数iについて、列b→における整数iの出現数を集計することで、i番目の振り分け先の要素数Niを決定する。
【００５０】
ステップＳ１３において、開始位置決定部１３は、0以上D未満の各整数iについて、Si:=Σj<iNjを計算することで、i番目の振り分け先に対応する開始位置Siを決定する。ただし、S0:=0とする。
【００５１】
ステップＳ１４において、初期位置設定部１４は、0以上D未満の各整数iについて、バッファのi番目の振り分け先に対応する処理中の位置を示す値Piにi番目の振り分け先の開始位置Siを設定する。すなわち、Pi:=Siを計算する。
【００５２】
ステップＳ１５において、並べ替え部１５は、あらかじめ確保しておいた長さmのバッファを表すベクトルd→:=(d0, d1, …, dm-1)に対して、乱数の列b→に従って、長さmのベクトルa→の各要素を設定する。具体的には、0以上m未満の各整数jについて、バッファd→のPb_j番目の要素へベクトルa→のj番目の要素ajを設定する。すなわち、dP_b_j:=ajを計算する。その後、Pb_j:=Pb_j+1と更新する。
【００５３】
ステップＳ１６において、置換実行部１６は、0以上D未満の各整数iについて、E≧2の場合には、ベクトルd→のSi番目の要素からNi個の要素dS_i, …, dS_i+N_i-1を入力ベクトルとし、再帰深さEをE-1として、ステップＳ１１〜Ｓ１６を再帰的に実行する。E=1の場合には、ベクトルd→のSi番目の要素からNi個の要素dS_i, …, dS_i+N_i-1に対して任意の逆置換アルゴリズムを実行することで、出力ベクトルc→:=(c0, c1, …, cm-1)のSi番目の要素からNi個の要素cS_i, …, cS_i+N_i-1を生成する。
【００５４】
＜第二実施形態＞
本発明の第二実施形態は、Scheme 2に示した形式変換により生成されたバッファ内の振り分け先を表す値の列と各振り分け先の中での置換先の列とを用いてScheme 3に示した逆置換を実行する置換装置および方法である。
【００５５】
第二実施形態の置換装置２は、図３に例示するように、除算部２１、要素数決定部２２、開始位置決定部２３、振り分け先決定部２４、置換生成部２５、初期位置設定部３１、並べ替え部３２、および置換実行部３３を含む。置換装置２は、長さmのベクトルa→:=(a0, a1, …, am-1)と、長さmの置換π→:=(π0, π1, …, πm-1)とを入力とし、ベクトルa→を置換π→に従って置換した後のベクトルc→:=(c0, c1, …, cm-1)を出力する。この置換装置２が、図４に例示する各ステップの処理を行うことにより第二実施形態の置換方法が実現される。
【００５６】
図４を参照して、第二実施形態の置換装置２が実行する置換方法について説明する。
【００５７】
ステップＳ２１において、除算部２１は、q:=m/D, r:=m mod Dを計算する。
【００５８】
ステップＳ２２において、要素数決定部２２は、0以上D未満の各整数iについて、Ni:=q+(i<r?1:0)を計算することで、i番目の振り分け先に含まれる要素の数Niを決定する。
【００５９】
ステップＳ２３において、開始位置決定部２３は、0以上D未満の各整数iについて、Si:=iq+min(r, i)を計算することで、i番目の振り分け先に対応する開始位置Siを決定する。
【００６０】
ステップＳ２４において、振り分け先決定部２４は、0以上m未満の各整数jについて、πjのqによる商をk'とおき、余りをsとおき、bj:=k'-(s<min(r, k')?1:0)を計算し、バッファ内の振り分け先を表す値の列b→:=(b0, b1, …, bm-1)を生成する。
【００６１】
ステップＳ２５において、置換生成部２５は、0以上m未満の各整数jについて、xP_b_j:=πj-Sjを計算し、各振り分け先の中での置換先を表す値の列x→:=(x0, x1, …, xm-1)を生成する。
【００６２】
ステップＳ３１において、初期位置設定部３１は、0以上D未満の各整数iについて、バッファのi番目の振り分け先に対応する処理中の位置を示す値Piにi番目の振り分け先の開始位置Siを設定する。すなわち、Pi:=Siを計算する。
【００６３】
ステップＳ３２において、並べ替え部３２は、あらかじめ確保しておいた長さmのバッファを表すベクトルd→:=(d0, d1, …, dm-1)に対して、バッファ内の振り分け先を表す値の列b→に従って、長さmのベクトルa→の各要素を設定する。具体的には、0以上m未満の各整数jについて、バッファd→のPb_j番目の要素へベクトルa→のj番目の要素ajを設定する。すなわち、dP_b_j:=ajを設定する。その後、Pb_j:=Pb_j+1と更新する。
【００６４】
ステップＳ３３において、置換実行部３３は、0以上D未満の各整数iについて、ベクトルd→のSi番目の要素からNi個の要素dS_i, …, dS_i+N_i-1に対して任意の逆置換アルゴリズムを実行することで、出力ベクトルc→:=(c0, c1, …, cm-1)のSi番目の要素からNi個の要素cS_i, …, cS_i+N_i-1を生成する。
【００６５】
＜第三実施形態＞
本発明の第三実施形態は、Scheme 2に示した形式変換により生成されたバッファ内の振り分け先を表す値の列と各振り分け先の中での置換先を表す値の列とを用いてScheme 4に示した置換を実行する置換装置および方法である。
【００６６】
第三実施形態の置換装置３は、図５に例示するように、除算部２１、要素数決定部２２、開始位置決定部２３、振り分け先決定部２４、置換生成部２５、置換実行部４１、初期位置設定部４２、および並べ替え部４３を含む。置換装置３は、長さmのベクトルa→:=(a0, a1, …, am-1)と、長さmの置換π→:=(π0, π1, …, πm-1)とを入力とし、ベクトルa→を置換π→に従って置換した後のベクトルc→:=(c0, c1, …, cm-1)を出力する。この置換装置３が、図６に例示する各ステップの処理を行うことにより第三実施形態の置換方法が実現される。
【００６７】
図６を参照して、第三実施形態の置換装置３が実行する置換方法について説明する。以下では、上述の各実施形態との相違点を中心に説明する。
【００６８】
ステップＳ２１からステップＳ２５の処理は、第二実施形態と同様である。
【００６９】
ステップＳ４１において、置換実行部４１は、0以上D未満の各整数iについて、長さmのベクトルa→のSi番目の要素からNi個の要素に対して各振り分け先の中での置換先を表す値の列x→のSi番目の要素からNi個の要素を用いて任意の置換アルゴリズムを実行することで、あらかじめ確保しておいた長さmのベクトルd→:=(d0, d1, …, dm-1)のSi番目の要素からNi個の要素を設定する。
【００７０】
ステップＳ４２において、初期位置設定部４２は、0以上D未満の各整数iについて、バッファのi番目の振り分け先に対応する処理中の位置を示す値Piにi番目の振り分け先の開始位置Siを設定する。すなわち、Pi:=Siを計算する。
【００７１】
ステップＳ４３において、並べ替え部４３は、出力ベクトルc→:=(c0, c1, …, cm-1)に対して、バッファ内の振り分け先を表す値の列b→に従って、長さmのベクトルd→の各要素を設定する。具体的には、0以上m未満の各整数jについて、出力ベクトルc→のj番目の要素cjへバッファd→のPb_j番目の要素dP_b_jを設定する。すなわち、cj:=dP_b_jを設定する。その後、Pb_j:=Pb_j+1と更新する。
【００７２】
＜第四実施形態＞
本発明の第四実施形態は、Scheme 1により生成される２個のランダム置換（b→, x→）をバッファ内の振り分け先を表す値の列と各振り分け先の中での置換先を表す値の列とし、Scheme 3に示した逆置換を実行する置換装置および方法である。
【００７３】
第四実施形態の置換装置４は、図７に例示するように、振り分け先決定部１１、要素数決定部１２、開始位置決定部１３、置換生成部１７、初期位置設定部３１、並べ替え部３２、および置換実行部３３を含む。置換装置４は、長さmのベクトルa→:=(a0, a1, …, am-1)を入力とし、ベクトルa→を一様ランダムに置換した出力ベクトルc→を出力する。この置換装置４が、図８に例示する各ステップの処理を行うことにより第四実施形態の置換方法が実現される。
【００７４】
図８を参照して、第四実施形態の置換装置４が実行する置換方法について説明する。以下では、上述の各実施形態との相違点を中心に説明する。
【００７５】
ステップＳ１１からステップＳ１３の処理は、第一実施形態と同様である。
【００７６】
ステップＳ１７において、置換生成部１７は、0以上D未満の各整数iについて、任意の逆置換アルゴリズムを利用し、m個の置換πiを生成する。この置換πiを順に連結した値の列を各振り分け先の中での置換先を表す値の列x→として扱う。
【００７７】
ステップＳ３１からステップＳ３３の処理は、第二実施形態と同様である。
【００７８】
＜第五実施形態＞
本発明の第五実施形態は、Scheme 1により生成される２個のランダム置換（b→, x→）をバッファ内の振り分け先を表す値の列と各振り分け先の中での置換先を表す値の列とし、Scheme 4に示した置換を実行する置換装置および方法である。
【００７９】
第五実施形態の置換装置５は、図９に例示するように、振り分け先決定部１１、要素数決定部１２、開始位置決定部１３、置換生成部１７、置換実行部４１、初期位置設定部４２、および並べ替え部４３を含む。置換装置５は、長さmのベクトルa→:=(a0, a1, …, am-1)を入力とし、ベクトルa→を一様ランダムに置換した出力ベクトルc→を出力する。この置換装置５が、図１０に例示する各ステップの処理を行うことにより第五実施形態の置換方法が実現される。
【００８０】
図１０を参照して、第五実施形態の置換装置５が実行する置換方法について説明する。以下では、上述の各実施形態との相違点を中心に説明する。
【００８１】
ステップＳ１１からステップＳ１３の処理は、第四実施形態と同様である。
【００８２】
ステップＳ１７の処理は、第四実施形態と同様である。
【００８３】
ステップＳ４１からステップＳ４３の処理は、第三実施形態と同様である。
【００８４】
＜変形例＞
第一実施形態の置換装置によりランダム置換を実行し、何らかのデータ処理を行った後に、ランダム置換を元に戻すことが可能である。その場合、任意の置換アルゴリズムを実行する際に生成された置換πiを順に連結して各振り分け先の中での置換先を表す値の列x→とし、第一実施形態の置換装置を実行した際に生成されたバッファ内の振り分け先を表す値の列b→と共に用いて、第二実施形態および第四実施形態に示したステップＳ３１〜Ｓ３３の処理を実行すればよい。このとき、バッファ内の振り分け先を表す値の列b→と振り分け先の中での置換先を表す値の列x→とを置換装置内の図示していない記憶部等に保存しておき、適宜読み込んで利用するように構成することも可能である。
【００８５】
本発明のポイントは以下のとおりである。本発明は、非キャッシュのランダムアクセスよりも、処理量は増えてもシーケンシャルアクセス数回とキャッシュのランダムアクセス１回の方が高速であること、数カ所へのランダムアクセスであればシーケンシャルアクセス相当の速度でアクセスできること、を利用して高速な置換を実現している。また、通常の置換からの形式変換（Scheme 2）では、１要素につき乗算１回の他は、現代のコンピュータで最も高速な演算に類する加減比較演算数回のみで均等に振り分けられるように工夫されている。
【００８６】
このように構成することにより、本発明の置換技術は、以下の効果を奏する。非キャッシュのランダムアクセスがほぼ無くなり、高速に置換および逆置換処理を行うことができる。例えば、32bitのデータ100万件で、従来の自明な置換やFisher-Yatesアルゴリズムでは10Gbps程度の速度であるが、E=1のときの本発明では20Gbps程度、E=2のときの本発明では12Gbps程度である。1000万件では、従来技術では3Gbps程度であるが、E=1のときの本発明では10Gbps程度、E=2のときの本発明では12Gbps程度である。1億件では、従来技術では2Gbps程度であるが、E=1のときの本発明では5Gbps程度、E=2のときの本発明では10Gbps程度である。データ数が増えるとランダムアクセスの排除のためにはEを増やす必要があるが、Eを増やすと逆にアクセス回数自体は増加するため、データ量ごとに最適なEの値があることがわかる。
【００８７】
以上、この発明の実施の形態について説明したが、具体的な構成は、これらの実施の形態に限られるものではなく、この発明の趣旨を逸脱しない範囲で適宜設計の変更等があっても、この発明に含まれることはいうまでもない。実施の形態において説明した各種の処理は、記載の順に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。
【００８８】
［プログラム、記録媒体］
上記実施形態で説明した各装置における各種の処理機能をコンピュータによって実現する場合、各装置が有すべき機能の処理内容はプログラムによって記述される。そして、このプログラムをコンピュータで実行することにより、上記各装置における各種の処理機能がコンピュータ上で実現される。
【００８９】
この処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、例えば、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリ等どのようなものでもよい。
【００９０】
また、このプログラムの流通は、例えば、そのプログラムを記録したDVD、CD-ROM等の可搬型記録媒体を販売、譲渡、貸与等することによって行う。さらに、このプログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することにより、このプログラムを流通させる構成としてもよい。
【００９１】
このようなプログラムを実行するコンピュータは、例えば、まず、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、一旦、自己の記憶装置に格納する。そして、処理の実行時、このコンピュータは、自己の記憶装置に格納されたプログラムを読み取り、読み取ったプログラムに従った処理を実行する。また、このプログラムの別の実行形態として、コンピュータが可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することとしてもよく、さらに、このコンピュータにサーバコンピュータからプログラムが転送されるたびに、逐次、受け取ったプログラムに従った処理を実行することとしてもよい。また、サーバコンピュータから、このコンピュータへのプログラムの転送は行わず、その実行指示と結果取得のみによって処理機能を実現する、いわゆるASP（Application Service Provider）型のサービスによって、上述の処理を実行する構成としてもよい。なお、本形態におけるプログラムには、電子計算機による処理の用に供する情報であってプログラムに準ずるもの（コンピュータに対する直接の指令ではないがコンピュータの処理を規定する性質を有するデータ等）を含むものとする。
【００９２】
また、この形態では、コンピュータ上で所定のプログラムを実行させることにより、本装置を構成することとしたが、これらの処理内容の少なくとも一部をハードウェア的に実現することとしてもよい。
【図１】
2019073858.tif 000003
【図２】
2019073858.tif 000004
【図３】
2019073858.tif 000005
【図４】
2019073858.tif 000006
【図５】
2019073858.tif 000007
【図６】
2019073858.tif 000008
【図７】
2019073858.tif 000009
【図８】
2019073858.tif 000010
【図９】
2019073858.tif 000011
【図１０】
2019073858.tif 000012
【手続補正書】
【提出日】令和2年3月24日(2020.3.24)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】００３１
【補正方法】変更
【補正の内容】
【００３１】
Scheme 4  置換アルゴリズム
入力：長さmのベクトルa→、振り分け先を表すD未満の値の列b→、振り分け先の中での置換先を表す値の列x→、再帰深さE（≧1）
パラメータ：分割数D（≧2）
出力：a→をb→, x→で置換した列c→
1: 長さmのバッファd→を確保する。
2: for i=0 to D-1
3:   aS_i, …, aS_i+N_i-1とxS_i, …, xS_i+N_i-1とを入力ベクトルとして、E≧2なら再帰深さをE-1としてScheme 4を再帰的に実行する。E=1なら任意の置換アルゴリズムを実行し、結果として得られる置換後のベクトルdS_i, …, dS_i+N_i-1を出力する。
入力されたb→, x→がScheme 1を用いて生成したものである場合、NiはScheme 1で生成したものを記憶しておき、Si:=Σj<iNjを計算すればよい。
入力されたb→, x→がScheme 2を用いて生成したものである場合、Si:= iq+min(r, i), Ni=q+(i<r?1:0)を計算すればよい。このとき、q, rは、q:=m/D, r:=m mod Dにより計算すればよい。
4: 各i<Dで、Pi:=Siとする。
5: for j=0 to m-1
6:   cj:=dP_b_jとする。
7:   Pb_j:=Pb_j+1とする。
【国際調査報告】
2019073858.tif 000013
2019073858.tif 000014
2019073858.tif 000015
2019073858.tif 000016