(57)【要約】  ＺＤＮ法と同程度のステップ数で任意のビット数の入力に対してモンゴメリ乗算を実行する。整数ｘを冗長２進表現に変換する変換部１０２と、演算の中間結果の下位ビットから上位ビットに向けて連続する０の個数である第１シフト量を算出する第１シフト量算出部１０３ａと、冗長２進表現の整数ｘの下位ビットから上位ビットに向けて連続する０の個数をカウントし、カウントした個数に基づいて第２シフト量を算出する第２シフト量算出部１０３ｂと、第１シフト量だけビットシフトした中間結果と、第２シフト量だけビットシフトした整数ｙと、整数ｐと、を加減算した中間結果を算出し、算出した中間結果を第１シフト量算出部１０３ａに送出する加減算部１０４ｂと、第１シフト量の合計が整数ｐのビット数と一致したときの中間結果をモンゴメリ乗算結果ｚとして出力する出力部１０７とを備える。
2011036746.tif 000002
【特許請求の範囲】
【請求項１】
整数ｘと整数ｙとの積の整数ｐを法とするモンゴメリ乗算結果ｚを演算する演算装置であって、
前記整数ｘを冗長２進表現に変換する変換部と、
前記モンゴメリ乗算結果ｚの演算の中間結果の下位ビットから上位ビットに向けて連続する０の個数をカウントし、カウントした個数に基づいて第１シフト量を算出する第１シフト量算出部と、
冗長２進表現の前記整数ｘの下位ビットから上位ビットに向けて連続する０の個数をカウントし、カウントした個数に基づいて第２シフト量を算出する第２シフト量算出部と、
前記第１シフト量だけビットシフトした前記中間結果と、前記第２シフト量だけビットシフトした前記整数ｙと、前記整数ｐと、を加減算した前記中間結果を算出し、算出した前記中間結果を前記第１シフト量算出部に送出する加減算部と、
前記第１シフト量の合計が前記整数ｐのビット数と一致したときの前記中間結果を前記モンゴメリ乗算結果ｚとして出力する出力部と、
を備えることを特徴とする演算装置。
【請求項２】
前記第１シフト量算出部は、前記中間結果の最下位ビットから上位ビットに向けて、前記中間結果が算出されるごとに変更されるビット数のビットまでの間で連続する０の個数をカウントし、カウントした前記個数である前記第１シフト量を算出すること、
を特徴とする請求項１に記載の演算装置。
【請求項３】
前記第２シフト量算出部は、冗長２進表現の前記整数ｘに含まれるビットのうち、連続する０の個数のカウントの対象となったビットを表す処理済みビットと、前記処理済みビットの１つ上位の０でないビットとを除くビットを対象として、下位ビットから上位ビットに向けて連続する０の個数をカウントし、カウントした個数に基づいて前記第２シフト量を算出すること、
を特徴とする請求項１に記載の演算装置。
【請求項４】
前記加減算部は、前記第１シフト量だけビットシフトした前記中間結果と、前記第２シフト量だけビットシフトした前記整数ｙおよび冗長２進表現の前記整数ｘに含まれるビットのうち連続する０の個数のカウントの対象となったビットを表す処理済みビットの１つ上位のビットの値の積と、前記整数ｐと、を加減算した前記中間結果を算出し、算出した前記中間結果を前記第１シフト量算出部に送出すること、
を特徴とする請求項１に記載の演算装置。
【請求項５】
前記加減算部は、前記第１シフト量だけビットシフトした前記中間結果と、前記第２シフト量だけビットシフトした前記整数ｙとを加算した値に対して、前記中間結果に含まれるビットのうち、最下位ビットから前記第１シフト量＋１ビット目のビットの値が前記整数ｐの最下位ビットの値と一致するときは前記整数ｐを減算して前記中間結果を算出し、前記中間結果に含まれるビットのうち、最下位ビットから前記第１シフト量＋１ビット目のビットの値が前記整数ｐの最下位ビットの値と一致しないときは前記整数ｐを加算した前記中間結果を算出し、算出した前記中間結果を前記第１シフト量算出部に送出すること、
を特徴とする請求項１に記載の演算装置。
【請求項６】
前記冗長２進表現はＮＡＦ（Ｎｏｎ−Ａｄｊａｃｅｎｔ  Ｆｏｒｍ）であること、
を特徴とする請求項１に記載の演算装置。
【請求項７】
前記出力部は、前記合計が前記整数ｐのビット数と一致したときの前記中間結果が０より小さいときは、前記中間結果に前記整数ｐを加算した値を前記モンゴメリ乗算結果ｚとして出力し、前記合計が前記整数ｐのビット数と一致したときの前記中間結果がｐ以上のときは、前記中間結果から前記整数ｐを減算した値を前記モンゴメリ乗算結果ｚとして出力すること、
を特徴とする請求項１に記載の演算装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算装置に関する。
【背景技術】
【０００２】
整数同士の演算結果の剰余を取った結果を利用する有限体上の演算は、誤り訂正符号や暗号といった様々な分野に応用可能な基本技術として利用されている。応用分野が広いこともあって、乗算や剰余算を行う回路の高速化、小型化および省電力化などを実現するための多数の研究が行われている。剰余乗算とは、整数同士を掛けた結果を別の整数で割った余りを計算する演算である。剰余乗算を高速に実行するアルゴリズムとしては、例えばモンゴメリ乗算が知られている。【０００３】
モンゴメリ乗算を使用する場合、予め演算の対象となる有限体上の数をモンゴメリ空間上の数に写像しておいてから、モンゴメリ乗算を行い、その結果を有限体上の数に逆写像することで本来求めたかった結果を求めることができる。変換と逆変換の手間が必要なので、モンゴメリ乗算を１回の剰余乗算に対して使用するのはコストが大きくなるが、べき乗剰余演算のように連続して複数回の剰余乗算を行うために使用するのに向いている。【０００４】
モンゴメリ乗算の実現方法は大まかに２種類の実現方法がある。１つ目はワード乗算器を使用する実現方法である。１ワードを例えば３２ビットとすると、３２ビット×３２ビットの乗算結果６４ビットを求めることのできる３２ビット乗算器を用いる方法である。この場合、法のワード数をＭとすると２×Ｍ＾２＋Ｍ回の乗算が必要になることが知られている。乗算器が１つだとすると、１回のモンゴメリ乗算に２×Ｍ＾２＋Ｍクロックが必要になる。【０００５】
もう１つの実現方法は、長い桁数の加算器を使う方法である。法が１０２４ビットだとすると１０２４ビット＋１０２４ビットの結果を求めることのできる加算器を用いる。法のビット数をｍすると２×ｍ回の加算が必要になる。加算器が１つだとするとモンゴメリ乗算１回あたり２×ｍクロックが必要になる。【０００６】
例えば、ワードベースのモンゴメリ乗算で３２ビット×３２ビット乗算器を使うと、法が１０２４ビットの場合Ｍ=３２ワードとなり、２０８０クロックが必要となる。一方、加算器を使ったモンゴメリ乗算では、法が１０２４ビットの場合、２０４８クロックが必要となる。法が２０４８ビットの場合は、Ｍ＝６４ワードとなり、ワードベースのモンゴメリ乗算では８２５６クロックが必要となり、加算器を使ったモンゴメリ乗算では４０９６クロックが必要となる。【０００７】
また、乗算を高速する方法として、ＮＡＦ（Ｎｏｎ−Ａｄｊａｃｅｎｔ  Ｆｏｒｍ、非特許文献１参照）などの冗長２進表現を使う方法が知られている。この方法では、乗数を冗長２進表現すると平均的に含まれる０の個数が増加することを利用して乗算が高速化される。【０００８】
また、乗算だけでなく、剰余乗算も冗長２進表現を使って高速化する方法としてＺＤＮ法が知られている（例えば、非特許文献２）。ＺＤＮ法では、法のビット数をｍとした場合、理想的にはｍ／３クロック（ステップ）で剰余乗算を計算することができる。例えば、法のビット数が１０２４ビットであるとすると、理想的には３４２ステップで剰余乗算を計算できることになる。
【先行技術文献】
【非特許文献】
【０００９】
【非特許文献１】D. Hankerson, A. Menezes, S. Vanstone, “Guide to Elliptic Curve Cryptography”,Springer, 2004, p.98.
【非特許文献２】H. Sedlak, "The RSA cryptography processor", Proceedings of EUROCRYPT ’87 (Amsterdam) (D.Chaum and W. L. Price, eds.), LNCS, vol. 304, Springer-Verlag, Berlin, 1988, pp. 95-105.
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、ＺＤＮ法は、演算処理を上位ビットから逐次的に行う方法である。すなわち、ＺＤＮ法は、いわゆるｌｅｆｔ  ｔｏ  ｒｉｇｈｔの処理（Ｌ−Ｒ処理）である。一般的にＬ−Ｒ処理の場合、処理ビット数の変更が容易にできない点が問題となる。例えば１０２４ビットを処理する場合と、５１２ビットを処理する場合とでは、最上位ビットの位置が変わる。このため、処理をいずれのビットから開始するのかに対応して複数の回路が必要となる問題がある。したがって、現状ではＺＤＮ法を実現するには、処理ビット数を固定長にするのが現実的な解である。このように、ＺＤＮ法は、最上位ビットから処理するアルゴリズムなので、処理ビット数を自由に変更できないという問題があった。【００１１】
一方、上述のように、従来のモンゴメリ乗算では、２×Ｍ＾２＋Ｍクロックまたは２×ｍクロックが必要となり、ＺＤＮ法と比較して実行速度が遅いという問題があった。【００１２】
本発明は、上記に鑑みてなされたものであって、ＺＤＮ法と同程度のステップ数で、任意のビット数の入力に対してモンゴメリ乗算を実行できる演算装置を提供することを目的とする。
【課題を解決するための手段】
【００１３】
本発明は、整数ｘと整数ｙとの積の整数ｐを法とするモンゴメリ乗算結果ｚを演算する演算装置であって、前記整数ｘを冗長２進表現に変換する変換部と、前記モンゴメリ乗算結果ｚの演算の中間結果の下位ビットから上位ビットに向けて連続する０の個数をカウントし、カウントした個数に基づいて第１シフト量を算出する第１シフト量算出部と、冗長２進表現の前記整数ｘの下位ビットから上位ビットに向けて連続する０の個数をカウントし、カウントした個数に基づいて第２シフト量を算出する第２シフト量算出部と、前記第１シフト量だけビットシフトした前記中間結果と、前記第２シフト量だけビットシフトした前記整数ｙと、前記整数ｐと、を加減算した前記中間結果を算出し、算出した前記中間結果を前記第１シフト量算出部に送出する加減算部と、前記第１シフト量の合計が前記整数ｐのビット数と一致したときの前記中間結果を前記モンゴメリ乗算結果ｚとして出力する出力部と、を備えることを特徴とする。
【発明の効果】
【００１４】
本発明によれば、ＺＤＮ法と同程度のステップ数で、任意のビット数の入力に対してモンゴメリ乗算を実行できるという効果を奏する。
【図面の簡単な説明】
【００１５】
【図１】演算装置のブロック図。
【図２】演算装置の回路構成例を示す図。
【図３】演算処理のフローチャート。
【図４】シフト量演算処理のフローチャート。
【図５】関数ｚｅｒｏｃｏｕｎｔのフローチャート。
【図６】冗長２進表現を使用する手順を示す図。
【図７】計算途中の各変数の値を示す図。
【図８】演算装置のハードウェア構成図。
【発明を実施するための形態】
【００１６】
以下に添付図面を参照して、この発明にかかる演算装置の好適な実施の形態を詳細に説明する。
【００１７】
本実施の形態にかかる演算装置は、入力された整数ｘ、整数ｙ、および整数ｐを用いて整数ｘと整数ｙの整数ｐを法とするモンゴメリ乗算結果ｚ（以下、乗算結果ｚという）を求める。このとき、整数ｘの下位ビットから逐次冗長２進表現に変換しながら、演算を繰り返し実行し、所定の終了条件を満たしたときの演算結果を乗算結果ｚとして出力する。なお、以下では、繰り返し実行される演算の結果を中間結果といい、最終的に出力される結果を乗算結果という。中間結果および乗算結果のいずれも、乗算結果ｚを格納するための所定のレジスタに記憶される。このため、以下では、中間結果および乗算結果のいずれもｚと表記する場合がある。
【００１８】
図１は、本実施の形態にかかる演算装置１００の構成の一例を示すブロック図である。図１に示すように、演算装置１００は、入力部１０１と、変換部１０２と、第１演算部１０３と、第２演算部１０４と、判定部１０５と、補正部１０６と、出力部１０７と、記憶部１０８とを備えている。
【００１９】
入力部１０１は、演算に用いる各種データ（入力値）の入力を受付ける。例えば、入力部１０１は、モンゴメリ乗算に用いる整数ｘ、整数ｙ、および整数ｐの入力を受付ける。
【００２０】
変換部１０２は、整数を冗長２進表現に変換する。例えば、変換部１０２は、入力された整数ｘを冗長２進表現に変換する。
【００２１】
第１演算部１０３は、中間結果ｚのシフト量ｚｓｆｔ（第１シフト量）、整数ｙのシフト量ｙｓｆｔ（第２シフト量）、および、ビットシフトした整数ｙおよび整数ｐを加算するか減算するかなどを決定するための情報（ｙｓｇｎ、ｐｓｇｎ）を算出する。第１演算部１０３は、第１シフト量算出部１０３ａと、第２シフト量算出部１０３ｂとを備えている。
【００２２】
第１シフト量算出部１０３ａは、中間結果ｚの下位ビットから上位ビットに向けて連続する０の個数をカウントし、この個数をｚｓｆｔとして算出する。具体的には、第１シフト量算出部１０３ａは、中間結果ｚの最下位ビットから上位ビットに向けて、中間結果ｚが算出されるごとに変更されるビット数のビットまでの間で、値が連続して０となっているビットの個数であるｚｓｆｔを算出する。中間結果ｚが算出されるごとに変更されるビット数とは、その時点でのｘの処理済みビット数と、ｚの処理済みビット数との差分に相当する。すなわち、第１シフト量算出部１０３ａは、中間結果ｚの下位ビットから上位ビットに向けて連続する０の個数であって、中間結果ｚの処理済ビット数との和がｘの処理済ビット数を超えないような値をｚｓｆｔとして算出する。
【００２３】
第２シフト量算出部１０３ｂは、冗長２進表現で表された整数ｘの下位ビットから上位ビットに向けて連続する０の個数をカウントし、当該個数からｙｓｆｔを算出する。具体的には、第２シフト量算出部１０３ｂは、冗長２進表現で表された整数ｘに含まれるビットのうち、連続する０の個数のカウントの対象となったビットを表す処理済みビットと、処理済みビットの１つ上位のビット（値は０以外）とを除くビットを対象として、下位ビットから上位ビットに向けて連続する０の個数をカウントする。そして、第２シフト量算出部１０３ｂは、カウントした個数、整数ｘの処理済みビット数、中間結果ｚの処理済みビット数、およびｚｓｆｔを用いて、ｙｓｆｔを算出する。
【００２４】
なお、第１演算部１０３によるｚｓｆｔ、ｙｓｆｔ、ｙｓｇｎ、およびｐｓｇｎの算出方法の詳細は後述する。
【００２５】
第２演算部１０４は、第１演算部１０３により演算されたｚｓｆｔ、ｙｓｆｔ、ｙｓｇｎ、およびｐｓｇｎをもとに、中間結果ｚおよび整数ｙのシフト演算、および、シフト演算結果等の加減算を実行する。第２演算部１０４は、シフト演算部１０４ａと、加減算部１０４ｂとを備えている。
【００２６】
シフト演算部１０４ａは、ｚｓｆｔの分だけ中間結果ｚを右シフトする。また、シフト演算部１０４ａは、ｙｓｆｔの分だけ整数ｙを左シフトする。
【００２７】
加減算部１０４ｂは、シフト演算された中間結果ｚと、シフト演算された整数ｙと、整数ｐとを入力し、中間結果ｚに対して、ｙｓｇｎおよびｐｓｇｎに応じて整数ｙおよび整数ｐの加算または減算を実行する。
【００２８】
判定部１０５は、繰り返し実行される演算の終了を判定する。具体的には、判定部１０５は、中間結果ｚの処理済みビット数が、整数ｐのビット数を超えた場合に、演算を終了すると判定する。
【００２９】
補正部１０６は、終了すると判定されたときの中間結果である乗算結果ｚを補正する。具体的には、補正部１０６は、乗算結果ｚが０より小さい場合に、乗算結果ｚに整数ｐを加算して乗算結果ｚを補正する。また、補正部１０６は、乗算結果ｚが整数ｐ以上の場合に、乗算結果ｚから整数ｐを減算して乗算結果ｚを補正する。
【００３０】
出力部１０７は、演算を終了すると判定されたときの中間結果である乗算結果ｚを出力する。補正部１０６により補正された場合は、出力部１０７は、補正後の乗算結果ｚを出力する。
【００３１】
記憶部１０８は、演算に用いる各種データ（入力値、中間結果等）を記憶する。なお、記憶部１０８は、ＨＤＤ（Hard Disk Drive）、光ディスク、メモリカード、ＲＡＭ（Random Access Memory）などの一般的に利用されているあらゆる記憶媒体により構成することができる。
【００３２】
次に、演算装置１００の回路構成について図２を用いて説明する。図２は、演算装置１００の回路構成例を示す図である。なお、図２は、主に図１の第１演算部１０３、第２演算部１０４および記憶部１０８に対応する回路の構成例を示している。
【００３３】
図２に示すように、演算装置１００は、エンコーダ２０１と、右シフト演算器２０２と、左シフト演算器２０３と、３入力加減算器２０４と、レジスタ２１１、２１２、２１３、２１４とを備えている。
【００３４】
レジスタ２１１、２１２、２１３、および２１４は、それぞれ中間結果ｚ（乗算結果ｚ）、整数ｙ、整数ｐ、および整数ｘを格納する。レジスタ２１１〜２１４は、例えば多倍長整数で表された各整数を格納する。レジスタ２１１の出力は、右シフト演算器２０２の入力である。レジスタ２１２の出力は、左シフト演算器２０３の入力である。
【００３５】
右シフト演算器２０２は、入力された中間結果ｚを右へｚｓｆｔビット右シフトして出力する。左シフト演算器２０３は、入力された整数ｙを左へｙｓｆｔビット左シフトして出力する。
【００３６】
３入力加減算器２０４は、右シフト演算器２０２の出力（中間結果ｚ）に対して、ｙｓｇｎと左シフト演算器２０３の出力（整数ｙ）との積を加算し、さらに、ｐｓｇｎとレジスタ２１３の出力（整数ｐ）との積を加算する。すなわち、３入力加減算器２０４は、中間結果ｚに対して、ｙｓｇｎが１のときは整数ｙを加算し、ｙｓｇｎが−１のときは整数ｙを減算し、ｙｓｇｎが０のときは整数ｙの加算も減算も行わない。また、３入力加減算器２０４は、中間結果ｚと整数ｙとの加減算結果に対して、ｐｓｇｎが１のときは整数ｐを加算し、ｐｓｇｎが−１のときは整数ｐを減算し、ｐｓｇｎが０のときは整数ｐの加算も減算も行わない。
【００３７】
エンコーダ２０１は、中間結果ｚ、整数ｘ、整数ｐ、および演算で用いるその他の変数の状態から、ｚｓｆｔ、ｙｓｆｔ、ｙｓｇｎ、およびｐｓｇｎを決定して出力する。エンコーダ２０１によるこれらの値の決定方法の詳細は後述する。
【００３８】
なお、図２のレジスタ２１１、２１２、２１３、２１４が、図１の記憶部１０８に対応する。また、図２のエンコーダ２０１が、図１の第１演算部１０３に対応する。また、図２の右シフト演算器２０２および左シフト演算器２０３が、図１のシフト演算部１０４ａに対応する。また、図２の３入力加減算器２０４が、図１の加減算部１０４ｂに対応する。
【００３９】
次に、このように構成された本実施の形態にかかる演算装置１００による演算処理について図３を用いて説明する。図３は、本実施の形態における演算処理の全体の流れを示すフローチャートである。
【００４０】
まず、入力部１０１が、演算に用いる入力値である整数ｘ、整数ｙ、および整数ｐの入力を受付ける（ステップＳ３０１）。
【００４１】
次に、変換部１０２が、整数ｘを冗長２進表現に変換する（ステップＳ３０２）。なお、図３では、入力された整数ｘを繰り返し演算（ステップＳ３０３〜ステップＳ３０５）の前に冗長２進表現に変換しているが、繰り返し演算の中で逐次整数ｘを冗長２進表現に変換するように構成してもよい。
【００４２】
次に、第１演算部１０３が、ｙｓｆｔおよびｚｓｆｔを算出するシフト量演算処理を実行する（ステップＳ３０３）。シフト量演算処理の詳細は後述する。次に、第２演算部１０４が、算出されたシフト量に応じて中間結果ｚおよび整数ｙをシフトし、シフトした結果を用いて新たな中間結果ｚを演算する（ステップＳ３０４）。具体的には、第２演算部１０４は、以下の（１）式によって中間結果ｚを算出する。なお、「＞＞」および「＜＜」はそれぞれ右シフト演算および左シフト演算を表す。
ｚ＝（ｚ＞＞ｚｓｆｔ）＋ｙｓｇｎ×（ｙ＜＜ｙｓｆｔ）＋ｐｓｇｎ×ｐ・・・（１）
【００４３】
次に、判定部１０５が、ｚの処理済みビット数が整数ｐのビット数より大きいか否かを判定する（ステップＳ３０５）。ｚの処理済みビット数が整数ｐのビット数以下の場合（ステップＳ３０５：Ｎｏ）、ステップＳ３０３に戻り処理が繰り返される。すなわち、ステップＳ３０４で算出された中間結果ｚを用いて、シフト量演算処理（ステップＳ３０３）および新たな中間結果ｚの算出処理（ステップＳ３０４）が繰り返し実行される。
【００４４】
ｚの処理済みビット数が整数ｐのビット数より大きい場合（ステップＳ３０５：Ｙｅｓ）、補正部１０６が、必要に応じて乗算結果ｚ（この時点でのレジスタ２１１の値）を補正する（ステップＳ３０６）。そして、出力部１０７が、乗算結果ｚをモンゴメリ乗算の結果として出力し（ステップＳ３０７）、演算処理を終了する。
【００４５】
次に、ステップＳ３０３のシフト量演算処理の詳細について図４を用いて説明する。図４は、シフト量演算処理の一例を示すフローチャートである。
【００４６】
まず、第１演算部１０３は、連続する０を探索する範囲を表すｚｅｘｔを、以下の（２）式により算出する（ステップＳ４０１）。
ｚｅｘｔ＝ｍｉｎ（ｘｃｎｔ，ｓｉｚｅ）−ｚｃｎｔ  ・・・（２）
【００４７】
なお、ｘｃｎｔは、整数ｘのうち、前のステップ（前の繰り返し演算）までに処理された処理済みビット数の合計を表す。また、ｚｃｎｔは、前のステップまでのｚｓｆｔの合計を表す。また、ｓｉｚｅは、入力された整数ｐのサイズを表す。また、ｍｉｎ（ａ，ｂ）は、ａおよびｂの最小値を返す関数を表す。
【００４８】
次に、第１シフト量算出部１０３ａが、以下の（３）式によりｚｓｆｔを算出する（ステップＳ４０２）。なお、関数ｚｅｒｏｃｏｕｎｔ（ａ，ｂ，ｃ）は、ａの下位からｂビット以上かつｃビット未満の部分ビット列で、下位ビットから上位ビットに向けて値が連続して０となっているビットの個数を返す関数を表す。この関数の詳細については後述する。
ｚｓｆｔ＝ｚｅｒｏｃｏｕｎｔ（ｚ，０，ｚｅｘｔ）  ・・・（３）
【００４９】
次に、第１演算部１０３は、ｚｓｆｔがｚｅｘｔと一致するか否かを判定する（ステップＳ４０３）。ｚｓｆｔとｚｅｘｔとが一致する場合（ステップＳ４０３：Ｙｅｓ）、第１演算部１０３は、ｐｓｇｎを０に設定する（ステップＳ４０４）。ｚｓｆｔとｚｅｘｔとが一致しない場合（ステップＳ４０３：Ｎｏ）、第１演算部１０３は、中間結果ｚの下位からｚｓｆｔ＋１ビット目の値と、整数ｐの下位１ビット目の値とが一致するか否かを判定する（ステップＳ４０５）。なお、図４のａ｛ｂ｝は、ａの下位からｂビット目の値を表す。
【００５０】
中間結果ｚの下位からｚｓｆｔ＋１ビット目の値と、整数ｐの下位１ビット目の値とが一致する場合（ステップＳ４０５：Ｙｅｓ）、第１演算部１０３は、ｐｓｇｎを−１に設定する（ステップＳ４０６）。中間結果ｚの下位からｚｓｆｔ＋１ビット目の値と、整数ｐの下位１ビット目の値とが一致しない場合（ステップＳ４０５：Ｎｏ）、第１演算部１０３は、ｐｓｇｎを＋１に設定する（ステップＳ４０７）。
【００５１】
次に、第１演算部１０３は、冗長２進表現で表された整数ｘの下位ビットから上位ビットに向けて連続する０の個数を表すｘｓｆｔを以下の（４）式により算出する（ステップＳ４０８）。
ｘｓｆｔ＝ｚｅｒｏｃｏｕｎｔ（ｘ，ｘｃｎｔ，ｓｉｚｅ＋１）  ・・・（４）
【００５２】
次に、第１演算部１０３は、ｘｃｎｔとｘｓｆｔとの和が、ｓｉｚｅより大きいか否かを判定する（ステップＳ４０９）。ｘｃｎｔとｘｓｆｔとの和がｓｉｚｅより大きい場合（ステップＳ４０９：Ｙｅｓ）、第１演算部１０３は、ｙｓｇｎを０に設定する（ステップＳ４１０）。ｘｃｎｔとｘｓｆｔとの和がｓｉｚｅ以下の場合（ステップＳ４０９：Ｎｏ）、第１演算部１０３は、ｙｓｇｎを以下の（５）式により算出する（ステップＳ４１１）。
ｙｓｇｎ＝ｘ｛ｘｃｎｔ＋ｘｓｆｔ｝  ・・・（５）
【００５３】
次に、第２シフト量算出部１０３ｂが、以下の（６）式によりｙｓｆｔを算出する（ステップＳ４１２）。
ｙｓｆｔ＝ｘｃｎｔ＋ｘｓｆｔ−ｚｃｎｔ−ｚｓｆｔ  ・・・（６）
【００５４】
次に、第１演算部１０３が、以下の（７）式によりｘｃｎｔを算出する（ステップＳ４１３）。また、第１演算部１０３が、以下の（８）式によりｚｃｎｔを算出する（ステップＳ４１４）。
ｘｃｎｔ＝ｘｃｎｔ＋ｘｓｆｔ＋１  ・・・（７）
ｚｃｎｔ＝ｚｃｎｔ＋ｚｓｆｔ      ・・・（８）
【００５５】
次に、ステップＳ４０２およびステップＳ４０８で用いられる関数ｚｅｒｏｃｏｕｎｔの処理の詳細について図５を用いて説明する。図５は、関数ｚｅｒｏｃｏｕｎｔの処理の一例を示すフローチャートである。図５は、ｘ，ａ，ｂが引数として入力された場合（ｚｅｒｏｃｏｕｎｔ（ｘ，ａ，ｂ））を例に説明する。
【００５６】
まず、カウンタｃｎｔが０に初期化される（ステップＳ５０１）。次に、変数ｉが、入力値ａに設定される（ステップＳ５０２）。次に、変数ｉが入力値ｂより小さいか否かが判定される（ステップＳ５０３）。変数ｉが入力値ｂより小さい場合（ステップＳ５０３：Ｙｅｓ）、入力値ｘの下位からｉビット目の値が０であるか否かが判定される（ステップＳ５０４）。
【００５７】
入力値ｘの下位からｉビット目の値が０である場合（ステップＳ５０４：Ｙｅｓ）、ｉおよびｃｎｔにそれぞれ１が加算される（ステップＳ５０５、ステップＳ５０６）。そして、ステップＳ５０３に戻り処理が繰り返される。
【００５８】
ステップＳ５０３で変数ｉが入力値ｂ以上と判定された場合（ステップＳ５０３：Ｎｏ）、または、ステップＳ５０４で入力値ｘの下位からｉビット目の値が０でないと判定された場合（ステップＳ５０４：Ｎｏ）、その時点でのｃｎｔが関数の出力値として出力される（ステップＳ５０７）。
【００５９】
次に、このように構成された演算装置１００により演算処理の具体例について説明する。以下では、「ｆ２×ｄ５  ｍｏｄ  ｆｂ」を計算する例を示す。すなわち、整数ｘ＝ｆ２、整数ｙ＝ｄ５、および整数ｐ＝ｆｂが入力された場合の演算例を示す。なお、整数ｘ、ｙ、およびｐは、いずれも１６進数で表されている。
【００６０】
図６は、整数ｘ（＝ｆ２）の冗長２進表現を使用する手順の例を示す図である。なお、図６では、下線が付された１が「−１」を意味する。冗長２進表現は色々な種類が存在する。ここでは、冗長２進表現としてＮＡＦを用いた例を説明する。なお、ＮＡＦ以外の冗長２進表現を使っても同様の手順で本実施の形態の演算処理を実現できる。
【００６１】
ｆ２をＮＡＦ形式に変換すると、「１,０,０,０,−１,０,０,１,０」と表される。なお、１６進数のｆ２は１０進数で表すと２４２である。ＮＡＦ形式の「１,０,０,０,−１,０,０,１,０」は、２５６−１６＋２＝２４２を表すため、「１,０,０,０,−１,０,０,１,０」がｆ２の別の表現であることがわかる。
【００６２】
「１,０,０,０,−１,０,０,１,０」を下位から順に見ていくと、１個の０の後に１が存在し、続いて２個の０の後に−１が存在し、続いて３個の０の後に１が存在する。なお、その後は０が続き１は存在しないと考える。
【００６３】
モンゴメリ乗算の各ステップ（繰り返し演算）では、０の連続した個数と、その次に存在する０でない値がペアにして使用される。すなわち、図６の例では、ステップ１（最初の繰り返し演算）では、１個の０と、その後の１とが使用される。また、次のステップ２では、２個の０と、その後の−１とが使用される。さらに次のステップ３では、３個の０と、その後の１とが使用される。なお、ステップ４以降では、１が存在せず、０が無限個続いていると考える。
【００６４】
エンコーダ２０１は、各ステップで、連続した０の個数をｘｓｆｔとし、その後に続く１または−１をｙｓｇｎとする。また、エンコーダ２０１は、整数ｘの冗長２進表現のビットのうち、それまでのステップで使用したビット数（処理済みビット数）を記録しておく。なお、エンコーダ２０１は、各ステップで、連続した０の個数＋１個の桁（ビット）を消費（使用）する。
【００６５】
図６の例では、まず、ステップ１で１個の０とその後の１とが使用される。すなわちステップ１では２個のビットが消費される。そして、これまでの処理済みビット数の合計は２個となる。ステップ２では、２個の０とその後の−１とが使用される。すなわちステップ２では３個のビットが消費される。そして、処理済みビット数の合計は５個となる。また、ステップ３では、３個の０とその後の１とが使用される。すなわちステップ３では４個のビットが消費される。そして、処理済みビット数の合計は９個となる。
【００６６】
エンコーダ２０１は、０の連続した個数をｘｓｆｔとし、その後の非０（０以外の値）の値をｙｓｇｎとし、前のステップまでに使用したビット数の合計をｘｃｎｔとする。なお、ステップ１でのｘｃｎｔは０とする。
【００６７】
ステップがある程度以上進むと、必ず上位に０が無限個続く状態に陥る。その場合、エンコーダ２０１は、ｘｓｆｔを、ｓｉｚｅ（＝整数ｐのビット数）＋１−ｘｃｎｔとする。
【００６８】
以上の処理をまとめると次のようになる。すなわち、各ステップでは、以下のようなｘｃｎｔ、ｘｓｆｔ、ｙｓｇｎがそれぞれ算出される。
ステップ１    ：ｘｃｎｔ＝０、ｘｓｆｔ＝１、ｙｓｇｎ＝１
ステップ２    ：ｘｃｎｔ＝２、ｘｓｆｔ＝２、ｙｓｇｎ＝−１
ステップ３    ：ｘｃｎｔ＝５、ｘｓｆｔ＝３、ｙｓｇｎ＝１
ステップ４以降：ｘｃｎｔ＝９、ｘｓｆｔ＝０、ｙｓｇｎ＝０
【００６９】
次に別の入力値が入力された場合の例について説明する。以下では、整数ｘ＝７２が入力され、整数ｐのビット数が８である場合の演算例を示す。７２をＮＡＦ形式に変換すると、「０，１，０，０，−１，０，０，１，０」と表される。
【００７０】
上記の例と同様の手順により、結果として各ステップでは、以下のようなｘｃｎｔ、ｘｓｆｔ、ｙｓｇｎがそれぞれ算出される。
ステップ１    ：ｘｃｎｔ＝０、ｘｓｆｔ＝１、ｙｓｇｎ＝１
ステップ２    ：ｘｃｎｔ＝２、ｘｓｆｔ＝２、ｙｓｇｎ＝−１
ステップ３    ：ｘｃｎｔ＝５、ｘｓｆｔ＝２、ｙｓｇｎ＝１
ステップ４    ：ｘｃｎｔ＝８、ｘｓｆｔ＝１、ｙｓｇｎ＝０
ステップ５以降：ｘｃｎｔ＝９、ｘｓｆｔ＝０、ｙｓｇｎ＝０
【００７１】
この例では、ステップ４で消費するビット数が１ビットである（ｘｓｆｔが１ビットで、上位に１が存在しないのでｙｓｇｎの分が０ビット）。ステップ４のｘｓｆｔは、整数ｐのビット数＋１−ｘｃｎｔ＝８＋１−８＝１により求めている。
【００７２】
以下、さらに演算装置１００により演算処理の具体例について説明する。引き続き「ｆ２×ｄ５  ｍｏｄ  ｆｂ」を計算する場合を例に説明する。図７は、「ｆ２×ｄ５  ｍｏｄ  ｆｂ」を計算する途中の各変数の値を示す図である。
【００７３】
上述のように、ｚｃｎｔは前のステップまでのｚｓｆｔの合計である。初期設定として、ｚ＝０、ｘｃｎｔ＝０、ｚｃｎｔ＝０とする。また、ｚは１６ビットとする。入力された法（整数ｐ）のサイズは８ビットなのでｓｉｚｅ＝８である。
【００７４】
まず、最初のステップ１でのエンコーダ２０１の出力を求める。上述のようにステップ１では、ｘｃｎｔ＝０、ｘｓｆｔ＝１、ｙｓｇｎ＝１、z＝００００、およびｚｃｎｔ＝０が求められる。以下、上述の図４のフローチャート従って説明する。
【００７５】
ｚｅｘｔは、（２）式により求められる（ステップＳ４０１）。この例では、ｘｃｎｔ＝０、ｓｉｚｅ＝８、ｚｃｎｔ＝０であるため、ｚｅｘｔ＝０である。
【００７６】
次に、ｚｓｆｔが決定される（ステップＳ４０２）。ｚｓｆｔは、ｚの下位の連続した０の個数であるが、ｚｅｘｔ以下の値を取る。ここでは、ｚ＝０であるため、下位には１６ビットの０が並んでいることになる。しかし、ｚｅｘｔ（＝０）以下の値でなければならないため、ｚｓｆｔ＝０となる。
【００７７】
次に、ｐｓｇｎが算出される（ステップＳ４０３〜ステップＳ４０７）。ここでは、ｚｓｆｔとｚｅｘｔとが一致するため、ｐｓｇｎ＝０となる（ステップＳ４０４）。
【００７８】
次に、ｘｓｆｔおよびｙｓｇｎが算出される（ステップＳ４０８〜ステップＳ４１１）。上述のように、ｘｓｆｔ＝１およびｙｓｇｎ＝１となる。
【００７９】
次に、ｙｓｆｔが上記（６）式により算出される（ステップＳ４１２）。ここでは、ｙｓｆｔ＝０＋１−０−０＝１となる。
【００８０】
次に、ｘｃｎｔおよびｚｃｎｔが、それぞれ上記（７）式および（８）式により算出される（ステップＳ４１３、ステップＳ４１４）。ここでは、ｘｃｎｔ＝ｘｃｎｔ＋ｘｓｆｔ＋１＝０＋１＋１＝２に更新される。また、ｚｃｎｔ＝ｚｃｎｔ＋ｚｓｆｔ＝０＋０＝０に更新される。
【００８１】
以上により、エンコーダ２０１の出力であるｚｓｆｔ（＝０）、ｙｓｆｔ（＝１）、ｙｓｇｎ（＝＋１）、およびｐｓｇｎ（＝０）が計算される。これらの出力値を上記（１）式に入力することにより、ｚの新しい値が算出される（図３のステップＳ３０４）。ここでは、ｚの新しい値として「０１ａａ」が求められる。
【００８２】
次のステップ２では、同様にしてｚｓｆｔ＝１、ｙｓｆｔ＝３、ｙｓｇｎ＝−１、ｐｓｇｎ＝＋１が求まり、ｚの新しい値は「ｆｂ２８」となる。
【００８３】
ステップ３では、同様にしてｚｓｆｔ＝３、ｙｓｆｔ＝４、ｙｓｇｎ＝＋１、ｐｓｇｎ＝＋１が求まり、ｚの新しい値は「０ｄｂ０」となる。
【００８４】
ステップ４では、同様にしてｚｓｆｔ＝４、ｙｓｆｔ＝１、ｙｓｇｎ＝０、ｐｓｇｎ＝０が求まり、ｚの新しい値は「００ｄｂ」となる。
【００８５】
なお、この例では、求められた結果であるｚ＝「００ｄｂ」は、０≦ｚ＜ｐを満たす。このため、補正部１０６はｚを補正しない。
【００８６】
以上のように、上記例では、８ビットのモンゴメリ乗算を４ステップで求めることができる。なお、漸近的には法である整数ｐのビット数の１／３ステップでモンゴメリ乗算を求めることができる。以下、本実施の形態の演算処理の漸近的なふるまいを説明する。
【００８７】
ｚを下位からスキャン（処理）していったときに、あるビットが０のとき、次のビットが０になる確率は１／２であり、１になる確率も１／２である。逆に、あるビットが１のとき、エンコーダ２０１のアルゴリズムより、次のビットは必ず０になる。この確率を状態遷移行列Ａで表すと次の（９）式のようになる。
【数１】
2011036746.tif 000003
【００８８】
Ａ^ｎ（Ａのｎ乗）のｎの極限を調べることで、０である確率と１である確率を知ることができる。Ａ＾ｎのｎを無限大としたときの極限は、以下の（１０）式で表される。
【数２】
2011036746.tif 000004
【００８９】
上記（１０）式に示すように、処理するビットが０である確率は２／３であり、処理するビットが１である確率は１／３である。エンコーダ２０１のアルゴリズムは、ｚのあるビットが１である場合にのみ処理を行う（０はスキップする）ため、平均して、ｐのビット数の１／３ステップで処理が完了することになる。
【００９０】
このように、本実施の形態にかかる演算装置１００では、ＺＤＮ法と同程度のステップ数でモンゴメリ乗算を演算できる。また、ＺＤＮ法と異なり、変数の下位ビットから逐次的に演算を実行するため、任意のビット数の入力に対してモンゴメリ乗算を実行できる。
【００９１】
次に、本実施の形態にかかる演算装置１００のハードウェア構成について図８を用いて説明する。図８は、本実施の形態にかかる演算装置１００のハードウェア構成図である。
【００９２】
本実施の形態にかかる演算装置１００は、ＣＰＵ（Central  Processing  Unit）５１などの制御装置と、ＲＯＭ（Read  Only  Memory）５２やＲＡＭ５３などの記憶装置と、ネットワークに接続して通信を行う通信Ｉ／Ｆ５４と、各部を接続するバス６１を備えている。
【００９３】
本実施の形態にかかる演算装置１００で実行される演算プログラムは、ＲＯＭ５２等に予め組み込まれて提供される。
【００９４】
本実施の形態にかかる演算装置１００で実行される演算プログラムは、インストール可能な形式又は実行可能な形式のファイルでＣＤ−ＲＯＭ（Compact  Disk  Read  Only  Memory）、フレキシブルディスク（ＦＤ）、ＣＤ−Ｒ（Compact  Disk  Recordable）、ＤＶＤ（Digital  Versatile  Disk）等のコンピュータで読み取り可能な記録媒体に記録してコンピュータプログラムプロダクトとして提供されるように構成してもよい。
【００９５】
さらに、本実施の形態にかかる演算装置１００で実行される演算プログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、本実施の形態にかかる演算装置１００で実行される演算プログラムをインターネット等のネットワーク経由で提供または配布するように構成してもよい。
【００９６】
本実施の形態にかかる演算装置１００で実行される演算プログラムは、コンピュータを上述した演算装置１００の各部（入力部、変換部、第１演算部、第２演算部、判定部、補正部、出力部）として機能させうる。このコンピュータは、ＣＰＵ５１がコンピュータ読取可能な記憶媒体から演算プログラムを主記憶装置上に読み出して実行することができる。
【００９７】
なお、本発明は、上記実施の形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化することができる。また、上記実施の形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成することができる。例えば、実施の形態に示される全構成要素からいくつかの構成要素を削除してもよい。さらに、異なる実施の形態にわたる構成要素を適宜組み合わせても良い。
【符号の説明】
【００９８】
５１  ＣＰＵ
５２  ＲＯＭ
５３  ＲＡＭ
５４  通信Ｉ／Ｆ
６１  バス
１００  演算装置
１０１  入力部
１０２  変換部
１０３  第１演算部
１０３ａ  第１シフト量算出部
１０３ｂ  第２シフト量算出部
１０４  第２演算部
１０４ａ  シフト演算部
１０４ｂ  加減算部
１０５  判定部
１０６  補正部
１０７  出力部
１０８  記憶部
２０１  エンコーダ
２０２  右シフト演算器
２０３  左シフト演算器
２０４  ３入力加減算器
２１１、２１２、２１３、２１４  レジスタ
【図１】
2011036746.tif 000005
【図２】
2011036746.tif 000006
【図３】
2011036746.tif 000007
【図４】
2011036746.tif 000008
【図５】
2011036746.tif 000009
【図６】
2011036746.tif 000010
【図７】
2011036746.tif 000011
【図８】
2011036746.tif 000012
【国際調査報告】
2011036746.tif 000013
2011036746.tif 000014
2011036746.tif 000015