[go: up one dir, main page]

JP5896756B2 - 演算装置及びプログラム - Google Patents

演算装置及びプログラム Download PDF

Info

Publication number
JP5896756B2
JP5896756B2 JP2012009898A JP2012009898A JP5896756B2 JP 5896756 B2 JP5896756 B2 JP 5896756B2 JP 2012009898 A JP2012009898 A JP 2012009898A JP 2012009898 A JP2012009898 A JP 2012009898A JP 5896756 B2 JP5896756 B2 JP 5896756B2
Authority
JP
Japan
Prior art keywords
value
variable
word
thread
divided
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.)
Expired - Fee Related
Application number
JP2012009898A
Other languages
English (en)
Other versions
JP2013148767A (ja
Inventor
晃由 山口
晃由 山口
佐藤 恒夫
恒夫 佐藤
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Mitsubishi Electric Corp
Original Assignee
Mitsubishi Electric Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Mitsubishi Electric Corp filed Critical Mitsubishi Electric Corp
Priority to JP2012009898A priority Critical patent/JP5896756B2/ja
Publication of JP2013148767A publication Critical patent/JP2013148767A/ja
Application granted granted Critical
Publication of JP5896756B2 publication Critical patent/JP5896756B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Description

本発明は、演算装置、演算方法及びプログラムに関する。
特に、RSA(登録商標)暗号や楕円曲線暗号などに用いられる多倍長整数の加算、減算、乗算、モンゴメリ・リダクション、モンゴメリ乗算を行う演算装置及びプログラムに関する。
RSA(登録商標)暗号をはじめとする、多くの公開鍵暗号では、ある奇整数を法とする有限体上の演算を行う。
このとき、一般的なCPU(Central Processing Unit)で演算可能なデータ長(例えば32ビット)を超えた数に対して、演算を行う必要がある。
中でも、多倍長乗算は、CPUの内部演算幅をb(bit)、入力長をl(bit)とした場合、n=l/bに対して、O(n)の計算量がかかり、多倍長演算の中でも、重い処理の1つとなっている。
一方、入力に対してモンゴメリ変換を行い、モンゴメリ変換後のデータに対して、多倍長乗算とモンゴメリ・リダクションとよばれる処理を行うことで、演算コストの高い除算や剰余算を回避する方法が示されている。
また、多倍長乗算とモンゴメリ・リダクションはペアで行うことが多く、これらをあわせてモンゴメリ乗算と呼ぶ。
通常、モンゴメリ・リダクションもO(n)の計算量がかかる。
公開鍵暗号を高速化するにあたり、これらの処理の高速化が求められる。
乗算、モンゴメリ・リダクションを高速化する方法としては、専用ハードウェアを用いたり、入力を変換したりして高速化を行う装置が提案されている(例えば、特許文献1、特許文献2、特許文献3、特許文献4)。
特開昭63−28693号公報 特開2000−10479号公報 特開2000−353077号公報 特開2001−194993号公報
特許文献1、特許文献3によれば、専用のプロセッサアーキテクチャやメモリアーキテクチャを持つ計算機を用いて多倍長演算を高速化している。
しかしながら、特許文献1及び特許文献3の方式を実現するためには、専用装置が必要となる。
特許文献2によれば、正の整数C,pを入力とし、pを2進表現したときのビット長をLとして、n≧Lなる整数nを用いてR=2として定義されたRを用いて、D=C・R−1 mod pを計算するにあたって、C=αR+βを満たす整数ペア(α,β)を算出する(α,β)と、R−1=ε(mod p)を満たすεを求め、α+εβを計算し、その結果に対してpを法として合同なp以下の剰余値を求めている。
しかしながら、当該方式の場合、法pによる多倍長剰余算を行う必要があり、剰余演算に計算コストがかかる。
特許文献4によれば、入力を剰余数系に変換し、変換した系上でモンゴメリ上場算を実現することで、処理の並列化を図り、高速化を実現している。
しかしながら、当該方式では、基底拡張に計算コストがかかる上に、整数による剰余算を行う必要がある。
他の演算に対して、剰余算が遅いプロセッサでは、かえって計算コストがかかる。
この発明は上記のような課題を解決することを主な目的としており、専用装置を用いることなく、多倍長演算を少ない計算コストで高速に実現することを主な目的とする。
本発明に係る演算装置は、
制御部と演算部と記憶部とを有し、入力値の加算を行う演算装置であって、
前記制御部は、
それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅よりも大きい入力値X及び入力値Yを、それぞれ、前記演算部の演算ビット幅ごとに分割し、
前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn(n≧2)個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、前記演算部による加算結果を格納するためのu(u>n)個の変数Z[0]〜Z[u−1]を設け、
前記演算部は、
スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、第1フェーズの処理として、
入力値Xのt番目の変数X[t]の値と、入力値Yのt番目の変数Y[t]の値とを用いて、(X[t]の値)+(Y[t]の値)を計算し、加算結果とキャリー値cを求め、加算結果をt番目の変数Z[t]に格納する処理を行い、
前記制御部は、
カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
カウンタ値iがnに達するか、全てのスレッドtが第2フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第2フェーズの1ラウンド分の処理として、
〈a〉(t+i)番目の変数Z[t+i]の値とスレッドtで得られたキャリー値cとを用いて、(Z[t+i]の値)+cを計算し、新たな加算結果と新たなキャリー値cを求め、
〈b〉変数Z[t+i]の値と新たな加算結果とを比較し、両者が一致している場合に、スレッドtの第2フェーズの処理を停止し、両者が一致しない場合に、新たな加算結果を(t+i)番目の変数Z[t+i]に格納する
処理を、行うことを特徴とする。
本発明では、各分割値の加算は第1フェーズの処理として1回で終了し、その後、第2フェーズとしてキャリー値の処理が行われる。
通常、数回のラウンド処理でキャリー値の処理は終了するため、全てのスレッドtにおいて早期に第2フェーズの処理が終了し、加算処理を高速に行うことができる。
このように、本発明によれば、専用装置を用いることなく、多倍長演算を少ない計算コストで高速に実現することができる。
実施の形態1〜5に係る多倍長演算装置の構成例を示す図。 実施の形態1に係る多倍長加算の手順を示すフローチャート図。 実施の形態1に係る多倍長加算の具体例を示す図。 実施の形態1に係る多倍長加算の計算過程を示す図。 実施の形態2に係る多倍長減算の手順を示すフローチャート図。 実施の形態2に係る多倍長減算の具体例を示す図。 実施の形態2に係る多倍長減算の計算過程を示す図。 実施の形態3に係る多倍長乗算の手順を示すフローチャート図。 実施の形態3に係る多倍長乗算の具体例を示す図。 実施の形態3に係る多倍長乗算の具体例を示す図。 実施の形態3に係る多倍長乗算の計算過程を示す図。 実施の形態3に係る多倍長乗算の計算過程を示す図。 実施の形態4に係るモンゴメリ・リダクションの手順を示すフローチャート図。 実施の形態4に係るモンゴメリ・リダクションの具体例を示す図。 実施の形態4に係るモンゴメリ・リダクションの具体例を示す図。 実施の形態4に係るモンゴメリ・リダクションの計算過程を示す図。 実施の形態4に係るモンゴメリ・リダクションの計算過程を示す図。 実施の形態5に係るモンゴメリ乗算の手順を示すフローチャート図。 実施の形態5に係るモンゴメリ乗算の具体例を示す図。 実施の形態5に係るモンゴメリ乗算の具体例を示す図。 実施の形態5に係るモンゴメリ乗算の計算過程を示す図。 実施の形態5に係るモンゴメリ乗算の計算過程を示す図。
実施の形態1〜5では、多倍長演算を高速に実現する多倍長演算装置を説明する。
実施の形態1〜5では、一例として、SIMD(Single Instruction Multiple Data)計算機を用いた多倍長演算装置を説明する。
また、実施の形態1〜5に係る多倍長演算装置は、一般的に入手可能なGPU(Graphics Processing Unit)を用いて実現することも可能である。
実施の形態1.
図1は、実施の形態1〜5に係る多倍長演算装置100の構成例を示すブロック図である。
実施の形態1〜5に係る多倍長演算装置100は、計算部101、メモリ102、通信ポート103がバス104で接続されている構成となっている。
なお、実施の形態1〜5に係る多倍長演算装置100は、演算装置の例に相当する。
計算部101は、複数のプロセッサ105〜106、命令デコーダ107、レジスタ108、109で構成されている。
プロセッサ105〜106は、命令デコーダ107がデコードした命令を異なるデータに対して実行する。
プロセッサ105〜106のいずれかのプロセッサは、多倍長演算を行う際に必要な制御を行う制御部としての役割を有する。
また、プロセッサ105〜106のいずれかのプロセッサ、又は、プロセッサ105〜106の全てのプロセッサは、多倍長演算の計算処理を行う演算部としての役割を有する。
制御部として機能するプロセッサが、併せて演算部として機能するようにしてもよい。
プロセッサ105〜106が、制御部として行う処理の詳細、演算部として行う処理の詳細は、後述する。
演算部として機能するプロセッサは、所定の演算幅bビット(例えば32ビット)の演算を行う。
以下、演算幅のbビットを1ワードと記す。
また、以下では、制御部として機能するプロセッサを単に「制御部」とも記し、演算部として機能するプロセッサを単に「演算部」とも記す。
データは汎用レジスタ108に格納される。
また、メモリ102を介してプロセッサ間でデータのやり取りを行う。
特殊レジスタ109は、プロセッサ105〜106の計算値以外の特殊情報を格納するレジスタである。
汎用レジスタ108及びメモリ102は、記憶部の例に相当する。
各プロセッサが実行するプログラムの単位をスレッドと称す。
実施の形態1〜5に係る多倍長演算装置100の特徴の1つは、1つの多倍長演算を複数のスレッドを用いて演算することにある。
スレッドの本数n(n≧2)は、入力値をl(l>b)ビットとした場合、n≧ceil(l/b)とする。
ここで、ceil(a)はa以上の整数のうちの最小の整数とする。
各プロセッサが実行するスレッドには0以上(n−1)以下のスレッド番号が付与される。
プロセッサ105〜106はスレッドの本数や、各プロセッサが処理するスレッドの番号を、特殊レジスタ109から取得することができる。
実施の形態1〜5に係る多倍長演算装置100は、図1に示すように、プロセッサ105、106、レジスタ108、109、メモリ102(例えば、RAM(Random Access Memory))、通信ポート103、バス104を備える一般的なコンピュータとすることができる。
また、図1では図示を省略しているが、多倍長演算装置100は、磁気ディスク装置に代表される不揮発性の記憶装置を備えている。
そして、制御部及び演算部の後述する動作を実現するためのコンピュータプログラムやオペレーティングシステムが不揮発性の記憶装置に記憶されている。
制御部及び演算部の動作を実現するためのコンピュータプログラムの少なくとも一部は、オペレーティングシステムに含まれていてもよい。
そして、プロセッサ105、106は、オペレーティングシステムを動作させながら、制御部及び演算部の動作を実現するためのコンピュータプログラムをメモリ102にロードし、また、これらコンピュータプログラムをメモリ102から読み出し、実行することで、制御部及び演算部として機能する。
また、多倍長演算装置10の動作手順を、演算方法として捉えることもできる。
次に、本実施の形態に係る計算部101の動作の概略を説明する。
本実施の形態では、入力値Xと入力値Yの加算結果(X+Y)を変数Zに出力する。
入力値Xと入力値Yは、ともにl(l>b)ビットである。
つまり、入力値Xと入力値Yのビット幅(lビット)は、各プロセッサの1ワードであるbビットよりも大きい。
本実施の形態では、制御部が入力値Xと入力値Yをそれぞれn桁に分割する。
また、制御部は、入力値Xから分割されたn個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを、いずれかの記憶領域(例えば、メモリ102)に設ける。
また、制御部は、入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納する。
同様に、制御部は、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納する。
また、いずれかの記憶領域(例えば、メモリ102)に、演算部による加算結果を格納するためのu(u>n)個の変数Z[0]〜Z[u−1]を設ける。
なお、変数Zの個数は、n以上であれば任意の数とすることができるが、以下では、2n個の変数Z、つまり、変数Z[0]〜Z[2n−1]を設ける(変数Zが2nワードのサイズを持つ)例にて説明を進める。
演算部は、スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行する。
演算部の処理は、第1フェーズの処理と、第2フェーズの処理に大別される。
演算部は、第1フェーズの処理として、スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、入力値Xのt番目の変数X[t]の値と、入力値Yのt番目の変数Y[t]の値とを用いて、(X[t]の値)+(Y[t]の値)を計算し、加算結果とキャリー値cを求め、加算結果をt番目の変数Z[t]に格納する。
次に、制御部がカウンタ値iを1に設定し、演算部に第2フェーズの処理を開始させる。
そして、カウンタ値iがnに達するか、全てのスレッドtが第2フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、制御部は、カウンタ値iをインクリメントする。
演算部は、制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第2フェーズの1ラウンド分の処理を繰り返す。
第2フェーズの1ラウンド分の処理は、以下の〈a〉と〈b〉の処理である。
〈a〉(t+i)番目の変数Z[t+i]の値とスレッドtで得られたキャリー値cとを用いて、(Z[t+i]の値)+cを計算し、新たな加算結果と新たなキャリー値cを求める。
〈b〉変数Z[t+i]の値と新たな加算結果とを比較し、両者が一致している場合に、スレッドtの第2フェーズの処理を停止し、両者が一致しない場合に、新たな加算結果を(t+i)番目の変数Z[t+i]に格納する。
次に、図2のフローチャートを参照して、本実施の形態に係る多倍長演算装置100で多倍長加算を行う場合の手順を説明する。
なお、図2において、大文字で示す変数はメモリ102上のデータとし、小文字で示す変数は汎用レジスタ108上のデータとする。
また、各変数のデータ長は1ワードとする。
また、入力値ceil(l/b)ワードがnに満たない場合は、満たない部分のワードを予め0でクリアする。
まず、演算部が、汎用レジスタ108から、スレッドごとに自身のスレッド番号と演算するスレッド本数を取得する(S201)。
次に、演算部が出力Zの上位n桁をゼロクリアし、スレッドごとにXとYの加算を求め、加算値をZの下位n桁に格納し、制御部が変数(カウンタ値)iに1をセットする(S202)。
ここで、Add_cc(a,b)は、1ワードの入力a,bに対し、a+bの結果を汎用レジスタ108に出力し、キャリー値を特殊レジスタ109に出力することを意味する。
図2に示すS202の処理2及び処理3が、第1フェーズの処理に該当する。
iがn未満である場合、演算部はZ[t+i]の値を読み込み、0との加算を行う(S203)。
ここで、Addc_cc(a,b)は、1ワードの入力a,bに対し、aとbと特殊レジスタ109のキャリーの値を加算し、加算結果を汎用レジスタ108に出力し、加算後のキャリー値を特殊レジスタ109に出力することを意味する。
加算の前後で値に変化が無ければ(s==a?でYES)、演算部は、キャリー値が0であるとみなし、スレッドtの処理を終了する。
また、演算部は、変化があれば(s==a?でNO)、加算結果を、Z[t+i]に出力し、制御部がiに1を加算する(S204)。
キャリー値が0になる(すなわち、s==a?でYESとなる)か、iがnとなるまでS203、S204を繰り返す。
n本のスレッド全てがループを抜けたら処理を終了する。
図2に示すS203の処理1及び処理2、s==a?の判断、S204の処理1が、第2フェーズの1ラウンド分の処理に該当する。
図3は、本実施の形態に係る多倍長加算における値の変化を示す。
図3では、内容を理解しやすくするため、内部演算幅を十進数とし、4桁の演算を4つのスレッド(スレッド番号0〜3)で実行した場合を示している。図3では、1234(X)+5678(Y)=6912(Z)を計算する例を示す。
また、図4は、図3に示した計算の内訳を、スレッド番号0について示している。
次に、本実施の形態に係る多倍長演算装置100の効果を説明する。
本実施の形態では、各桁の加算は1回で終了し、その後、キャリーの処理を行う。
キャリーの処理のワーストケースはO(n)となるが、入力がランダムである場合、キャリーが最後まで残る確率は非常に低いため、数回のキャリーの計算で図2のループを抜けることができるため、加算処理を高速に行うことができる。
また、キャリー加算前後の値を比較することで、キャリー情報を直接参照できなくても、キャリーの有無を判定することができる。
また、本実施の形態に係る多倍長演算装置100は、前述したように、SIMD計算機等の通常の計算機で実現可能であり、専用装置を用いることなく、多倍長加算を高速に行うことができる。
以上、本実施の形態では、
複数のプロセッサを内蔵し、単一の命令を複数のデータに対して同時に実行できる計算機と、データを格納し、前記プロセッサが同時にアクセスできるメモリを有する多倍長整数演算装置であって、入力X,Yに対して、Z=X+Yを計算する多倍長加算を以下のステップで実行する多倍長整数演算装置を説明した。
1.入力データを計算機の内部演算幅毎に複数の桁(以降、それぞれX[n],Y[n]と記す)に分割するステップ
2.スレッドごとに自身のスレッド番号tと演算するスレッド本数nを取得するステップ
3.Zを0にセットするステップ
4.X[t]+Y[t]を計算し、加算結果とキャリーcを求め、前記加算結果をZ[t]に格納するステップ
5.桁iを1に設定するステップ
6.Z[t+i]+cを計算し、新たな加算結果と新たなキャリーcを求め、前記加算結果をZ[t+i]に格納するステップ
7.桁iに1を加算するステップ
8.i<nかつ、c≠0の間、ステップ6〜7を実行するステップ
9.前記スレッドの全てがステップ6〜8を完了するのを待つステップ。
実施の形態2.
本実施の形態では、多倍長減算処理を行う。
本実施の形態に係る多倍長演算装置100の構成は図1に示したものと同じである。
次に、本実施の形態に係る計算部101の動作の概略を説明する。
本実施の形態では、入力値Yから入力値Xを減算した減算結果(Y−X)を変数Zに出力する。
なお、実施の形態1と同様に、本実施の形態でも、入力値X、入力値Yのビット幅がl(l>b)ビットであり、制御部が入力値Xと入力値Yをそれぞれn桁に分割し、変数X[0]〜X[n−1]と変数Y[0]〜Y[n−1]とを設け、更に、変数Z[0]〜Z[2n−1]を設ける。
変数Zの個数は、本実施の形態でも、n以上であれば任意の数とすることができるが、実施の形態1と同様に、2n個の変数Zを設ける(変数Zが2nワードのサイズを持つ)例にて説明を進める。
また、制御部が分割値をX[0]〜X[n−1]を格納する手順、Y[0]〜Y[n−1]に格納する手順も実施の形態1と同じである。
更に、演算部も、実施の形態1と同様に、n個のスレッドを並列に実行し、第1フェーズの処理と、第2フェーズの処理とを行う。
本実施の形態では、演算部は、第1フェーズの処理として、スレッドtにおいて、入力値Xのt番目の変数X[t]の値と、入力値Yのt番目の変数Y[t]の値とを用いて、(Y[t]の値)−(X[t]の値)を計算し、減算結果とボロー値dを求め、減算結果をt番目の変数Z[t]に格納する。
次に、制御部がカウンタ値iを1に設定し、演算部に第2フェーズの処理を開始させる。
そして、カウンタ値iがnに達するか、全てのスレッドtが第2フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、制御部は、カウンタ値iをインクリメントする。
演算部は、制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第2フェーズの1ラウンド分の処理を繰り返す。
第2フェーズの1ラウンド分の処理は、以下の〈a〉と〈b〉の処理である。
〈a〉(t+i)番目の変数Z[t+i]の値とスレッドtで得られたボロー値dとを用いて、(Z[t+i]の値)−dを計算し、新たな減算結果と新たなボロー値dを求める。
〈b〉変数Z[t+i]の値と新たな減算結果とを比較し、両者が一致している場合に、スレッドtの第2フェーズの処理を停止し、両者が一致しない場合に、新たな減算結果を(t+i)番目の変数Z[t+i]に格納する。
次に、図5のフローチャートを参照して、本実施の形態に係る多倍長演算装置100で多倍長減算を行う場合の手順を説明する。
なお、図5において、大文字で示す変数はメモリ102上のデータとし、小文字で示す変数は汎用レジスタ108上のデータとする。
また、各変数のデータ長は1ワードとする。
入力値ceil(l/b)ワードがnに満たない場合は、満たない部分のワードを予め0でクリアする。
まず、演算部が、汎用レジスタ108から、スレッドごとに自身のスレッド番号と演算するスレッド本数を取得する(S401)。
次に、演算部が出力Zの上位n桁をゼロクリアし、スレッドごとにYとXの減算を求め、減算値をZの下位n桁に格納し、制御部が変数(カウンタ値)iに1をセットする(S402)。
ここで、Sub_cc(a,b)は1ワードの入力a,bに対し、b−aの結果を汎用レジスタ108に出力し、ボロー値を特殊レジスタに出力することを意味する。
図5に示すS402の処理2及び処理3が、第1フェーズの処理に該当する。
iがn未満である場合、演算部はZ[t+i]の値を読み込み、0との減算を行う(S403)。
ここで、Subc_cc(a,b)は1ワードの入力a,bに対し、bからaと特殊レジスタ109のボローの値を減算し、減算結果を汎用レジスタ108に出力し、ボロー値を特殊レジスタ109に出力することを意味する。
減算の前後で値に変化が無ければ(s==a?でYES)、演算部は、ボロー値が0であるとみなし、スレッドtの処理を終了する。
また、演算部は、変化があれば(s==a?でNO)、減算結果を、Z[t+i]に出力し、制御部がiに1を加算する(S404)。
ボロー値が0になる(すなわち、s==a?でYESとなる)か、iがnとなるまでS403、S404を繰り返す。
n本のスレッド全てがループを抜けたら処理を終了する。
図5に示すS403の処理1及び処理2、s==a?の判断、S404の処理1が、第2フェーズの1ラウンド分の処理に該当する。
図6は、本実施の形態に係る多倍長減算における値の変化を示す。
図6では、内容を理解しやすくするため、内部演算幅を十進数とし、4桁の演算を4つのスレッド(スレッド番号0〜3)で実行した場合について示している。図6では、7634(Y)−5678(X)=1956(Z)を計算する例を示す。
また、図7は、図6に示した計算の内訳を、スレッド番号0について示している。
次に、本実施の形態に係る多倍長演算装置100の効果を説明する。
本実施の形態では、各桁の減算は1回で終了し、その後、ボローの処理を行う。
ボローの処理のワーストケースはO(n)となるが、入力がランダムである場合、ボローが最後まで残る確率は非常に低いため、数回のボローの計算で図5のループを抜けることができる。
よって、減算処理を高速に行うことができる。
また、ボロー減算前後の値を比較することで、ボロー情報を直接参照できなくても、ボローの有無を判定することができる。
また、本実施の形態に係る多倍長演算装置100は、前述したように、SIMD計算機等の通常の計算機で実現可能であり、専用装置を用いることなく、多倍長減算を高速に行うことができる。
以上、本実施の形態では、
複数のプロセッサを内蔵し、単一の命令を複数のデータに対して同時に実行できる計算機と、データを格納し、前記プロセッサが同時にアクセスできるメモリを有する多倍長整数演算装置であって、入力X,Yに対して、Z=Y−Xを計算する多倍長減算を以下のステップで実行する多倍長整数演算装置を説明した。
1.入力データを計算機の内部演算幅毎に複数の桁(以降、それぞれX[n],Y[n]と記す)に分割するステップ
2.スレッドごとに自身のスレッド番号tと演算するスレッド本数nを取得するステップ
3.Zを0にセットするステップ
4.Y[t]−X[t]を計算し、減算結果とボローdを求め、前記減算結果をZ[t]に格納するステップ
5.桁iを1に設定するステップ
6.Z[t+i]−cを計算し、新たな減算結果と新たなボローdを求め、前記減算結果をZ[t+i]に格納するステップ
7.桁iに1を加算するステップ
8.i<nかつ、c≠0の間、ステップ6〜7を実行するステップ
9.前記スレッドの全てがステップ6〜8を完了するのを待つステップ。
実施の形態3.
本実施の形態では、多倍長乗算処理を行う。
本実施の形態に係る多倍長演算装置100の構成は図1に示したものと同じである。
次に、本実施の形態に係る計算部101の動作の概略を説明する。
本実施の形態では、入力値Xと入力値Yを乗算した乗算結果(X×Y)を変数Zに出力する。
なお、実施の形態1と同様に、本実施の形態でも、入力値X、入力値Yのビット幅がl(l>b)ビットであり、制御部が入力値Xと入力値Yをそれぞれn桁に分割し、変数X[0]〜X[n−1]と変数Y[0]〜Y[n−1]とを設け、更に、変数Z[0]〜Z[2n−1]を設ける。
また、制御部が分割値をX[0]〜X[n−1]を格納する手順、Y[0]〜Y[n−1]に格納する手順も実施の形態1と同じである。
更に、演算部も、実施の形態1と同様に、n個のスレッドを並列に実行し、第1フェーズの処理と、第2フェーズの処理とを行う。
本実施の形態では、まず、制御部が、カウンタ値iを0に設定し、演算部に第1フェーズの処理を開始させる。
また、制御部は、カウンタ値iがnに達するまでの間、演算部が第1フェーズの1ラウンド分の処理を終了する度に、カウンタ値iをインクリメントする。
演算部は、カウンタ値iがnに達するまでの間、制御部によりカウンタ値iがインクリメントされる度に、スレッドtにおいて、第1フェーズの1ラウンド分の処理を繰り返す。
第1フェーズの1ラウンド分の処理は、以下の〈1−a〉と〈1−b〉の処理である。
〈1−a〉入力値Xのt番目の変数X[t]の値と、入力値Yのi番目の変数Y[i]の値と、(t+i)番目の変数Z[t+i]の値と、スレッドtで得られたキャリー成分値cとを用いて、(X[t]の値)×(Y[i]の値)+(Z[t+i]の値)+cを計算する。
〈1−b〉計算結果の下位1ワードの値を(t+i)番目の変数Z[t+i]に格納し、計算結果の上位1ワードの値を新たなキャリー成分値cとする。
次に、制御部は、カウンタ値iがnに達すると、演算部に第2フェーズの処理を開始させる。
そして、制御部は、カウンタ値iが2nに達するまでの間、演算部が第2フェーズの1ラウンド分の処理を終了する度に、カウンタ値iをインクリメントする。
演算部は、カウンタ値iが2nに達するまでの間、制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第2フェーズの1ラウンド分の処理を繰り返す。
第2フェーズの1ラウンド分の処理は、以下の〈2−a〉と〈2−b〉の処理である。
〈2−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第2フェーズの処理を停止する。
〈2−b〉0でない場合に(Z[t+i]の値)+cを計算し、計算結果の下位1ワードの値を変数Z[t+i]の新たな値とし、計算結果の上位1ワードの値を新たなキャリー成分値cとする。
次に、図8のフローチャートを参照して、本実施の形態に係る多倍長演算装置100で多倍長乗算を行う場合の手順を説明する。
なお、図8において、大文字で示す変数はメモリ102上のデータとし、小文字で示す変数は汎用レジスタ108上のデータとする。
また、各変数のデータ長は1ワードとする。
ただし、図8において太字で表記している変数は2ワードとする。
なお、明細書では、2ワードの変数は、ダブルクオーテーションで表現する(例えば、“m”)。
また、入力値ceil(l/b)ワードがnに満たない場合は、満たない部分のワードを予め0でクリアする。
まず、演算部が、汎用レジスタ108から、スレッドごとに自身のスレッド番号と演算するスレッド本数を取得し、また、Zと“c”を0にセットし、制御部がiに0をセットする(S601)。
そして、iがn未満の場合、演算部は、乗算処理を行う。
つまり、演算部は、“m”=X[t]×Y[i]+Z[t+i]+“c”を計算する。
更に、演算部は、“m”の下位1ワードをZ[t+i]に、上位1ワードを“c”に出力する。
次に、制御部が、iに1を加算する(S602)。
ここで、Mul_w(a,b)は1ワードのaとbの積を求め、2ワードの乗算結果を出力することを意味する。
なお、図8のS602の処理1〜4が、第1フェーズの1ラウンド分の処理に相当する。
iがn以上となったら、演算部は、乗算処理を抜け、キャリー処理を行う。
つまり、演算部は、キャリー成分値“c”が0であるか否かを判断し、“c”が0でない場合に(“c”==0?でNO)、“c”=Z[t+i]+“c”を計算し、“c”の下位1ワードをZ[t+i]に、上位1ワードを“c”に出力する。
そして、制御部が、変数iに1を加算する(S603)。
i≧2nまたは“c”=0となるまでループを繰り返す。
つまり、演算部は、変数iが2nに達するまでの間、制御部により変数iがインクリメントされる度に、停止していないスレッドtにおいて、スレッドtで得られたキャリー成分値“c”が0であるか否かを判断し、キャリー成分値“c”が0である場合(“c”==0?でYES)にスレッドtの処理を停止し、キャリー成分値“c”が0でない場合(“c”==0?でNO)は、S603の処理を行う。
n本のスレッド全てがループを抜けたら処理を終了する。
なお、図8に示すS603の処理1〜3、“c”==0?の判断が、第2フェーズの1ラウンド分の処理に該当する。
図9及び図10は、本実施の形態に係る多倍長乗算における値の変化を示す。
図9及び図10では、内容を理解しやすくするため、内部演算幅を十進数とし、4桁の演算を4つのスレッド(スレッド番号0〜3)で実行した場合について示している。図9及び図10では、1234(X)*5678(Y)=7006652(Z)を計算する例を示す。
なお、図10には、図9との連続性を明示するために、図9の最下段に示しているi=3の際の計算過程を再度提示している。
また、図11及び図12は、図9及び図10に示した計算の内訳を、スレッド番号0について示している。
次に、本実施の形態に係る多倍長演算装置100の効果を説明する。
本実施の形態では、乗算処理はn回のループで終了する。
また、乗算処理中にキャリーの加算処理も行う点は、本実施の形態の多倍長乗算の特徴の1つである。
キャリー処理について、乗算処理終了後にキャリー成分が残っていれば、前記キャリー成分が0になるまで、加算を行う。
キャリー処理のワーストケースはO(n)となるが、入力がランダムである場合、キャリーが最後まで残る確率は非常に低いため、数回のキャリーの計算でループを抜けることができる。
よって、多倍長乗算処理はn+α(α<n)で行うことができる。
また、本実施の形態に係る多倍長演算装置100は、前述したように、SIMD計算機等の通常の計算機で実現可能であり、専用装置を用いることなく、多倍長乗算を高速に行うことができる。
以上、本実施の形態では、
複数のプロセッサを内蔵し、単一の命令を複数のデータに対して同時に実行できる計算機と、データを格納し、前記プロセッサが同時にアクセスできるメモリを有する多倍長整数演算装置であって、入力X,Yに対して、Z=XYを計算する多倍長乗算を以下のステップで実行する多倍長整数演算装置を説明した。
1.入力データを計算機の内部演算幅毎に複数の桁(以降、それぞれX[n],Y[n]と記す)に分割するステップ
2.出力Z,キャリーc,桁iに0をセットするステップ
3.“m”=X[t]×Y[i]+Z[t+i]+cを計算し、“m”の下位1ワードをZ[t+i]に、上位1ワードをcに出力するステップ
4.桁iに1を加算するステップ
5.i<nの間、ステップ3〜4を実行するステップ
6.c=Z[t+i]+cを計算し、cの下位1ワードをZ[t+i]に、上位1ワードをcに出力するステップ
7.iに1を加算するステップ
8.i<2nかつ、c≠0の間、ステップ6〜7を実行するステップ
9.前記スレッドの全てがステップ6〜8を完了するのを待つステップ。
実施の形態4.
本実施の形態では、多倍長モンゴメリ・リダクション処理を行う。
本実施の形態に係る多倍長演算装置100の構成は図1に示したものと同じである。
次に、本実施の形態に係る計算部101の動作の概略を説明する。
本実施の形態では、演算部の演算ビット幅である1ワード(bビット)よりも大きなビット幅の入力値Xと法Mとに対して、r=2、R=rとして定義されたRと、(−M−1 mod r)として定義されたMInvとを用いて、(XR−1 mod M)を計算するモンゴメリ・リダクションを行う。ただし、0≦X<MRとする。
なお、上記のnは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2である。
また、本実施の形態では、入力値Xを1ワードごとに分割した際の入力値Xの分割数は、2nであるとする。
まず、制御部が、入力値X及び法Mを、それぞれ1ワードごとに分割する。
また、制御部は、入力値Xから分割された2n個の分割値を格納するための2n個の変数X[0]〜X[2n−1]を、いずれかの記憶領域(例えば、メモリ102)に設ける。
また、制御部は、入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(2n−1)番目の変数X[2n−1]に格納されるようにして、2n個の分割値を変数X[0]〜X[2n−1]に格納する。
また、制御部は、いずれかの記憶領域(例えば、メモリ102)に、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を設ける。
また、制御部は、法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納する。
更に、制御部は、いずれかの記憶領域(例えば、メモリ102)に、演算部による計算結果を格納するn個の変数Z[0]〜Z[n−1]を設ける。
演算部は、実施の形態1〜3と同様に、スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行する。
演算部の処理は、第1フェーズ〜第4フェーズの処理に大別される。
演算部は、第1フェーズの処理として、以下の〈1−a〉と〈1−b〉の処理を行う。
〈1−a〉スレッドtにおいて、入力値Xの0番目の変数X[0]の値とMInvとを用いて、(X[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとする。
〈1−b〉スレッドtにおいて、法Mのt番目の変数M[t]の値と、入力値Xのt番目の変数X[t]の値と、前記uとを用いて、(M[t]の値)×u+(X[t]の値)を計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t]の新たな値とし、計算結果mの上位1ワードの値をキャリー成分値cとする。
〈1−c〉0番目のスレッドであるスレッド0において、スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする。
次に、制御部は、カウンタ値iを1に設定し、演算部に第2フェーズの処理を開始させる。
そして、カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントする。
演算部は、制御部によりカウンタ値iがインクリメントされる度に、第2フェーズの1ラウンド分の処理を繰り返す。
第2フェーズの1ラウンド分の処理は、以下の〈2−a〉と〈2−b〉の処理である。
〈2−a〉スレッドtにおいて、入力値Xの0番目の変数X[0]の値とi番目の変数X[i]の値と、MInvとを用いて、{(X[0]の値)+(X[i]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとする。
〈2−b〉スレッドtにおいて、法Mのt番目の変数M[t]の値と、前記uと、入力値Xの(t+i)番目の変数X[t+i]の値と、スレッドtで得られたキャリー成分値cとを用いて、(M[t]の値)×u+(X[t+i]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t+i]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとする。
〈2−c〉0番目のスレッドであるスレッド0において、スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする。
また、演算部は、カウンタ値iがnに達すると、スレッド0において、値0を変数X[0]の新たな値とする。
次に、制御部は、カウンタ値iがnに達すると、スレッド0において値0が変数X[0]の新たな値とされた後に、演算部に第3フェーズの処理を開始させる。
そして、カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントする。
演算部は、カウンタ値iが2nに達するまでの間、制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第3フェーズの1ラウンド分の処理を繰り返す。
第3フェーズの1ラウンド分の処理は、以下の〈3−a〉と〈3−b〉の処理である。
〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止する。
〈3−b〉0でない場合に、(X[(t+i) mod 2n]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[(t+i) mod 2n]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとする。
制御部は、カウンタ値iが2nに達した場合、又は全てのスレッドtが第3フェーズの処理を停止した場合に、演算部に第4フェーズの処理を開始させる。
演算部は、第4フェーズの処理として、以下の処理を行う。
変数X[0]の値を変数aに格納し、変数X[n]〜X[2n−1]の値を、それぞれ、変数X[0]〜X[n−1]に格納する。
変数aの値が0でない場合、又は変数X[n−1]〜X[0]の値を連接して得られる値が法M以上の場合に、X−Mを計算し、計算結果を変数X[0]〜X[n−1]に格納し、変数X[0]〜X[n−1]の値を変数Z[0]〜Z[n−1]に格納する。
次に、図13のフローチャートを参照して、本実施の形態に係る多倍長演算装置100でモンゴメリ・リダクションを行う場合の手順を説明する。
図13では、入力値Xのモンゴメリ・リダクションの結果XR−1 mod Mを変数Zに出力する。
入力値Xは2n桁に分割され、n個のスレッドを用いて計算を行う。
また、入力値XはX<M・Rの関係を満たすものとする。
ここで、R=rとし、r=2とする。
Zはnワードのサイズを持つ。
MInvは−M−1 mod rを満たす1ワード整数である。
図13において、大文字で示す変数はメモリ102上のデータとし、小文字で示す変数は汎用レジスタ108上のデータとする。
また、各変数のデータ長は1ワードとする。
ただし、図13において太字で表記した変数は2ワードとする。
なお、明細書では、2ワードの変数は、ダブルクオーテーションで表現する(例えば、“m”)。
また、入力値ceil(l/b)ワードがnに満たない場合は、満たない部分のワードを予め0でクリアする。
まず、演算部が、汎用レジスタ108から、スレッドごとに自身のスレッド番号と演算するスレッド本数を取得し、制御部が、変数iに1をセットする(S801)。
次に、モンゴメリ・リダクション処理を行う。
具体的には、演算部が、X[0]×MInvの下位1ワードuを求め、“m”=M[t]×u+X[t]を計算する。
ここで、Mul_lo(a,b)は1ワード入力a,bに対し、a×bを計算し、下位1ワードを出力することを意味する。
そして、演算部は、“m”の下位1ワードをX[t]に出力し、上位1ワードを“c”に出力する(S802)。
また、演算部は、スレッド番号が0である場合(t==0?でYES)、“c”の下位1ワードをX[0]に出力する(S803)。
なお、図13のS802とS803が第1フェーズの処理に相当する。
iがn未満の場合、演算部は、(X[0]+X[i])×MInvの下位1ワードuを求め、“m”=M[t]×u+X[t+i]+“c”を計算する。
また、演算部は、“m”の下位1ワードをX[t+i]に出力し、上位1ワードを“c”に出力する。
そして、制御部が、変数iに1を加算する(S804)。
また、演算部は、スレッド番号が0である場合(t==0?でYES)、“c”の下位1ワードをX[0]に出力する(S805)。
なお、図13のS804の処理1〜6、S805が、第2フェーズの1ラウンド分の処理に該当する。
iがn以上となったらモンゴメリ・リダクション処理を抜け、キャリー処理を行う。
始めに、演算部は、スレッド番号が0である場合(t==0?でYES)、X[0]に0を出力する(S806)。
また、演算部は、“m”=X[(t+i)%2n]+“c”を計算し、“m”の下位1ワードをX[(t+i)%2n]に、上位1ワードを“c”に出力する。
制御部が、変数iに1を加算する(S807)。
i≧2nまたは“c”=0となるまでループを繰り返す。
つまり、演算部は、変数iが2nに達するまでの間、制御部により変数iがインクリメントされる度に、停止していないスレッドtにおいて、スレッドtで得られたキャリー成分値“c”が0であるか否かを判断し、キャリー成分値“c”が0である場合(“c”==0?でYES)にスレッドtの処理を停止し、キャリー成分値“c”が0でない場合(“c”==0?でNO)は、S807の処理を行う。
そして、n本のスレッド全てがループを抜けたらキャリー処理を終了する。
なお、図13に示す“c”==0?の判断、S807の処理1〜4が、第3フェーズの1ラウンド分の処理に該当する。
なお、メモリが十分にある場合は、2nの剰余演算を省略してもよい。
この場合、後述の減算処理で変数aに格納するデータはX[2n]になることに注意する。
キャリー処理を終了したら、減算処理を行う。
演算部は、まず、X[0]の値を変数aに出力し、Xの値をnワードシフトする(S808)。
つまり、演算部は、変数X[n]〜X[2n−1]の値を、それぞれ、変数X[0]〜X[n−1]に格納する。
そして、aの値が0でないか、X[n−1,…,0]の値(X[n−1]〜X[0]の値を連接して得られる値)が法M以上の場合は、演算部は、多倍長整数減算X−Mを実行し、結果をXに格納する(S809)。
最後に、演算部は、X[0]〜X[n−1]の値をZ[0]〜Z[n−1]に格納する(S810)。
なお、図13に示すS808〜S810が、第4フェーズの処理に相当する。
図14及び図15は、本実施の形態に係るモンゴメリ・リダクションにおける値の変化を示す。
図14及び図15では、内容を理解しやすくするため、内部演算幅を十進数とし、4桁の演算を4つのスレッド(スレッド番号0〜3)で実行した場合について示す。図14及び図15では、2345678(X)*R−1 mod 3511(M)=1745(Z)を計算する例を示す。
この場合、n=4、R=10=10、r=10、MInv=−3511−1 mod 10=9となる。
なお、図15には、図14との連続性を明示するために、図14の最下段に示しているi=3の際の計算過程を再度提示している。
また、図16及び図17は、図14及び図15に示した計算の内訳を、スレッド番号0について示している。
次に、本実施の形態に係る多倍長演算装置100の効果を説明する。
本実施の形態では、モンゴメリ・リダクション処理はn回のループで終了する。
モンゴメリ・リダクション処理中にキャリーの加算処理も行う点が、本実施の形態の特徴の1つである。
また、各ステップで、最下位の桁を処理するスレッドのキャリーをメモリに出力することで、計算量をO(n)にすることができる。
キャリー処理について、モンゴメリ・リダクション処理終了後にキャリー成分が残っていれば、前記キャリー成分が0になるまで、加算を行う。
キャリー処理のワーストケースはO(n)となるが、入力がランダムである場合、キャリーが最後まで残る確率は非常に低いため、数回のキャリーの計算でループを抜けることができる。
また、2nで剰余をとることで、多倍長整数乗算と同じメモリサイズでモンゴメリ・リダクションを行うことができる。
さらに、nが2のべき乗の場合、演算コストの大きい剰余演算を、演算コストの小さいビット演算で実現することができる。
また、本実施の形態に係る多倍長演算装置100は、前述したように、SIMD計算機等の通常の計算機で実現可能であり、専用装置を用いることなく、モンゴメリ・リダクションを高速に行うことができる。
なお、本実施の形態では、入力値Xのビット幅は、1ワード単位で分割した際に2n個に分割され、変数Xが2n個設けられるものとした。
このため、図13のS807の処理1及び処理3で2nの剰余演算を行うことにした。
しかし、メモリが十分にある場合は、入力値Xを格納する変数Xを、v個(但し、vはnの倍数、つまり、vは3n、4n等)で構成してもよい。ただし、入力Xに格納される値の範囲は0≦X<MRを満たすものとする。
このような変数Xの場合は、図13のS807の処理1及び処理3における2nの剰余演算は省略される。
また、同様に、減算処理(図13のS808の処理1)で変数aに格納するデータはX[2n]になる。
更に、減算処理(図13のS808の処理2)で、X[]〜X[2n−1]の値を、それぞれ、X[0]〜X[n−1]に格納する。
以上、本実施の形態では、
複数のプロセッサを内蔵し、単一の命令を複数のデータに対して同時に実行できる計算機と、データを格納し、前記プロセッサが同時にアクセスできるメモリを有する多倍長整数演算装置であって、入力X,法M,内部演算幅b(bit)に対し、“r=2b”,“R=rn”として定義されたRと、“−M−1 mod r”として定義されたMInvを用いて、Z=XR−1 mod Mを計算するモンゴメリ・リダクションを以下のステップで実行する多倍長整数演算装置を説明した。
1.入力データと法を計算機の内部演算幅毎に複数の桁(以降、それぞれX[n],M[n]と記す)に分割するステップ
2.スレッドごとに自身のスレッド番号tと演算するスレッド本数nを取得するステップ
3.X[0]×MInvの下位1ワードuを求め、“m”=M[t]×u+X[t]を計算するステップ
4.“m”の下位1ワードをX[t]に出力し、上位1ワードを“c”に出力するステップ
5.スレッド番号が0である場合、“c”の下位1ワードをX[0]に出力するステップ
6.桁iに1を設定するステップ
7.(X[0]+X[i])×MInvの下位1ワードuを求め、“m”=M[t]×u+X[t+i]+“c”を計算するステップ
8.“m”の下位1ワードをX[t+i]に出力し、上位1ワードを“c”に出力するステップ
9.スレッド番号が0である場合、cの下位1ワードをX[0]に出力するステップ
10.桁iに1を加算するステップ
11.i<nの間、ステップ6〜9を実行するステップ
12.スレッド番号が0である場合、X[0]に0を出力するステップ
13.“m”=X[(t+i)%2n]+“c”を計算し、“m”の下位1ワードをX[(t+i)%2n]に、上位1ワードを“c”に出力するステップ
14.桁iに1を加算するステップ
15.i<2nかつ、c≠0の間、ステップ13〜14を実行するステップ
16.前記スレッドの全てがステップ13〜15を完了するのを待つステップ
17.X[0]の値を変数aに取得するステップ
18.Xの値をnワードシフトするステップ
19.aの値が0でないか、X[n−1,…,0]の値がM以上の場合は、多倍長整数減算X−Mを実行し、結果をXに格納するステップ
20.X[0]〜X[n−1]の値をZ[0]〜Z[n−1]に格納するステップ
また、本実施の形態では、
上記のステップ12にて、“m”=X[t+i]+“c”を計算し、“m”の下位1ワードをX[t+i]に、上位1ワードを“c”に出力するステップを実行し、上記のステップ17にて、X[2n]の値を変数aに取得するステップを実行する多倍長整数演算装置を説明した。
実施の形態5.
本実施の形態では、多倍長モンゴメリ乗算処理を行う。
本実施の形態に係る多倍長演算装置100の構成は図1に示したものと同じである。
次に、本実施の形態に係る計算部101の動作の概略を説明する。
本実施の形態では、それぞれのビット幅が共通しており、それぞれのビット幅が演算部の演算ビット幅である1ワード(bビット)よりも大きい入力値Xと入力値Yと法Mとに対して、r=2、R=rとして定義されたRと、(−M−1 mod r)として定義されたMInvとを用いて、(XYR−1 mod M)を計算するモンゴメリ乗算を行う。ただし、0≦X,Y<Mとする。
なお、上記のnは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2である。
また、本実施の形態では、入力値Xを1ワードごとに分割した際の入力値Xの分割数、入力値Yを1ワードごとに分割した際の入力値Yの分割数は、それぞれnであるとする。
まず、制御部が、入力値X、入力値Y及び法Mを、それぞれ1ワードごとに分割する。
また、制御部は、入力値Xから分割されたn個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを、いずれかの記憶領域(例えば、メモリ102)に設ける。
また、制御部は、入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納する。
更に、制御部は、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納する。
また、制御部は、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を、いずれかの記憶領域(例えば、メモリ102)に設ける。
また、制御部は、法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納する。
また、制御部は、演算部による計算結果を格納する2n個の変数Z[0]〜Z[2n−1]を、いずれかの記憶領域(例えば、メモリ102)に設ける。
演算部は、実施の形態1〜4と同様に、スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行する。
演算部の処理は、第1フェーズ〜第4フェーズの処理に大別される。
演算部は、第1フェーズの処理として、以下の〈1−a〉〜〈1−f〉の処理を行う。
〈1−a〉スレッドtにおいて、入力値Xの0番目の変数X[0]の値と、入力値Yの0番目の変数Y[0]の値と、MInvとを用いて、(X[0]の値)×(Y[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとする。
〈1−b〉スレッドtにおいて、法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとする。
〈1−c〉スレッドtにおいて、入力値Xの0番目の変数X[0]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[0]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとする。
〈1−d〉スレッドtにおいて、前記umの下位1ワードと前記xyの下位1ワードとを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値をt番目の変数Z[t]に格納する。
〈1−e〉スレッドtにおいて、前記mの上位1ワードと前記umの上位1ワードと前記xyの上位1ワードとを加算し、2ワードの計算結果をキャリー成分値cとする。
〈1−f〉0番目のスレッドであるスレッド0において、スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする。
次に、制御部は、カウンタ値iを1に設定し、演算部に第2フェーズの処理を開始させる。
そして、制御部は、カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントする。
演算部は、制御部によりカウンタ値iがインクリメントされる度に、第2フェーズの1ラウンド分の処理を繰り返す。
第2フェーズの1ラウンド分の処理は、以下の〈2−a〉〜〈2−f〉の処理である。
〈2−a〉スレッドtにおいて、0番目の変数Z[0]とi番目の変数Z[i]と、入力値Xのi番目の変数X[i]と、入力値Yの0番目の変数Y[0]と、MInvとを用いて、{(Z[0]の値)+(Z[i]の値)+(X[i]の値)×(Y[0]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとする。
〈2−b〉スレッドtにおいて、法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとする。
〈2−c〉スレッドtにおいて、入力値Xのi番目の変数X[i]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[i]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとする。
〈2−d〉スレッドtにおいて、前記umの下位1ワードと、前記xyの下位1ワードと、ステップtで得られたキャリー成分値cの下位1ワードと、(t+i)番目の変数Z[t+i]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を(t+i)番目の変数Z[t+i]の新たな値とする。
〈2−e〉スレッドtにおいて、前記mの上位1ワードと、前記umの上位1ワードと、前記xyの上位1ワードと、ステップtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとする。
〈2−f〉0番目のスレッドであるスレッド0において、スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする。
また、演算部は、カウンタ値iがnに達すると、スレッド0において、値0を変数Z[0]の新たな値とする。
カウンタ値iがnに達すると、スレッド0において値0が変数X[0]の新たな値とされた後に、制御部は、演算部に第3フェーズの処理を開始させる。
そして、制御部は、カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントする。
演算部は、カウンタ値iが2nに達するまでの間、制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第3フェーズの1ラウンド分の処理を繰り返す。
第3フェーズの1ラウンド分の処理は、以下の〈3−a〉及び〈3−b〉の処理である。
〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止する。
〈3−b〉0でない場合に、スレッドtで得られたキャリー成分値cの下位1ワードと変数Z[(t+i) mod 2n]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数Z[(t+i) mod 2n]の新たな値とし、前記mの上位1ワードとスレッドtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとする。
制御部は、カウンタ値iが2nに達した場合、又は全てのスレッドtが第3フェーズの処理を停止した場合に、演算部に第4フェーズの処理を開始させる。
演算部は、第4フェーズの処理として、以下の処理を行う。
変数Z[0]の値を変数aに格納し、変数Z[n]〜Z[2n−1]の値を、それぞれ、変数Z[0]〜Z[n−1]に格納する。
変数aの値が0でない場合、又は変数Z[n−1]〜Z[0]の値を連接して得られる値が法M以上の場合に、Z−Mを計算し、計算結果を変数Z[0]〜Z[n−1]に格納する。
次に、図18のフローチャートを参照して、本実施の形態に係る多倍長演算装置100でモンゴメリ乗算を行う場合の手順を説明する。
図18では、入力値X,Yのモンゴメリ乗算の結果XYR−1 mod MをZに出力する。
Zは2nワードのサイズをもち、中間変数値の格納も行う。
入力値X,Yはn桁に分割され、n個のスレッドを用いて計算を行う。
また、入力値X,YはX,Y<Mの関係を満たすものとする。
ここで、R=rとし、r=2とする。
MInvは−M−1 mod rを満たす1ワード整数である。
図18において、大文字で示す変数はメモリ102上のデータとし、小文字で示す変数は汎用レジスタ108上のデータとする。
また、各変数のデータ長は1ワードとする。
ただし、図18において太字で表記した変数は2ワードとする。
なお、明細書では、2ワードの変数は、ダブルクオーテーションで表現する(例えば、“c”)。
また、入力値ceil(l/b)ワードがnに満たない場合は、満たない部分のワードを予め0でクリアする。
まず、演算部が、汎用レジスタ108から、スレッドごとに自身のスレッド番号と演算するスレッド本数を取得し、また、Zを0にセットし、制御部が変数iを1にセットする(S1001)。
次にモンゴメリ乗算処理を行う。
具体的には、演算部が、X[0]×Y[0]×MInvの下位1ワードuを求め、M[t]×u+X[0]×Y[t]を計算する。
計算を2ワード以下の変数で行うため、M[t]×u,X[0]×Y[t]を上位ワードと下位ワードに分解し、下位ワードみの加算を行なった後、加算結果の下位1ワードをZ[t]に出力する。
また、演算部は、前記加算結果の上位ワードと前記M[t]×u,X[0]×Y[t]の上位ワードを加算し、2ワードデータ“c”を生成する(S1002)。
演算部は、スレッド番号が0である場合(t==0?でYES)、“c”の下位1ワードをZ[0]に出力する(S1003)。
なお、図18のS1002とS1003が第1フェーズの処理に相当する。
iがn未満の場合、演算部は、(Z[0]+Z[i]+X[i]×Y[0])×MInvの下位1ワードuを求め、M[t]×u+X[0]×Y[t]+Z[t+i]+“c”を計算する。
計算を2ワード以下の変数で行うため、M[t]×u,X[0]×Y[t],“c”を上位ワードと下位ワードに分解し、下位ワードみの加算を行なった後、加算結果の下位1ワードをZ[t+i]に出力する。
また、演算部は、前記加算結果の上位ワードと前記M[t]×u,X[0]×Y[t],“c”の上位ワードを加算し、2ワードデータ“c”を生成する。
また、制御部が、変数iに1を加算する(S1004)。
演算部は、スレッド番号が0である場合(t==0?でYES)、“c”の下位1ワードをZ[0]に出力する(S1005)。
なお、図18のS1004の処理1〜15、S1005が、第2フェーズの1ラウンド分の処理に該当する。
iがn以上となったらモンゴメリ乗算処理を抜け、キャリー処理を行う。
始めに、演算部は、スレッド番号が0である場合(t==0?でYES)、Z[0]に0を出力する(S1006)。
次に、演算部は、Z[(t+i)%2n]+“c”を計算する。
計算を2ワード以下の変数で行うため、“c”を上位ワードと下位ワードに分解し、下位ワードみの加算を行なった後、加算結果の下位1ワードをZ[(t+i)%2n]に出力する。
また、演算部は、前記加算結果の上位ワードと前記“c”の上位ワードを加算し、2ワードデータ“c”を生成する。
制御部が、変数iに1を加算する(S1007)。
i≧2nまたは“c”=0となるまでループを繰り返す。
つまり、演算部は、変数iが2nに達するまでの間、制御部により変数iがインクリメントされる度に、停止していないスレッドtにおいて、スレッドtで得られたキャリー成分値“c”が0であるか否かを判断し、キャリー成分値“c”が0である場合(“c”==0?でYES)にスレッドtの処理を停止し、キャリー成分値“c”が0でない場合(“c”==0?でNO)は、S1007の処理を行う。
そして、n本のスレッド全てがループを抜けたらキャリー処理を終了する。
なお、図18に示す“c”==0?の判断、S1007の処理1〜4が、第3フェーズの1ラウンド分の処理に該当する。
なお、メモリが十分にある場合は、2nの剰余演算を省略してもよい。
この場合、後述の減算処理で変数aに格納するデータはZ[2n]になることに注意する。
キャリー処理を終了したら、減算処理を行う。
演算部は、まず、Z[0]の値を変数aに出力し、Zの値をnワードシフトする(S1008)。
つまり、演算部は、変数Z[n]〜Z[2n−1]の値を、それぞれ、変数Z[0]〜Z[n−1]に格納する。
そして、aの値が0でないか、Z[n−1,…,0]の値(Z[n−1]〜Z[0]の値を連接して得られる値)が法M以上の場合は、演算部は、多倍長整数減算Z−Mを実行し、結果をZに格納する(S1009)。
最後に、演算部は、Z[0]〜Z[n−1]を出力する。
なお、図13に示すS1008、S1009及びZ[0]〜Z[n−1]の出力が、第4フェーズの処理に相当する。
図19及び図20は、本実施の形態に係るモンゴメリ乗算における値の変化を示す。
図19及び図20では、内容を理解しやすくするため、内部演算幅を十進数とし、4桁の演算を4つのスレッド(スレッド番号0〜3)で実行した場合について示す。図14及び図15では、5678(X)*4321(Y)*R−1 mod 6131(M)=3736(Z)を計算する例を示す。
この場合、n=4、R=10=10、r=10、MInv=−6131−1 mod 10=9となる。
なお、図20には、図19との連続性を明示するために、図19の最下段に示しているi=3の際の計算過程(一部)を再度提示している。
また、図21及び図22は、図19及び図20に示した計算の内訳を、スレッド番号0について示している。
次に、本実施の形態に係る多倍長演算装置100の効果を説明する。
本実施の形態では、モンゴメリ乗算処理はn回のループで終了する。
モンゴメリ乗算処理中にキャリーの加算処理も行う点が、本実施の形態の特徴の1つである。
また、加算データを上位と下位で分割して加算することで、3ワードの変数が必要な計算を、2ワード以下の変数で行うことができる。
さらに、各ステップで、最下位の桁を処理するスレッドのキャリーをメモリに出力することで、計算量をO(n)にすることができる。
キャリー処理について、モンゴメリ乗算処理終了後にキャリー成分が残っていれば、前記キャリー成分が0になるまで、加算を行う。
キャリー処理のワーストケースはO(n)となるが、入力がランダムである場合、キャリーが最後まで残る確率は非常に低いため、数回のキャリーの計算でループを抜けることができる。
また、2nで剰余をとることで、多倍長整数乗算と同じメモリサイズでモンゴメリ乗算処理を実現することができる。
さらに、nが2のべき乗の場合、演算コストの大きい剰余演算を、演算コストの小さいビット演算で実現することができる。
また、本実施の形態に係る多倍長演算装置100は、前述したように、SIMD計算機等の通常の計算機で実現可能であり、専用装置を用いることなく、モンゴメリ乗算を高速に行うことができる。
なお、本実施の形態では、変数Zは2nワードで構成されるものとした。
このため、図18のS1007の処理3及び処理4で2nの剰余演算を行うことにした。
しかし、変数Zは、vワード(但し、vはnの倍数、つまり、vは3n、4n等)で構成してもよい。
このような変数Zの場合は、図18のS1007の処理3及び処理4における2nの剰余演算は省略される。
また、同様に、減算処理(図18のS1008の処理1)で変数aに格納するデータはZ[2n]になる。
更に、減算処理(図18のS1008の処理2)で、Z[]〜Z[2n−1]の値を、それぞれ、Z[0]〜Z[n−1]に格納する。
以上、本実施の形態では、
複数のプロセッサを内蔵し、単一の命令を複数のデータに対して同時に実行できる計算機と、データを格納し、前記プロセッサが同時にアクセスできるメモリを有する多倍長整数演算装置であって、入力X,Y,法M,内部演算幅b(bit)に対し、“r=2b”,“R=rn”として定義されたRと、“−M−1 mod r”として定義されたMInvを用いて、Z=XYR−1 mod Mを計算するモンゴメリ乗算を以下のステップで実行する多倍長整数演算装置を説明した。
1.入力データと法を計算機の内部演算幅毎に複数の桁(以降、それぞれX[n],Y[n],M[n]と記す)に分割するステップ
2.スレッドごとに自身のスレッド番号tと演算するスレッド本数nを取得するステップ
3.Zを0にセットするステップ
4.X[0]×Y[0]×MInvの下位1ワードuを求め、M[t]×uとX[0]×Y[t]を計算するステップ
5.前記M[t]×uとX[0]×Y[t]の下位ワードみの加算を行なった後、加算結果の下位1ワードをZ[t]に出力するステップ
6.前記加算結果の上位ワードと前記M[t]×u,X[0]×Y[t]の上位ワードを加算し、2ワードデータ“c”を生成するステップ
7.スレッド番号が0である場合、“c”の下位1ワードをZ[0]に出力するステップ
8.桁iに1を設定するステップ
9.(Z[0]+Z[i]+X[i]×Y[0])×MInvの下位1ワードuを求め、M[t]×uとX[i]×Y[t]を計算するステップ
10.前記M[t]×u,X[0]×Y[t],“c”の下位ワードとZ[t+i]との加算を行なった後、加算結果の下位1ワードをZ[t+i]に出力するステップ
11.前記加算結果の上位ワードと前記M[t]×u,X[0]×Y[t],“c”の上位ワードを加算し、2ワードデータ“c”を生成するステップ
12.変数iに1を加算するステップ
13.スレッド番号が0である場合、“c”の下位1ワードをZ[0]に出力するステップ
14.i<nの間、ステップ9〜13を実行するステップ
15.スレッド番号が0である場合、Z[0]に0を出力するステップ
16.“c”の下位ワードとZ[(t+i)%2n]との加算を行なった後、加算結果の下位1ワードをZ[(t+i)%2n]に出力するステップ
17.前記加算結果の上位ワードと前記“c”の上位ワードを加算し、2ワードデータ“c”を生成するステップ
18.桁iに1を加算するステップ
19.i<2nかつ、c≠0の間、ステップ16〜18を実行するステップ
20.前記スレッドの全てがステップ16〜18を完了するのを待つステップ
21.Z[0]の値を変数aに取得するステップ
22.Zの値をnワードシフトするステップ
23.aの値が0でないか、Z[n−1,…,0]の値がM以上の場合は、多倍長整数減算Z−Mを実行し、結果をZに格納するステップ
また、本実施の形態では、
上記のステップ16にて、“c”の下位ワードとZ[(t+i)]との加算を行なった後、加算結果の下位1ワードをZ[(t+i)]に出力するステップを実行し、上記のステップ21にて、Z[2n]の値を変数aに取得するステップを実行する多倍長整数演算装置を説明した。
100 多倍長演算装置、101 計算部、102 メモリ、103 通信ポート、104 バス、105 プロセッサ、106 プロセッサ、107 命令デコーダ、108 汎用レジスタ、109 特殊レジスタ。

Claims (8)

  1. 制御部と演算部と記憶部とを有し、入力値の加算を行う演算装置であって、
    前記制御部は、
    それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅よりも大きい入力値X及び入力値Yを、それぞれ、前記演算部の演算ビット幅ごとに分割し、
    前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn(n≧2)個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
    入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
    前記記憶部内の所定の記憶領域を割当てて、前記演算部による加算結果を格納するためのu(u>n)個の変数Z[0]〜Z[u−1]を設け、
    前記演算部は、
    スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
    スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、第1フェーズの処理として、
    入力値Xのt番目の変数X[t]の値と、入力値Yのt番目の変数Y[t]の値とを用いて、(X[t]の値)+(Y[t]の値)を計算し、加算結果とキャリー値cを求め、加算結果をt番目の変数Z[t]に格納する処理を行い、
    前記制御部は、
    カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
    カウンタ値iがnに達するか、全てのスレッドtが第2フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第2フェーズの1ラウンド分の処理として、
    〈a〉(t+i)番目の変数Z[t+i]の値とスレッドtで得られたキャリー値cとを用いて、(Z[t+i]の値)+cを計算し、新たな加算結果と新たなキャリー値cを求め、
    〈b〉変数Z[t+i]の値と新たな加算結果とを比較し、両者が一致している場合に、スレッドtの第2フェーズの処理を停止し、両者が一致しない場合に、新たな加算結果を(t+i)番目の変数Z[t+i]に格納する
    処理を、行うことを特徴とする演算装置。
  2. 制御部と演算部と記憶部とを有し、入力値の減算を行う演算装置であって、
    それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅よりも大きい入力値X及び入力値Yを、それぞれ、前記演算部の演算ビット幅ごとに分割し、
    前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn(n≧2)個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
    入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
    前記記憶部内の所定の記憶領域を割当てて、前記演算部による減算結果を格納するためのu(u>n)個の変数Z[0]〜Z[u−1]を設け、
    前記演算部は、
    スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
    スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、第1フェーズの処理として、
    入力値Xのt番目の変数X[t]の値と、入力値Yのt番目の変数Y[t]の値とを用いて、(Y[t]の値)−(X[t]の値)を計算し、減算結果とボロー値dを求め、減算結果をt番目の変数Z[t]に格納する処理を行い、
    前記制御部は、
    カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
    カウンタ値iがnに達するか、全てのスレッドtが第2フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第2フェーズの1ラウンド分の処理として、
    〈a〉(t+i)番目の変数Z[t+i]の値とスレッドtで得られたボロー値dとを用いて、(Z[t+i]の値)−dを計算し、新たな減算結果と新たなボロー値dを求め、
    〈b〉変数Z[t+i]の値と新たな減算結果とを比較し、両者が一致している場合に、スレッドtの第2フェーズの処理を停止し、両者が一致しない場合に、新たな減算結果を(t+i)番目の変数Z[t+i]に格納する
    処理を、行うことを特徴とする演算装置。
  3. 制御部と演算部と記憶部とを有し、入力値の乗算を行う演算装置であって、
    前記制御部は、
    それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅である1ワードよりも大きい入力値X及び入力値Yを、それぞれ、1ワードごとに分割し、
    前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn(n≧2)個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
    入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
    前記記憶部内の所定の記憶領域を割当てて、前記演算部による計算結果を格納するためのu(u>n)個の変数Z[0]〜Z[u−1]を設け、
    カウンタ値iを0に設定し、前記演算部に第1フェーズの処理を開始させ、
    カウンタ値iがnに達するまでの間、前記演算部が第1フェーズの1ラウンド分の処理を終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
    カウンタ値iがnに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、第1フェーズの1ラウンド分の処理として、
    〈1−a〉入力値Xのt番目の変数X[t]の値と、入力値Yのi番目の変数Y[i]の値と、(t+i)番目の変数Z[t+i]の値と、スレッドtで得られたキャリー成分値cとを用いて、(X[t]の値)×(Y[i]の値)+(Z[t+i]の値)+cを計算し、
    〈1−b〉計算結果の下位1ワードの値を(t+i)番目の変数Z[t+i]に格納し、計算結果の上位1ワードの値を新たなキャリー成分値cとする
    処理を、行い、
    前記制御部は、
    カウンタ値iがnに達すると、前記演算部に第2フェーズの処理を開始させ、
    カウンタ値iがuに達するまでの間、前記演算部が第2フェーズの1ラウンド分の処理を終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    カウンタ値iがuに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第2フェーズの1ラウンド分の処理として、
    〈2−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第2フェーズの処理を停止し、
    〈2−b〉0でない場合に(Z[t+i]の値)+cを計算し、計算結果の下位1ワードの値を変数Z[t+i]の新たな値とし、計算結果の上位1ワードの値を新たなキャリー成分値cとする
    処理を、行うことを特徴とする演算装置。
  4. 制御部と演算部と記憶部とを有し、
    前記演算部の演算ビット幅である1ワード(1ワード=bビット)よりも大きなビット幅の入力値Xと法Mとに対して、r=2、R=r(nは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2)として定義されたRと、(−M−1 mod r)として定義されたMInvとを用いて、(XR−1 mod M)を計算するモンゴメリ・リダクションを行う演算装置であって、
    前記制御部は、
    入力値X及び法Mを、それぞれ1ワードごとに分割し、
    前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割された2n個の分割値を格納するための2n個の変数X[0]〜X[2n−1]を設け、
    入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(2n−1)番目の変数X[2n−1]に格納されるようにして、2n個の分割値を変数X[0]〜X[2n−1]に格納し、
    前記記憶部内の所定の記憶領域を割当てて、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を設け、
    法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納し、
    前記記憶部内の所定の記憶領域を割当てて、前記演算部による計算結果を格納するn個の変数Z[0]〜Z[n−1]を設け、
    前記演算部は、
    スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
    第1フェーズの処理として、
    スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、
    〈1−a〉入力値Xの0番目の変数X[0]の値とMInvとを用いて、(X[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
    〈1−b〉法Mのt番目の変数M[t]の値と、入力値Xのt番目の変数X[t]の値と、前記uとを用いて、(M[t]の値)×u+(X[t]の値)を計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t]の新たな値とし、計算結果mの上位1ワードの値をキャリー成分値cとし、
    0番目のスレッドであるスレッド0において、
    〈1−c〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする
    処理を、行い、
    前記制御部は、
    カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
    カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    前記制御部によりカウンタ値iがインクリメントされる度に、第2フェーズの1ラウンド分の処理として、
    個々のスレッドtにおいて、
    〈2−a〉入力値Xの0番目の変数X[0]の値とi番目の変数X[i]の値と、MInvとを用いて、{(X[0]の値)+(X[i]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
    〈2−b〉法Mのt番目の変数M[t]の値と、前記uと、入力値Xの(t+i)番目の変数X[t+i]の値と、スレッドtで得られたキャリー成分値cとを用いて、(M[t]の値)×u+(X[t+i]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t+i]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとし、
    0番目のスレッドであるスレッド0において、
    〈2−c〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする
    処理を、行い、
    カウンタ値iがnに達すると、スレッド0において、値0を変数X[0]の新たな値とし、
    前記制御部は、
    カウンタ値iがnに達すると、スレッド0において値0が変数X[0]の新たな値とされた後に、前記演算部に第3フェーズの処理を開始させ、
    カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    カウンタ値iが2nに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第3フェーズの1ラウンド分の処理として、
    〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止し、
    〈3−b〉0でない場合に、(X[(t+i) mod 2n]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[(t+i) mod 2n]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとする
    処理を、行い、
    前記制御部は、
    カウンタ値iが2nに達した場合、又は全てのスレッドtが第3フェーズの処理を停止した場合に、前記演算部に第4フェーズの処理を開始させ、
    前記演算部は、
    第4フェーズの処理として、
    変数X[0]の値を変数aに格納し、
    変数X[n]〜X[2n−1]の値を、それぞれ、変数X[0]〜X[n−1]に格納し、
    変数aの値が0でない場合、又は変数X[n−1]〜X[0]の値を連接して得られる値が法M以上の場合に、X−Mを計算し、計算結果を変数X[0]〜X[n−1]に格納し、
    変数X[0]〜X[n−1]の値を変数Z[0]〜Z[n−1]に格納することを特徴とする演算装置。
  5. 制御部と演算部と記憶部とを有し、
    前記演算部の演算ビット幅である1ワード(1ワード=bビット)よりも大きなビット幅の入力値Xと法Mとに対して、r=2、R=r(nは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2)として定義されたRと、(−M−1 mod r)として定義されたMInvとを用いて、(XR−1 mod M)を計算するモンゴメリ・リダクションを行う演算装置であって、
    前記制御部は、
    入力値X及び法Mを、それぞれ1ワードごとに分割し、
    前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割された2n個の分割値を格納するためのv(vはnの倍数であって、v≧n)個の変数X[0]〜X[v−1]を設け、
    入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(2n−1)番目の変数X[2n−1]に格納されるようにして、2n個の分割値を変数X[0]〜X[2n−1]に格納し、
    前記記憶部内の所定の記憶領域を割当てて、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を設け、
    法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納し、
    前記記憶部内の所定の記憶領域を割当てて、前記演算部による計算結果を格納するn個の変数Z[0]〜Z[n−1]を設け、
    前記演算部は、
    スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
    第1フェーズの処理として、
    スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、
    〈1−a〉入力値Xの0番目の変数X[0]の値とMInvとを用いて、(X[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
    〈1−b〉法Mのt番目の変数M[t]の値と、入力値Xのt番目の変数X[t]の値と、前記uとを用いて、(M[t]の値)×u+(X[t]の値)を計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t]の新たな値とし、計算結果mの上位1ワードの値をキャリー成分値cとし、
    0番目のスレッドであるスレッド0において、
    〈1−c〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする
    処理を、行い、
    前記制御部は、
    カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
    カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    前記制御部によりカウンタ値iがインクリメントされる度に、第2フェーズの1ラウンド分の処理として、
    個々のスレッドtにおいて、
    〈2−a〉入力値Xの0番目の変数X[0]の値とi番目の変数X[i]の値と、MInvとを用いて、{(X[0]の値)+(X[i]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
    〈2−b〉法Mのt番目の変数M[t]の値と、前記uと、入力値Xの(t+i)番目の変数X[t+i]の値と、スレッドtで得られたキャリー成分値cとを用いて、(M[t]の値)×u+(X[t+i]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t+i]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとし、
    0番目のスレッドであるスレッド0において、
    〈2−c〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする
    処理を、行い、
    カウンタ値iがnに達すると、スレッド0において、値0を変数X[0]の新たな値とし、
    前記制御部は、
    カウンタ値iがnに達すると、スレッド0において値0が変数X[0]の新たな値とされた後に、前記演算部に第3フェーズの処理を開始させ、
    カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    カウンタ値iが2nに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第3フェーズの1ラウンド分の処理として、
    〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止し、
    〈3−b〉0でない場合に、(X[t+i]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t+i]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとする
    処理を、行い、
    前記制御部は、
    カウンタ値iが2nに達した場合、又は全てのスレッドtが第3フェーズの処理を停止した場合に、前記演算部に第4フェーズの処理を開始させ、
    前記演算部は、
    第4フェーズの処理として、
    変数X[2n]の値を変数aに格納し、
    変数X[]〜X[2n−1]の値を、それぞれ、変数X[0]〜X[n−1]に格納し、
    変数aの値が0でない場合、又は変数X[n−1]〜X[0]の値を連接して得られる値が法M以上の場合に、X−Mを計算し、計算結果を変数X[0]〜X[n−1]に格納し、
    変数X[0]〜X[n−1]の値を変数Z[0]〜Z[n−1]に格納することを特徴とする演算装置。
  6. 制御部と演算部と記憶部とを有し、
    それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅である1ワード(1ワード=bビット)よりも大きい入力値Xと入力値Yと法Mとに対して、r=2、R=r(nは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2)として定義されたRと、(−M−1 mod r)として定義されたMInvとを用いて、(XYR−1 mod M)を計算するモンゴメリ乗算を行う演算装置であって、
    前記制御部は、
    入力値X、入力値Y及び法Mを、それぞれ1ワードごとに分割し、
    前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
    入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
    前記記憶部内の所定の記憶領域を割当てて、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を設け、
    法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納し、
    前記記憶部内の所定の記憶領域を割当てて、前記演算部による計算結果を格納する2n個の変数Z[0]〜Z[2n−1]を設け、
    前記演算部は、
    スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
    第1フェーズの処理として、
    スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、
    〈1−a〉入力値Xの0番目の変数X[0]の値と、入力値Yの0番目の変数Y[0]の値と、MInvとを用いて、(X[0]の値)×(Y[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
    〈1−b〉法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとし、
    〈1−c〉入力値Xの0番目の変数X[0]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[0]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとし、
    〈1−d〉前記umの下位1ワードと前記xyの下位1ワードとを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値をt番目の変数Z[t]に格納し、
    〈1−e〉前記mの上位1ワードと前記umの上位1ワードと前記xyの上位1ワードとを加算し、2ワードの計算結果をキャリー成分値cとし、
    0番目のスレッドであるスレッド0において、
    〈1−f〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする
    処理を、行い、
    前記制御部は、
    カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
    カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    前記制御部によりカウンタ値iがインクリメントされる度に、第2フェーズの1ラウンド分の処理として、
    個々のスレッドtにおいて、
    〈2−a〉0番目の変数Z[0]とi番目の変数Z[i]と、入力値Xのi番目の変数X[i]と、入力値Yの0番目の変数Y[0]と、MInvとを用いて、{(Z[0]の値)+(Z[i]の値)+(X[i]の値)×(Y[0]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
    〈2−b〉法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとし、
    〈2−c〉入力値Xのi番目の変数X[i]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[i]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとし、
    〈2−d〉前記umの下位1ワードと、前記xyの下位1ワードと、ステップtで得られたキャリー成分値cの下位1ワードと、(t+i)番目の変数Z[t+i]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を(t+i)番目の変数Z[t+i]の新たな値とし、
    〈2−e〉前記mの上位1ワードと、前記umの上位1ワードと、前記xyの上位1ワードと、ステップtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとし、
    0番目のスレッドであるスレッド0において、
    〈2−f〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする
    処理を、行い、
    カウンタ値iがnに達すると、スレッド0において、値0を変数Z[0]の新たな値とし、
    前記制御部は、
    カウンタ値iがnに達すると、スレッド0において値0が変数X[0]の新たな値とされた後に、前記演算部に第3フェーズの処理を開始させ、
    カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    カウンタ値iが2nに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第3フェーズの1ラウンド分の処理として、
    〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止し、
    〈3−b〉0でない場合に、スレッドtで得られたキャリー成分値cの下位1ワードと変数Z[(t+i) mod 2n]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数Z[(t+i) mod 2n]の新たな値とし、前記mの上位1ワードとスレッドtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとする
    処理を、行い、
    前記制御部は、
    カウンタ値iが2nに達した場合、又は全てのスレッドtが第3フェーズの処理を停止した場合に、前記演算部に第4フェーズの処理を開始させ、
    前記演算部は、
    第4フェーズの処理として、
    変数Z[0]の値を変数aに格納し、
    変数Z[n]〜Z[2n−1]の値を、それぞれ、変数Z[0]〜Z[n−1]に格納し、
    変数aの値が0でない場合、又は変数Z[n−1]〜Z[0]の値を連接して得られる値が法M以上の場合に、Z−Mを計算し、計算結果を変数Z[0]〜Z[n−1]に格納することを特徴とする演算装置。
  7. 制御部と演算部と記憶部とを有し、
    それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅である1ワード(1ワード=bビット)よりも大きい入力値Xと入力値Yと法Mとに対して、r=2、R=r(nは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2)として定義されたRと、(−M−1 mod r)として定義されたMInvとを用いて、(XYR−1 mod M)を計算するモンゴメリ乗算を行う演算装置であって、
    前記制御部は、
    入力値X、入力値Y及び法Mを、それぞれ1ワードごとに分割し、
    前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
    入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
    前記記憶部内の所定の記憶領域を割当てて、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を設け、
    法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納し、
    前記記憶部内の所定の記憶領域を割当てて、前記演算部による計算結果を格納するv個(vはnの倍数であって、v≧n)の変数Z[0]〜Z[v−1]を設け、
    前記演算部は、
    スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
    第1フェーズの処理として、
    スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、
    〈1−a〉入力値Xの0番目の変数X[0]の値と、入力値Yの0番目の変数Y[0]の値と、MInvとを用いて、(X[0]の値)×(Y[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
    〈1−b〉法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとし、
    〈1−c〉入力値Xの0番目の変数X[0]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[0]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとし、
    〈1−d〉前記umの下位1ワードと前記xyの下位1ワードとを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値をt番目の変数Z[t]に格納し、
    〈1−e〉前記mの上位1ワードと前記umの上位1ワードと前記xyの上位1ワードとを加算し、2ワードの計算結果をキャリー成分値cとし、
    0番目のスレッドであるスレッド0において、
    〈1−f〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする
    処理を、行い、
    前記制御部は、
    カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
    カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    前記制御部によりカウンタ値iがインクリメントされる度に、第2フェーズの1ラウンド分の処理として、
    個々のスレッドtにおいて、
    〈2−a〉0番目の変数Z[0]とi番目の変数Z[i]と、入力値Xのi番目の変数X[i]と、入力値Yの0番目の変数Y[0]と、MInvとを用いて、{(Z[0]の値)+(Z[i]の値)+(X[i]の値)×(Y[0]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
    〈2−b〉法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとし、
    〈2−c〉入力値Xのi番目の変数X[i]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[i]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとし、
    〈2−d〉前記umの下位1ワードと、前記xyの下位1ワードと、ステップtで得られたキャリー成分値cの下位1ワードと、(t+i)番目の変数Z[t+i]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を(t+i)番目の変数Z[t+i]の新たな値とし、
    〈2−e〉前記mの上位1ワードと、前記umの上位1ワードと、前記xyの上位1ワードと、ステップtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとし、
    0番目のスレッドであるスレッド0において、
    〈2−f〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする
    処理を、行い、
    カウンタ値iがnに達すると、スレッド0において、値0を変数Z[0]の新たな値とし、
    前記制御部は、
    カウンタ値iがnに達すると、スレッド0において値0が変数X[0]の新たな値とされた後に、前記演算部に第3フェーズの処理を開始させ、
    カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
    前記演算部は、
    カウンタ値iが2nに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第3フェーズの1ラウンド分の処理として、
    〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止し、
    〈3−b〉0でない場合に、スレッドtで得られたキャリー成分値cの下位1ワードと変数Z[t+i]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数Z[t+i]の新たな値とし、前記mの上位1ワードとスレッドtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとする処理を、行い、
    前記制御部は、
    カウンタ値iが2nに達した場合、又は全てのスレッドtが第3フェーズの処理を停止した場合に、前記演算部に第4フェーズの処理を開始させ、
    前記演算部は、
    第4フェーズの処理として、
    変数Z[2n]の値を変数aに格納し、
    変数Z[]〜Z[2n−1]の値を、それぞれ、変数Z[0]〜Z[n−1]に格納し、
    変数aの値が0でない場合、又は変数Z[n−1]〜Z[0]の値を連接して得られる値が法M以上の場合に、Z−Mを計算し、計算結果を変数Z[0]〜Z[n−1]に格納することを特徴とする演算装置。
  8. 請求項1〜7のいずれかに記載の制御部及び演算部の処理を可能にする命令群を含んでいることを特徴とするプログラム。
JP2012009898A 2012-01-20 2012-01-20 演算装置及びプログラム Expired - Fee Related JP5896756B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2012009898A JP5896756B2 (ja) 2012-01-20 2012-01-20 演算装置及びプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2012009898A JP5896756B2 (ja) 2012-01-20 2012-01-20 演算装置及びプログラム

Publications (2)

Publication Number Publication Date
JP2013148767A JP2013148767A (ja) 2013-08-01
JP5896756B2 true JP5896756B2 (ja) 2016-03-30

Family

ID=49046318

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012009898A Expired - Fee Related JP5896756B2 (ja) 2012-01-20 2012-01-20 演算装置及びプログラム

Country Status (1)

Country Link
JP (1) JP5896756B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5852594B2 (ja) * 2013-01-15 2016-02-03 日本電信電話株式会社 多倍長整数演算装置、多倍長整数演算方法、プログラム

Also Published As

Publication number Publication date
JP2013148767A (ja) 2013-08-01

Similar Documents

Publication Publication Date Title
JP4870932B2 (ja) 多重精度を支援する拡張型モンゴメリモジュラ掛け算器
CN112199707B (zh) 一种同态加密中的数据处理方法、装置以及设备
JP3605181B2 (ja) 掛け算累算命令を使用したデータ処理
US11169778B2 (en) Converting floating point numbers to reduce the precision
JP7096828B2 (ja) 入力オペランド値を処理するための装置及び方法
Seo et al. Efficient arithmetic on ARM‐NEON and its application for high‐speed RSA implementation
JP7292297B2 (ja) 確率的丸めロジック
Chung et al. Asymmetric squaring formulae
JP2021507348A (ja) ベクトル・キャリー付き加算命令
Zheng et al. Exploiting the floating-point computing power of GPUs for RSA
EP3200068B1 (en) Parallel computing method and terminal
CN114095149A (zh) 信息加密方法、装置、设备及存储介质
Scharfglass et al. Breaking weak 1024-bit RSA keys with CUDA
Edamatsu et al. Acceleration of large integer multiplication with intel avx-512 instructions
JP5896756B2 (ja) 演算装置及びプログラム
Bradbury et al. Fast quantum-safe cryptography on IBM Z
US20250106022A1 (en) Multi-lane cryptographic engine and operations thereof
Seo et al. Consecutive operand-caching method for multiprecision multiplication, revisited
Keliris et al. Investigating large integer arithmetic on Intel Xeon Phi SIMD extensions
RU2595906C1 (ru) Устройство для вычисления функций
Arnold An improved DNA-sticker addition algorithm and its application to logarithmic arithmetic
TW457452B (en) Methods and apparatus for performing fast multiplication operations in bit-serial processors
CN103389965A (zh) 一种实现sm2密码体制的大整数求乘逆方法
US20120259907A1 (en) Pipelined divide circuit for small operand sizes
Liu et al. GMP implementation on CUDA–A backward compatible design with performance tuning

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20141106

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20150528

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20150623

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20150820

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20160202

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160301

R150 Certificate of patent or registration of utility model

Ref document number: 5896756

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees