(57)【要約】【課題】ビット加算プロトコルの通信量削減を妨げているキャリーの計算での通信量を削減する。【解決手段】本発明の計算装置システムは、ビット表現された２つの整数をビット加算したときに発生するキャリービットを秘匿計算で求める計算システムであり、ネットワークで接続されたＮ台の計算装置で構成される。本発明の計算装置は、キャリー演算子算出部、Ｌｏｇ分岐木作成部、ノード演算実行部、キャリー伝搬処理部、ルート演算実行部、出力部を備える。Ｌｏｇ分岐木作成部は、キャリー演算子の列をｌｏｇ（ノードに割り当てられたキャリー演算子の数）個ごとに分割してＬｏｇ分岐木を作成する。キャリー伝搬処理部は、プレフィックスＬｏｇ演算手段を有する。プレフィックスＬｏｇ演算手段を用いて兄弟ノード間でのキャリー伝搬を処理する。【選択図】図１３
2014137740.tif 000002
【特許請求の範囲】
【請求項１】
ビット表現された２つの整数をビット加算したときに発生するキャリービットを秘匿計算で求める計算システムを構成するＮ台の計算装置の中の１つの計算装置であって、
Ｎは２以上の整数、ｎは１以上Ｎ以下の整数、＾はべき乗を示す記号、Ｌは（（２＾２）＾・・・）＾２のように２に対して２乗を０回以上繰り返した整数、ｑはＬビットの素数、Ｚｑは０以上ｑ−１以下の整数の集合、ａとｂはＬ桁でビット表現された有限体上の整数、[ａ]ｑは整数ａがＮ台の前記計算装置で秘匿された状態であることを示す記号、ｌｏｇは底が２の対数、ｌｏｇ＊（１）ｘを、
【数６】
2014137740.tif 000008
とし、
[ａ]ｑと[ｂ]ｑに対して、ビット表現された桁ごとに、両方とも１であることを示す秘匿された演算子Ｓ、一方だけ１であることを示す秘匿された演算子Ｐ、両方とも０であることを示す秘匿された演算子Ｋのいずれか１つを求め、各桁のキャリー演算子とするキャリー演算子算出部と、
前記キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、Ｌｏｇ分岐木を作成するＬｏｇ分岐木作成部と、
前記Ｌｏｇ分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするノード演算実行部と、
プレフィックスＬｏｇ演算手段を有し、同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、前記プレフィックスＬｏｇ演算手段の処理を実行し、その結果を各ノードのノードキャリー演算子にするキャリー伝搬処理部と、
前記Ｌｏｇ分岐木作成部の処理で１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするルート演算実行部と、
前記ルート演算実行部の処理の結果、ノードキャリー演算子がＳの桁から１つ上の桁へのキャリービットが１であることを示す秘匿された情報を出力し、その他の結果の桁はキャリービットが０であることを示す秘匿された情報を出力する出力部と
を備え、
前記プレフィックスＬｏｇ演算手段は、
（１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列を２分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、２分岐木を作成し、
（２）前記２分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
（３）前記２分岐木の作成のときに１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする
ことを特徴とする計算装置。
【請求項２】
ビット表現された２つの整数をビット加算したときに発生するキャリービットを秘匿計算で求める計算システムを構成するＮ台の計算装置の中の１つの計算装置であって、
Ｎは２以上の整数、ｎは１以上Ｎ以下の整数、Ｌはｌｏｇ＊（Ｃ−１）の演算を演算結果が１になるまで繰り返したときにすべての計算結果が整数となる１以上の整数、ｑはＬビットの素数、Ｚｑは０以上ｑ−１以下の整数の集合、ａとｂはＬ桁でビット表現された有限体上の整数、[ａ]ｑは整数ａがＮ台の前記計算装置で秘匿された状態であることを示す記号、Ｃは１以上の整数、ｃは１以上Ｃ以下の整数、ｌｏｇは底が２の対数、ｌｏｇ＊（ｃ）ｘを、
【数７】
2014137740.tif 000009
とし、
[ａ]ｑと[ｂ]ｑに対して、ビット表現された桁ごとに、両方とも１であることを示す秘匿された演算子Ｓ、一方だけ１であることを示す秘匿された演算子Ｐ、両方とも０であることを示す秘匿された演算子Ｋのいずれか１つを求め、各桁のキャリー演算子とするキャリー演算子算出部と、
前記キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ＊（Ｃ−１）（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、Ｌｏｇ＊（Ｃ−１）分岐木を作成するＬｏｇ＊（Ｃ−１）分岐木作成部と、
前記Ｌｏｇ＊（Ｃ−１）分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするノード演算実行部と、
プレフィックスＬｏｇ＊（Ｃ−１）演算手段を有し、同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、前記プレフィックスＬｏｇ＊（Ｃ−１）演算手段の処理を実行し、その結果を各ノードのノードキャリー演算子にするキャリー伝搬処理部と、
前記Ｌｏｇ＊（Ｃ−１）分岐木作成部の処理で１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするルート演算実行部と、
前記ルート演算実行部の処理の結果、ノードキャリー演算子がＳの桁から１つ上の桁へのキャリービットが１であることを示す秘匿された情報を出力し、その他の結果の桁はキャリービットが０であることを示す秘匿された情報を出力する出力部と、
を備え、
ｃが２以上のときは、プレフィックスＬｏｇ＊（ｃ−１）演算手段は、
（１−１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ＊（ｃ−２）（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、Ｌｏｇ＊（ｃ−２）分岐木を作成し、
（１−２）前記Ｌｏｇ＊（ｃ−２）分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
（１−３）プレフィックスＬｏｇ＊（ｃ−２）演算手段を有し、（１−１）の処理で同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、前記プレフィックスＬｏｇ＊（ｃ−２）演算手段の処理を実行し、その結果を各ノードのノードキャリー演算子にし、
（１−４）（１−１）の処理で１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
プレフィックスＬｏｇ＊（０）演算手段は、
（２−１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列を２分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、２分岐木を作成し、
（２−２）前記２分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
（２−３）前記２分岐木の作成のときに１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする
ことを特徴とする計算装置。
【請求項３】
請求項１または２記載の計算装置であって、
前記のキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求める処理は、
Ｐ以外のキャリー演算子の中で最も上位の桁のキャリー演算子を求める処理である
ことを特徴とする計算装置。
【請求項４】
ネットワークで接続されたＮ台の計算装置で構成され、ビット表現された２つの整数をビット加算したときに発生するキャリービットを秘匿計算で求める計算システムであって、
Ｎは２以上の整数、ｎは１以上Ｎ以下の整数、＾はべき乗を示す記号、Ｌは（（２＾２）＾・・・）＾２のように２に対して２乗を０回以上繰り返した整数、ｑはＬビットの素数、Ｚｑは０以上ｑ−１以下の整数の集合、ａとｂはＬ桁でビット表現された有限体上の整数、[ａ]ｑは整数ａがＮ台の前記計算装置で秘匿された状態であることを示す記号、ｌｏｇは底が２の対数、ｌｏｇ＊（１）ｘを、
【数８】
2014137740.tif 000010
とし、
各計算装置は、
[ａ]ｑと[ｂ]ｑに対して、ビット表現された桁ごとに、両方とも１であることを示す秘匿された演算子Ｓ、一方だけ１であることを示す秘匿された演算子Ｐ、両方とも０であることを示す秘匿された演算子Ｋのいずれか１つを求め、各桁のキャリー演算子とするキャリー演算子算出部と、
前記キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、Ｌｏｇ分岐木を作成するＬｏｇ分岐木作成部と、
前記Ｌｏｇ分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするノード演算実行部と、
プレフィックスＬｏｇ演算手段を有し、同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、前記プレフィックスＬｏｇ演算手段の処理を実行し、その結果を各ノードのノードキャリー演算子にするキャリー伝搬処理部と、
前記Ｌｏｇ分岐木作成部の処理で１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするルート演算実行部と、
前記ルート演算実行部の処理の結果、ノードキャリー演算子がＳの桁から１つ上の桁へのキャリービットが１であることを示す秘匿された情報を出力し、その他の結果の桁はキャリービットが０であることを示す秘匿された情報を出力する出力部と
を備え、
前記プレフィックスＬｏｇ演算手段は、
（１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列を２分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、２分岐木を作成し、
（２）前記２分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
（３）前記２分岐木の作成のときに１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする
ことを特徴とする計算システム。
【請求項５】
ネットワークで接続されたＮ台の計算装置で構成され、ビット表現された２つの整数をビット加算したときに発生するキャリービットを秘匿計算で求める計算システムであって、
Ｎは２以上の整数、ｎは１以上Ｎ以下の整数、Ｌはｌｏｇ＊（Ｃ−１）の演算を演算結果が１になるまで繰り返したときにすべての計算結果が整数となる１以上の整数、ｑはＬビットの素数、Ｚｑは０以上ｑ−１以下の整数の集合、ａとｂはＬ桁でビット表現された有限体上の整数、[ａ]ｑは整数ａがＮ台の前記計算装置で秘匿された状態であることを示す記号、Ｃは１以上の整数、ｃは１以上Ｃ以下の整数、ｌｏｇは底が２の対数、ｌｏｇ＊（ｃ）ｘを、
【数９】
2014137740.tif 000011
とし、
各計算装置は、
[ａ]ｑと[ｂ]ｑに対して、ビット表現された桁ごとに、両方とも１であることを示す秘匿された演算子Ｓ、一方だけ１であることを示す秘匿された演算子Ｐ、両方とも０であることを示す秘匿された演算子Ｋのいずれか１つを求め、各桁のキャリー演算子とするキャリー演算子算出部と、
前記キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ＊（Ｃ−１）（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、Ｌｏｇ＊（Ｃ−１）分岐木を作成するＬｏｇ＊（Ｃ−１）分岐木作成部と、
前記Ｌｏｇ＊（Ｃ−１）分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするノード演算実行部と、
プレフィックスＬｏｇ＊（Ｃ−１）演算手段を有し、同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、前記プレフィックスＬｏｇ＊（Ｃ−１）演算手段の処理を実行し、その結果を各ノードのノードキャリー演算子にするキャリー伝搬処理部と、
前記Ｌｏｇ＊（Ｃ−１）分岐木作成部の処理で１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするルート演算実行部と、
前記ルート演算実行部の処理の結果、ノードキャリー演算子がＳの桁から１つ上の桁へのキャリービットが１であることを示す秘匿された情報を出力し、その他の結果の桁はキャリービットが０であることを示す秘匿された情報を出力する出力部と、
を備え、
ｃが２以上のときは、プレフィックスＬｏｇ＊（ｃ−１）演算手段は、
（１−１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ＊（ｃ−２）（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、Ｌｏｇ＊（ｃ−２）分岐木を作成し、
（１−２）前記Ｌｏｇ＊（ｃ−２）分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
（１−３）プレフィックスＬｏｇ＊（ｃ−２）演算手段を有し、（１−１）の処理で同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、前記プレフィックスＬｏｇ＊（ｃ−２）演算手段の処理を実行し、その結果を各ノードのノードキャリー演算子にし、
（１−４）（１−１）の処理で１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
プレフィックスＬｏｇ＊（０）演算手段は、
（２−１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列を２分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、２分岐木を作成し、
（２−２）前記２分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
（２−３）前記２分岐木の作成のときに１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする
ことを特徴とする計算システム。
【請求項６】
ネットワークで接続されたＮ台の計算装置を用いて、ビット表現された２つの整数をビット加算したときに発生するキャリービットを秘匿計算で求める計算方法であって、
Ｎは２以上の整数、ｎは１以上Ｎ以下の整数、＾はべき乗を示す記号、Ｌは（（２＾２）＾・・・）＾２のように２に対して２乗を０回以上繰り返した整数、ｑはＬビットの素数、Ｚｑは０以上ｑ−１以下の整数の集合、ａとｂはＬ桁でビット表現された有限体上の整数、[ａ]ｑは整数ａがＮ台の前記計算装置で秘匿された状態であることを示す記号、ｌｏｇは底が２の対数、ｌｏｇ＊（１）ｘを、
【数１０】
2014137740.tif 000012
とし、
Ｎ台の前記計算装置が、[ａ]ｑと[ｂ]ｑに対して、ビット表現された桁ごとに、両方とも１であることを示す秘匿された演算子Ｓ、一方だけ１であることを示す秘匿された演算子Ｐ、両方とも０であることを示す秘匿された演算子Ｋのいずれか１つを求め、各桁のキャリー演算子とするキャリー演算子算出ステップと、
Ｎ台の前記計算装置が、前記キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、Ｌｏｇ分岐木を作成するＬｏｇ分岐木作成ステップと、
Ｎ台の前記計算装置が、前記Ｌｏｇ分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするノード演算実行ステップと、
Ｎ台の前記計算装置が、プレフィックスＬｏｇ演算サブステップを有し、同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、前記プレフィックスＬｏｇ演算サブステップの処理を実行し、その結果を各ノードのノードキャリー演算子にするキャリー伝搬処理ステップと、
Ｎ台の前記計算装置が、前記Ｌｏｇ分岐木作成ステップで１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするルート演算実行ステップと、
Ｎ台の前記計算装置が、前記ルート演算実行ステップの結果、ノードキャリー演算子がＳの桁から１つ上の桁へのキャリービットが１であることを示す秘匿された情報を出力し、その他の結果の桁はキャリービットが０であることを示す秘匿された情報を出力する出力ステップと
を備え、
前記プレフィックスＬｏｇ演算サブステップは、
（１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列を２分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、２分岐木を作成し、
（２）前記２分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
（３）前記２分岐木の作成のときに１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする
ことを特徴とする計算方法。
【請求項７】
ネットワークで接続されたＮ台の計算装置を用いて、ビット表現された２つの整数をビット加算したときに発生するキャリービットを秘匿計算で求める計算方法であって、
Ｎは２以上の整数、ｎは１以上Ｎ以下の整数、Ｌはｌｏｇ＊（Ｃ−１）の演算を演算結果が１になるまで繰り返したときにすべての計算結果が整数となる１以上の整数、ｑはＬビットの素数、Ｚｑは０以上ｑ−１以下の整数の集合、ａとｂはＬ桁でビット表現された有限体上の整数、[ａ]ｑは整数ａがＮ台の前記計算装置で秘匿された状態であることを示す記号、Ｃは１以上の整数、ｃは１以上Ｃ以下の整数、ｌｏｇは底が２の対数、ｌｏｇ＊（ｃ）ｘを、
【数１１】
2014137740.tif 000013
とし、
Ｎ台の前記計算装置が、[ａ]ｑと[ｂ]ｑに対して、ビット表現された桁ごとに、両方とも１であることを示す秘匿された演算子Ｓ、一方だけ１であることを示す秘匿された演算子Ｐ、両方とも０であることを示す秘匿された演算子Ｋのいずれか１つを求め、各桁のキャリー演算子とするキャリー演算子算出ステップと、
Ｎ台の前記計算装置が、前記キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ＊（Ｃ−１）（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、Ｌｏｇ＊（Ｃ−１）分岐木を作成するＬｏｇ＊（Ｃ−１）分岐木作成ステップと、
Ｎ台の前記計算装置が、前記Ｌｏｇ＊（Ｃ−１）分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするノード演算実行ステップと、
Ｎ台の前記計算装置が、プレフィックスＬｏｇ＊（Ｃ−１）演算サブステップを有し、同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、前記プレフィックスＬｏｇ＊（Ｃ−１）演算サブステップを実行し、その結果を各ノードのノードキャリー演算子にするキャリー伝搬処理ステップと、
Ｎ台の前記計算装置が、前記Ｌｏｇ＊（Ｃ−１）分岐木作成ステップで１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とするルート演算実行ステップと、
Ｎ台の前記計算装置が、前記ルート演算実行ステップの結果、ノードキャリー演算子がＳの桁から１つ上の桁へのキャリービットが１であることを示す秘匿された情報を出力し、その他の結果の桁はキャリービットが０であることを示す秘匿された情報を出力する出力ステップと、
を備え、
ｃが２以上のときは、プレフィックスＬｏｇ＊（ｃ−１）演算サブステップは、
（１−１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ＊（ｃ−２）（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、Ｌｏｇ＊（ｃ−２）分岐木を作成し、
（１−２）前記Ｌｏｇ＊（ｃ−２）分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
（１−３）プレフィックスＬｏｇ＊（ｃ−２）演算サブステップを有し、（１−１）の処理で同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、前記プレフィックスＬｏｇ＊（ｃ−２）演算サブステップの処理を実行し、その結果を各ノードのノードキャリー演算子にし、
（１−４）（１−１）の処理で１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
プレフィックスＬｏｇ＊（０）演算サブステップは、
（２−１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列を２分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、２分岐木を作成し、
（２−２）前記２分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とし、
（２−３）前記２分岐木の作成のときに１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする
ことを特徴とする計算方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ビット表現された２つの整数を秘匿計算でビット加算する計算装置、計算システム、計算方法に関する。
【背景技術】
【０００２】
秘密情報を秘匿したまま、その秘密情報を入力とした関数を計算する秘匿計算を実現する手法として、マルチパーティ計算（Multi-Party Computation：ＭＰＣ）が知られている。ＭＰＣでは，秘密情報を持つ２台以上の計算装置が、秘匿された秘密情報を入力値として協調計算を行うことによって求める関数値を計算する。しかし、一般的な手法によって実現されるプロトコルは効率的でないことが多いため、特定の関数を効率よく構成することを目的とした発明がある。
【０００３】
閾値型秘密分散法に基づくＭＰＣとして、非特許文献１が知られている。秘密分散を用いたＭＰＣは、掛け算や足し算を含む算術演算を論理回路演算と比べて高速に実行することができる。しかし、大小比較や等号判定、剰余演算などの一部の基本的な演算は、算術回路で効率的に実現することが難しいと考えられていた。
【０００４】
非特許文献２では、いくつかの重要な関数を定数ラウンドで実行するＭＰＣプロトコルが示されている。ラウンド数はプロトコルの実行時間に強く影響する処理コストであり、定数ラウンドのプロトコルは入力のサイズに依らずに常に一定の計算時間を保証するため、大きなサイズのデータを扱う場合などにおいて都合がよい。特に、秘匿された整数を、その整数のビットごとの秘匿された値に変換するビット分解（Bit-Decomposition,ＢＤ）プロトコルは非常に強力であり、ＢＤによって算術回路への入力を論理回路への入力に変換することによって、算術回路だけでは難しい演算を効率的に行うことが可能である。また、非特許文献３には、大小比較プロトコルを拡張することによってＢＤを構成することによって、ビット演算の効率化を図った発明が示されている。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】M. Ben-Or, S. Goldwasser, and A. Wigderson, “Completeness Theorems for Non-Cryptographic Fault-Tolerant Distributed Computation”, In STOC 1988, pages 1-10, 1988.
【非特許文献２】I. Damgard, M. Fitzi, E. Kiltz, J. B. Nielsen, and T. Toft, “Unconditionally Secure Constant-Rounds Multi-party Computation for Equality, Comparison, Bits and Exponentiation”, In TCC 2006, pages 285-304, 2006.
【非特許文献３】T. Toft, “Constant-Rounds, Almost-Linear Bit-Decomposition of Secret Shared Values”, In CT-RSA 2009, pages 357-371, 2009.
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、ＢＤは非常に大きな通信量を要するという問題があり、非特許文献３においてもビット加算（Bit-Addition）プロトコルについては解決されていない。本件出願人の知る限りにおいては、ビット加算を行うプロトコルは非特許文献２の方式が最良であり、Ｌ桁でビット表現された整数同士をビット加算する場合、Ｌ・ｌｏｇＬのオーダ（以下、Ｏ（Ｌ・ｌｏｇＬ）のように表現する）であった。ただし、ｌｏｇは底が２の対数である。加算は多くの関数で用いられる汎用的な演算の一つであり、ビット表現は大小比較や等号判定などを効率よく行うことが可能であるので、ビット加算を効率よく行うことが出来れば、ＢＤを経由せずこれらを組み合わせた計算の効率を向上できると期待される。ところが、ビット加算の計算は桁上がり（キャリー）の計算の取り扱いが難しい。定数ラウンドのＭＰＣの多くは、入力の長さをＬとしたとき，Ｌ個の計算を並列に行うことで、定数ラウンドかつ線形な通信量（Ｏ（Ｌ））を実現している。一方で、キャリーの計算は通常、キャリーの伝搬を下位のビットから順に処理していく必要があるため、ビットごとに並列に計算を行うことは難しい。それゆえ、非特許文献２でもキャリーの計算はＯ（Ｌ・ｌｏｇＬ）の通信量でしか実現できていない。そして、これがビット加算をＯ（Ｌ・ｌｏｇＬ）の通信量でしか実現できていない原因である。
【０００７】
本発明は、このような課題に鑑みてなされたものであり、ビット加算プロトコルの通信量削減を妨げているキャリーの計算での通信量を削減することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の計算装置システムは、ビット表現された２つの整数をビット加算したときに発生するキャリービットを秘匿計算で求める計算システムであり、ネットワークで接続されたＮ台の計算装置で構成される。本発明の計算装置は、この計算システムの中の１つの計算装置である。まず、Ｎは２以上の整数、ｎは１以上Ｎ以下の整数、＾はべき乗を示す記号、Ｌは（（２＾２）＾・・・）＾２のように２に対して２乗を０回以上繰り返した整数、ｑはＬビットの素数、Ｚｑは０以上ｑ−１以下の整数の集合、ａとｂはＬ桁でビット表現された有限体上の整数、[ａ]ｑは整数ａがＮ台の前記計算装置で秘匿された状態であることを示す記号、ｌｏｇは底が２の対数、ｌｏｇ＊（１）ｘを、
【０００９】
【数１】
2014137740.tif 000003
【００１０】
とする。
本発明の計算装置は、キャリー演算子算出部、Ｌｏｇ分岐木作成部、ノード演算実行部、キャリー伝搬処理部、ルート演算実行部、出力部を備える。キャリー演算子算出部は、他の計算装置と協調して[ａ]ｑと[ｂ]ｑに対して、ビット表現された桁ごとに、両方とも１であることを示す秘匿された演算子Ｓ、一方だけ１であることを示す秘匿された演算子Ｐ、両方とも０であることを示す秘匿された演算子Ｋのいずれか１つを求め、各桁のキャリー演算子とする。Ｌｏｇ分岐木作成部は、キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、Ｌｏｇ分岐木を作成する。ノード演算実行部は、Ｌｏｇ分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする。
【００１１】
キャリー伝搬処理部は、プレフィックスＬｏｇ演算手段を有し、同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、プレフィックスＬｏｇ演算手段の処理を実行し、その結果を各ノードのノードキャリー演算子にする。プレフィックスＬｏｇ演算手段は、以下の（１），（２），（３）の処理を行う。
（１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列を２分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、２分岐木を作成する。
（２）前記２分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする。
（３）前記２分岐木の作成のときに１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする。
【００１２】
ルート演算実行部は、Ｌｏｇ分岐木作成部の処理で１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする。出力部は、ルート演算実行部の処理の結果、ノードキャリー演算子がＳとなった桁から１つ上の桁へのキャリービットが１であることを示す秘匿された情報を出力し、その他の結果の桁はキャリービットが０であることを示す秘匿された情報を出力する。
【発明の効果】
【００１３】
本発明の計算システムによれば、キャリー演算子の列をｌｏｇ（ノードに割り当てられたキャリー演算子の数）個ごとに分割してＬｏｇ分岐木を作成するので、分岐木の深さをｌｏｇ＊（１）Ｌにできる。よって、非特許文献２の分岐木の深さｌｏｇＬよりも浅くできる。また、プレフィックスＬｏｇ演算手段を用いて兄弟ノード間でのキャリー伝搬を処理するので、３以上に分割した場合でもルート演算実行部の処理量を減らすことができる。したがって、本発明の計算システムでは、キャリーの計算での通信量をＯ（Ｌ・ｌｏｇ＊（１）Ｌ）にできる。
【図面の簡単な説明】
【００１４】
【図１】本発明の計算システムの構成例を示す図。
【図２】加算結果の断片を秘密分散する処理フローを示す図。
【図３】秘匿された値同士の乗算結果の断片を秘密分散する処理フローを示す図。
【図４】定数との乗算結果の断片を秘密分散する処理フローを示す図。
【図５】ｉ＋１桁目のａとｂのビット[ａｉ]ｑ，[ｂｉ]ｑとキャリー演算子を示すビットである[ｓｉ]ｑ，[ｐｉ]ｑ，[ｋｉ]ｑとの関係を示す図。
【図６】ｉ＋１桁目のａとｂのビット[ａｉ]ｑ，[ｂｉ]ｑからキャリー演算子を求める処理フローを示す図。
【図７】２分岐木を用いた計算装置の構成例を示す図。
【図８】図７の計算装置で構成した計算システムの処理フローを示す図。
【図９】ａ＝“１１０１１０１１”，ｂ＝“０１１００００１”の場合のキャリー演算子と演算結果とキャリーの関係を例示する図。
【図１０】図９の例のときに作成される２分岐木を示す図。
【図１１】図９の例のときに得られるノードキャリー演算子を示す図。
【図１２】図９の例のときの２分岐ルート演算実行部８５０ｎの処理を説明するための図。
【図１３】実施例１の計算装置の機能構成例を示す図。
【図１４】実施例１の計算装置を用いた計算システムの処理フローを示す図。
【図１５】Ｌｏｇ分岐木を説明するための図。
【図１６】ａ＝“００１０１１００１１０１１０１１”，ｂ＝“０００１１００００１１００００１”の場合のキャリー演算子と演算結果とキャリーの関係を例示する図。
【図１７】図１６の例のときに作成されるＬｏｇ分岐木を示す図。
【図１８】図１６の例のときに得られるノードキャリー演算子を示す図。
【図１９】図１６の例のときのキャリー伝搬処理部１４０ｎの処理（Ｓ１４０ｎ）を説明する図。
【図２０】図１６の例のときのキャリー伝搬処理部１４０ｎの処理（Ｓ１４０ｎ）後のＬｏｇ分岐木を示す図。
【図２１】図１６の例のときのルート演算実行部１５０ｎの処理を説明するための図。
【図２２】実施例２の計算装置の機能構成例を示す図。
【図２３】実施例２の計算システムの処理フローの例を示す図。
【図２４】Ｌｏｇ＊（Ｃ−１）分岐木を説明するための図。
【発明を実施するための形態】
【００１５】
以下、本発明の実施の形態について、詳細に説明する。なお、同じ機能を有する構成部には同じ番号を付し、重複説明を省略する。
【実施例１】
【００１６】
図１に本発明の計算システムの構成例を示す。計算システムは、ネットワーク９００に接続されたＮ台の計算装置１００１，…，１００Ｎで構成される。実施例１の説明では、Ｎは２以上の整数、ｎは１以上Ｎ以下の整数、＾はべき乗を示す記号、Ｌは（（２＾２）＾・・・）＾２のように２に対して２乗を０回以上繰り返した整数、ｉは０以上Ｌ−１以下の整数、ｑはＬビットの素数、Ｚｑは０以上ｑ−１以下の整数の集合、ａとｂはＬ桁でビット表現された有限体上の整数、[ａ]ｑは整数ａが計算装置１００１，…，１００Ｎで秘密分散された状態であることを示す記号、[ａｉ]ｑはビット表現された整数ａのｉ＋１桁目が計算装置１００１，…，１００Ｎで秘密分散された状態であることを示す記号、ｌｏｇは底が２の対数、ｌｏｇ＊（１）ｘを、
【００１７】
【数２】
2014137740.tif 000004
【００１８】
とする。なお、ａとａｉとの関係は、
【００１９】
【数３】
2014137740.tif 000005
【００２０】
である。
＜予備的説明＞
まず、秘匿計算について説明する。Ｎ台の計算装置で有限体Ｚｑに属する整数ａを秘密分散する方法として、Ｋ−１次多項式ｆ＿ａ（ｘ）を用いる方法などがある（ただし、Ｋ＜Ｎ／２）。この方法では、例えば、ｆ＿ａ（０）＝ａとし、計算装置１００ｎにはｆ＿ａ（ｎ）を配る。配られる情報ｆ＿ａ（ｎ）を整数ａの断片と呼ぶことにする。このとき、Ｋ台の計算装置が協力すればＫ−１次多項式ｆ＿ａ（ｘ）を解くことができるので、ｆ＿ａ（０）を求めることができる。
【００２１】
図２に加算結果の断片を秘密分散する処理フローを示す。ａ＋ｂ  ｍｏｄ  ｑに対する断片を求めるためには、計算装置１００ｎは個別に
ｆ＿ａ＋ｂ（ｎ）＝ｆ＿ａ（ｎ）＋ｆ＿ｂ（ｎ）  ｍｏｄ  ｑ
を計算する（Ｓ９１０ｎ）。各計算装置が個別に計算すればよいので、計算装置間での通信は不要である。
【００２２】
図３に秘匿された値同士の乗算結果の断片を秘密分散する処理フローを示す。乗算（ａ×ｂ  ｍｏｄ  ｑ）の場合は、
ｆ＿ａｂ（ｎ）＝ｆ＿ａ（ｎ）×ｆ＿ｂ（ｎ）  ｍｏｄ  ｑ
を計算する（Ｓ９２１ｎ）。しかし、ｆ＿ａｂ（ｘ）は２（Ｋ−１）次の多項式になってしまう。そこで、計算装置１００ｎは、Ｋ−１次多項式Ｆ＿（ｆ＿ａｂ（ｎ））（ｘ）を用いて、ｆ＿ａｂ（ｎ）の断片Ｆ＿（ｆ＿ａｂ（ｎ））（１），…，Ｆ＿（ｆ＿ａｂ（ｎ））（Ｎ）を計算し、計算装置１００ｍに断片Ｆ＿（ｆ＿ａｂ（ｎ））（ｍ）を配る（Ｓ９２２ｎ）。したがって、Ｎ（Ｎ−１）回の通信、つまり通信量がＯ（Ｎ２）の通信が必要になる。次に、計算装置１００ｎは、断片Ｆ＿（ｆ＿ａｂ（１））（ｎ），…，Ｆ＿（ｆ＿ａｂ（Ｎ））（ｎ）から、個別に、ラグランジェ多項式補間によって断片Ｆ＿ａｂ（ｎ）を求める（Ｓ９２３ｎ）。
【００２３】
図４に定数との乗算（ｋ×ａ  ｍｏｄ  ｑ）の結果の断片を秘密分散する処理フローを示す。この場合は、計算装置１００ｎは個別に、
ｆ＿ｋａ（ｎ）＝ｋ×ｆ＿ａ（ｎ）  ｍｏｄ  ｑ
を計算する（Ｓ９３０ｎ）。各計算装置が個別に計算すればよいので、計算装置間での通信は不要である。したがって、秘匿された値同士の乗算の場合に通信が必要になることが分かる。
【００２４】
図５に、ｉ＋１桁目のａとｂのビット[ａｉ]ｑ，[ｂｉ]ｑとキャリー演算子を示すビットである[ｓｉ]ｑ，[ｐｉ]ｑ，[ｋｉ]ｑとの関係を示す。図６にｉ＋１桁目のａとｂのビット[ａｉ]ｑ，[ｂｉ]ｑからキャリー演算子を求める処理フローを示す。[ｓｉ]ｑは[ａｉ]ｑと[ｂｉ]ｑとが両方とも１であり、桁上がり（キャリー）があることを示すビットである。[ｐｉ]ｑは[ａｉ]ｑと[ｂｉ]ｑのいずれか一方が１であり、下位の桁の結果によって桁上がり（キャリー）があるか否かが決まることを示すビットである。[ｋｉ]ｑは[ａｉ]ｑと[ｂｉ]ｑとが両方とも０であり、桁上がり（キャリー）がないことを示すビットである。
【００２５】
計算装置１００１，…，１００Ｎは、[ｓｉ]ｑは
[ｓｉ]ｑ＝[ａｉ]ｑ×[ｂｉ]ｑ
の秘匿計算によって求める（Ｓ８１１ｎ）。この計算では、秘匿されたビット同士の乗算なので計算装置間での通信が必要である。そして、計算装置１００１，…，１００Ｎは、[ｐｉ]ｑを
[ｐｉ]ｑ＝[ａｉ]ｑ＋[ｂｉ]ｑ−２[ｓｉ]ｑ
のように秘匿計算によって求め（Ｓ８１２ｎ）、[ｋｉ]ｑを
[ｋｉ]ｑ＝１−[ｓｉ]ｑ−[ｐｉ]ｑ
のように秘匿計算によって求める（Ｓ８１３ｎ）。そして、[ｓｉ]ｑ，[ｐｉ]ｑ，[ｋｉ]ｑの組[ｅｉ]ｑを出力する（Ｓ８１４ｎ）。ステップＳ８１２ｎ〜Ｓ８１４ｎの処理では計算装置間で通信の必要はない。
【００２６】
求められた組[ｅｉ]ｑは、[ａ]ｑと[ｂ]ｑのｉ＋１桁のビットが、両方とも１であることを示す秘匿された演算子Ｓ、一方だけ１であることを示す秘匿された演算子Ｐ、両方とも０であることを示す秘匿された演算子Ｋを示す情報である。
【００２７】
＜２分岐木を用いたキャリー計算＞
図７に２分岐木を用いた計算装置の構成例を示す。この構成は、非特許文献２に示された方式に基づいた計算装置８００ｎであり、計算システムは図１のようにネットワーク９００に接続されたＮ台の計算装置８００１，…，８００Ｎで構成されている。計算装置８００ｎは、キャリー演算子算出部８１０ｎ、２分岐木作成部８２０ｎ、ノード演算実行部８３０ｎ、２分岐ルート演算実行部８５０ｎ、出力部８８０ｎ、記録部８９０ｎを備える。記録部８９０ｎは、整数ａ，ｂの断片などを記録しておく。図８に図７の計算装置で構成した計算システムの処理フローを示す。また、図９に、ａ＝“１１０１１０１１”，ｂ＝“０１１００００１”の場合のキャリー演算子と演算結果とキャリーの関係を例示する。図９では、２分岐木を用いたキャリーの計算を説明しやすいように、Ｌ＝８の例を示している。以下では、一連の処理によって演算結果の行に示されたキャリー演算子の列が得られることを示す。
【００２８】
計算装置８００１，…，８００Ｎのキャリー演算子算出部８１０１，…，８１０Ｎは、例えば図６に示した方法で、[ａ]ｑと[ｂ]ｑに対して、ビット表現された桁ごとに、両方とも１であることを示す秘匿された演算子Ｓ、一方だけ１であることを示す秘匿された演算子Ｐ、両方とも０であることを示す秘匿された演算子Ｋのいずれか１つを求め、各桁のキャリー演算子とする（Ｓ８１０ｎ）。この処理では、秘匿されたビット同士の乗算の処理がＬ桁分の処理に必要なので、計算装置８００１，…，８００Ｎ間でのＯ（Ｎ２）の通信がＯ（Ｌ）回必要である。つまり、Ｏ（Ｌ）のオーダの通信量が必要である。図９に示したａとｂの場合、Ｓ８１０１，…，Ｓ８１０Ｎでは、“ＰＳＰＰＰＫＰＳ”というキャリー演算子の列が算出される。
【００２９】
２分岐木作成部８２０１，…，８２０Ｎは、キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列を２分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、２分岐木を作成する（Ｓ８２０ｎ）。この処理では、通信は必要ない。図１０に、図９の例のときに作成される２分岐木を示す。最初にノード８２１−０−１に“ＰＳＰＰＰＫＰＳ”が割り当てられる。そして、このキャリー演算子の列が２分割され、ノード８２１−１−１には下位の桁側の“ＰＫＰＳ”が、ノード８２１−１−２には上位の桁側の“ＰＳＰＰ”が割り当てられる。同じ処理を繰り返すと、図１０に示した２分岐木が作成される。２分岐木の場合、分岐木の深さはｌｏｇＬになる。したがって、Ｌ＝８の場合の深さは３であり、Ｌ＝１６ならば深さは４である。
【００３０】
ノード演算実行部８３０１，…，８３０Ｎは、２分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする。図１１は、図９の例のときに得られるノードキャリー演算子を示す図である。１回のキャリー演算子同士の演算では、１回の秘匿されたビット同士の乗算だから、１回のＯ（Ｎ２）のオーダの通信が必要である。よって、１つのノードに割り当てられたキャリー演算子が１つになるまで演算を行うには（ノードに割り当てられた数−１）回のＯ（Ｎ２）のオーダの通信が必要である（つまり、Ｏ（ノードに割り当てられた数）のオーダの通信量となる）。そして、分岐木の深さがｌｏｇＬであることから、２分岐木全体に対してステップＳ８３０ｎの処理を行うには、Ｏ（Ｌ・ｌｏｇＬ）のオーダの通信量が必要となる。
【００３１】
２分岐ルート演算実行部８５０１，…，８５０Ｎは、２分岐木作成部の処理で１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする（Ｓ８５０ｎ）。図１２に、図９の例のときの２分岐ルート演算実行部８５０ｎの処理のイメージを示す。例えば、点線で丸印を付したノード８２１−３−６の場合、このノードよりも下の桁のキャリー演算子が割り当てられたノードは、ノード８２１−３−１〜５なので、ノード８２１−３−１〜６に割り当てられたキャリー演算子の列の演算を行えばよい。例えば、ノード８２１−３−１〜４に割り当てられたキャリー演算子を演算した結果はノード８２１−１−１に割り当てられているので、ノード８２１−３−６，８２１−３−５，８２１−１−１に割り当てられたキャリー演算子の列“ＰＰＫ”を演算し、演算結果“Ｋ”を得る。もしくは、ノード８２１−３−１〜４の結果はノード８２１−１−１に割り当てられ、ノード８２１−３−６，８２１−３−５の結果はノード８２１−２−３に割り当てられているので、“ＰＫ”を演算し、演算結果“Ｋ”を得てもよい。この処理でも、整数ａ，ｂのビット長Ｌと分岐木の深さｌｏｇＬを考慮すると、Ｏ（Ｌ・ｌｏｇＬ）のオーダの通信量が必要である。
【００３２】
そして、出力部８８０１，…，８８０Ｎは、２分岐ルート演算実行部８５０１，…，８５０Ｎの処理の結果、ノードキャリー演算子がＳの桁から１つ上の桁へのキャリービットが１であることを示す秘匿された情報を出力し、その他の結果の桁はキャリービットが０であることを示す秘匿された情報を出力する（Ｓ８８０ｎ）。図９の例の場合であれば、図１２に示されているように“ＳＳＫＫＫＫＳＳ”を出力する。これのキャリー演算子の列は、図９の演算結果の行に示されたキャリー演算子の列と一致する。そして、このキャリー演算子の列は、それぞれ、１つ上の桁へのキャリービットが１であるか０であるかをそれぞれ示している。
【００３３】
計算装置８００１，…，８００Ｎで構成された計算システムの場合、最も通信量が必要な処理の通信量のオーダがＯ（Ｌ・ｌｏｇＬ）なので、全体としてＯ（Ｌ・ｌｏｇＬ）のオーダの通信量が必要である。
【００３４】
＜実施例１の構成と処理フロー＞
本実施例の計算システムの構成例は、図１に示したとおりである。図１３に、実施例１の計算装置の機能構成例を示す。図１４に、実施例１の計算装置を用いた計算システムの処理フローを示す。計算装置１００ｎは、キャリー演算子算出部８１０ｎ、Ｌｏｇ分岐木作成部１２０ｎ、ノード演算実行部８３０ｎ、キャリー伝搬処理部１４０ｎ、ルート演算実行部１５０ｎ、出力部１８０ｎ、記録部１９０ｎを備える。記録部１９０ｎは、整数ａ，ｂの断片などを記録しておく。本実施例では、図１５に示したＬｏｇ分岐木を作成する。Ｌｏｇ分岐木は、１つの子ノードに割り当てるキャリー演算子の数がｌｏｇ（親ノードに割り当てられたキャリー演算子の数）となるようにキャリー演算子の列を分割する。したがって、子ノードの数は（親ノードに割り当てられたキャリー演算子の数）／ｌｏｇ（親ノードに割り当てられたキャリー演算子の数）となる。図１６は、ａ＝“００１０１１００１１０１１０１１”，ｂ＝“０００１１００００１１００００１”の場合のキャリー演算子と演算結果とキャリーの関係を例示する。図１６では、Ｌｏｇ分岐木を用いたキャリーの計算を説明しやすいように、Ｌ＝１６の例を示している。以下では、一連の処理によって演算結果の行に示されたキャリー演算子の列が得られることを示す。
【００３５】
キャリー演算子算出部８１０ｎは、他の計算装置と協調して[ａ]ｑと[ｂ]ｑに対して、ビット表現された桁ごとに、両方とも１であることを示す秘匿された演算子Ｓ、一方だけ１であることを示す秘匿された演算子Ｐ、両方とも０であることを示す秘匿された演算子Ｋのいずれか１つを求め、各桁のキャリー演算子とする（Ｓ８１０ｎ）。この処理は、計算装置８００ｎと同じである。この処理では、秘匿されたビット同士の乗算の処理がＬ桁分の処理に必要なので、計算装置１００１，…，１００Ｎ間でのＯ（Ｎ２）の通信がＯ（Ｌ）回必要である。つまり、Ｏ（Ｌ）のオーダの通信量が必要である。図１６に示したａとｂの場合、Ｓ８１０１，…，Ｓ８１０Ｎでは、“ＫＫＰＰＳＰＫＫＰＳＰＰＰＫＰＳ”というキャリー演算子の列が算出される。
【００３６】
Ｌｏｇ分岐木作成部１２０ｎは、キャリー演算子算出部８１０ｎで算出したキャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、分岐木を作成する（Ｓ１２０ｎ）。本明細書では、この分岐木をＬｏｇ分岐木と呼ぶことにする。この処理では、通信は必要ない。図１７に、図１６の例のときに作成されるＬｏｇ分岐木を示す。最初にノード１２１−０−１に“ＫＫＰＰＳＰＫＫＰＳＰＰＰＫＰＳ”が割り当てられる。ノード１２１−０−１に割り当てられたキャリー演算子の数は１６なので、その子ノードの１つには、４（＝ｌｏｇ１６）個ずつのキャリー演算子が割り当てられるので、４分割されることになる。したがって、ノード１２１−１−１には最下位の“ＰＫＰＳ”が、ノード１２１−１−２には“ＰＳＰＰ”が、ノード１２１−１−３には“ＳＰＫＫ”が、ノード１２１−１−４には“ＫＫＰＰ”が割り当てられる。同じ処理を繰り返すと、図１７に示したＬｏｇ分岐木が作成される。Ｌｏｇ分岐木の場合、分岐木の深さはｌｏｇ＊（１）Ｌになる。したがって、Ｌ＝１６＝（２＾２）＾２の場合の深さは３である。２分岐木の場合はＬ＝１６＝２＾４のときは深さが４になるので、Ｌｏｇ分岐木の方が、深さが浅くなることが分かる。ｌｏｇＬ分岐木の場合、深さが４になるのは６５５３６＝（（２＾２）＾２）＾２（つまり、ｌｏｇ＊（１）６５５３６＝４）である。２分岐木の場合、６５５３６は２＾１６なので深さが１６となる。このように、桁数Ｌが大きくなるほどＬｏｇ分岐木と２分岐木との深さに差がでることが分かる。また、Ｌｏｇ分岐木の深さが５になるのは２＾６５５３６なので、実際のシステムでは、ｌｏｇ＊（１）Ｌは４または５になると考えられる。
【００３７】
ノード演算実行部８３０ｎは、Ｌｏｇ分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする。なお、“規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め”とは、規則にしたがった演算を忠実に実行するという意味に限定するものではなく、忠実に実行したのと同じ結果が得られるように演算することを意味している。例えば、ＳとＫは、その演算子よりも下位の桁の演算子に関わらず、演算結果が決まっている。つまり、上位側から演算し、ＳまたはＫが出現すれば、それよりも下位の桁については演算しなくても、忠実に演算したのと同じ結果が得られるので、それより下位側の演算は省略してもよい。図１８は、図１６の例のときに得られるノードキャリー演算子を示す図である。１回のキャリー演算子同士の演算では、１回の秘匿されたビット同士の乗算だから、１回のＯ（Ｎ２）のオーダの通信が必要である。よって、１つのノードに割り当てられたキャリー演算子が１つになるまで演算を行うには（ノードに割り当てられた数−１）回のＯ（Ｎ２）のオーダの通信が必要である（つまり、Ｏ（ノードに割り当てられた数）のオーダの通信量となる）。そして、分岐木の深さがｌｏｇ＊（１）Ｌであることから、Ｌｏｇ分岐木全体に対してステップＳ８３０ｎの処理を行うには、Ｏ（Ｌ・ｌｏｇ＊（１）Ｌ）のオーダの通信量が必要となる。
【００３８】
キャリー伝搬処理部１４０ｎは、プレフィックスＬｏｇ演算手段１６０（０）ｎを有し、同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士（このようなノードを「兄弟ノード」と呼ぶことにする。）の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、プレフィックスＬｏｇ演算手段の処理を実行し、その結果を各ノードのノードキャリー演算子にする（Ｓ１４０ｎ）。この処理で兄弟ノード間でのキャリーの伝搬を考慮したノードキャリー演算子を設定できる。プレフィックスＬｏｇ演算手段１６０（０）ｎは、図７に示した２分岐木作成部８２０ｎ、ノード演算実行部８３０ｎ、２分岐ルート演算実行部８５０ｎをまとめた機能を持つ手段であり、以下の（１），（２），（３）の処理を行う。
（１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列を２分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、２分岐木を作成する（２分岐木作成部８２０ｎの処理に相当する。）。
（２）前記２分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする（ノード演算実行部８３０ｎの処理に相当する。）。
（３）前記２分岐木の作成のときに１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする（２分岐ルート演算実行部８５０ｎの処理に相当する。）。これらの処理によって、兄弟ノード内の下位の桁側のキャリー演算子の影響を含んだキャリー演算子が、各ノードのノードキャリー演算子として設定される。
【００３９】
図１９は、図１６の例のときのキャリー伝搬処理部１４０ｎの処理（Ｓ１４０ｎ）を説明する図である。図１９（Ａ）のＬｏｇ分岐木は、図１８と同じであり、兄弟ノードの考え方が分かるように、いくつかの兄弟ノードを点線の丸でまとめている。兄弟ノードＡに含まれるノードは、どれも同一のノード１２１−０−１（親ノード）から分割されたノードである。兄弟ノードＢに含まれるノードや兄弟ノードＣに含まれるノードも同じように、同一のノードから分割されている。図１９（Ｂ）は、兄弟ノードＡに含まれるノードのノードキャリー演算子を並べてノード１４１−１−１に割り当て、２分岐木を作成した例を示している。つまり、兄弟ノードＡに対しての上記の（１）の処理が終了した状態である。図１９（Ｃ）は、図１９（Ｂ）の２分岐木に対して上記の（２）、（３）の処理を行った状態を示している。この例では、（１），（２），（３）の処理ではノードキャリー演算子の変更はなかった。同様の処理をすべての兄弟ノードに対して行う。図２０は、図１６の例のときのキャリー伝搬処理部１４０ｎの処理（Ｓ１４０ｎ）後のＬｏｇ分岐木を示す図である。例えば、兄弟ノード内の下位側のキャリー演算子の影響によって、ノード１２１−３−４のノードキャリー演算子が“Ｐ”から“Ｋ”に変更されている。
【００４０】
キャリー伝搬処理部１４０ｎの処理（Ｓ１４０ｎ）にも秘匿されたビットの乗算が含まれている。１段目の兄弟ノードに含まれるノードの数はＬ／ｌｏｇＬであり、これに対して２分岐木を用いたキャリー計算を行うので、通信量はＯ（（Ｌ／ｌｏｇＬ）・ｌｏｇ（Ｌ／ｌｏｇＬ））のオーダとなる。また、（Ｌ／ｌｏｇＬ）・ｌｏｇ（Ｌ／ｌｏｇＬ）≦Ｌなので、結局、１段目の兄弟ノードに対する処理に必要な通信量は高々Ｏ（Ｌ）のオーダである。２段目以下も、兄弟ノードの数は増えるがその分兄弟ノードに含まれるノード数は減るので、段ごとに高々Ｏ（Ｌ）のオーダの通信量となる。そして、Ｌｏｇ分岐木の深さがｌｏｇ＊（１）Ｌであることから、Ｌｏｇ分岐木全体に対してステップＳ１４０ｎの処理を行うには、Ｏ（Ｌ・ｌｏｇ＊（１）Ｌ）のオーダの通信量が必要となる。
【００４１】
ルート演算実行部１５０ｎは、Ｌｏｇ分岐木作成部１２０ｎの処理（Ｓ１２０ｎ）で１つのキャリー演算子が割り当てられたノード（葉ノード：分岐木の末端に相当するノード）と、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする（Ｓ１５０ｎ）。図２１に、図１６の例のときのルート演算実行部１５０ｎの処理を示す。例えば、点線で丸印を付したノード１２１−３−７の場合、このノードよりも下の桁のキャリー演算子が割り当てられたノードは、ノード１２１−３−１〜６なので、ノード１２１−３−１〜７に割り当てられたキャリー演算子の列の演算を行えばよい。例えば、ノード１２１−３−１〜４に割り当てられたキャリー演算子を演算した結果はノード１２１−１−１に割り当てられ、ノード１２１−３−５，６に割り当てられたキャリー演算子を演算した結果はノード１２１−２−３に割り当てられているので、ノード１２１−３−７，１２１−２−２，１２１−１−１に割り当てられたキャリー演算子の列“ＳＰＫ”を演算し、演算結果“Ｓ”を得る。この処理でも、整数ａ，ｂのビット長Ｌと分岐木の深さｌｏｇ＊（１）Ｌを考慮すると、Ｏ（Ｌ・ｌｏｇ＊（１）Ｌ）のオーダの通信量が必要である。
【００４２】
出力部１８０ｎは、ルート演算実行部１５０ｎの処理（Ｓ１５０ｎ）の結果、ノードキャリー演算子がＳとなった桁から１つ上の桁へのキャリービットが１であることを示す秘匿された情報を出力し、その他の結果の桁はキャリービットが０であることを示す秘匿された情報を出力する（Ｓ１８０ｎ）。図１６の例の場合であれば、図２１に示されているように“ＫＫＳＳＳＫＫＫＳＳＫＫＫＫＳＳ”を出力する。これのキャリー演算子の列は、図１６の演算結果の行に示されたキャリー演算子の列と一致する。そして、このキャリー演算子の列は、それぞれ、１つ上の桁へのキャリービットが１であるか０であるかをそれぞれ示している。
【００４３】
計算装置１００１，…，１００Ｎで構成された計算システムの場合、最も通信量が必要な処理の通信量のオーダがＯ（Ｌ・ｌｏｇ＊（１）Ｌ）なので、全体としてＯ（Ｌ・ｌｏｇ＊（１）Ｌ）のオーダの通信量が必要である。前述したように、ｌｏｇＬ分岐木の場合、深さが４になるのは６５５３６＝（（２＾２）＾２）＾２（つまり、ｌｏｇ＊（１）６５５３６＝４）である。それに対し、２分岐木の場合、６５５３６は２＾１６なので深さが１６となる。したがって、桁数Ｌが大きくなるほどＬｏｇ分岐木と２分岐木との深さに差がでることが分かる。そして、Ｌｏｇ分岐木の深さが５になるのは２＾６５５３６なので、実際のシステムでは、ｌｏｇ＊（１）Ｌは４または５になると考えられる。言い換えると、Ｌｏｇ分岐木の場合、実際には、深さを高々５と考えれば通信量をＯ（Ｌ）のオーダと考えることもできる。
【００４４】
実施例１の計算システムによれば、キャリー演算子の列をｌｏｇ（ノードに割り当てられたキャリー演算子の数）個ごとに分割してＬｏｇ分岐木を作成するので、分岐木の深さをｌｏｇ＊（１）Ｌにできる。よって、非特許文献２の分岐木の深さｌｏｇＬよりも浅くできる。また、プレフィックスＬｏｇ演算手段を用いて兄弟ノード間でのキャリー伝搬を処理するので、３以上に分割した場合でもルート演算実行部の処理量を減らすことができる。したがって、本発明の計算システムでは、キャリーの計算での通信量をＯ（Ｌ・ｌｏｇ＊（１）Ｌ）にできる。
【実施例２】
【００４５】
実施例１では、
【００４６】
【数４】
2014137740.tif 000006
【００４７】
という式を用いた方法を示した。実施例２では、より一般化した例を示す。具体的には、
【００４８】
【数５】
2014137740.tif 000007
【００４９】
を用いる。実施例２では、Ｎは２以上の整数、ｎは１以上Ｎ以下の整数、Ｌはｌｏｇ＊（Ｃ−１）の演算を演算結果が１になるまで繰り返したときにすべての計算結果が整数となる１以上の整数、ｑはＬビットの素数、Ｚｑは０以上ｑ−１以下の整数の集合、ａとｂはＬ桁でビット表現された有限体上の整数、[ａ]ｑは整数ａがＮ台の前記計算装置で秘匿された状態であることを示す記号、Ｃは１以上の整数、ｃは１以上Ｃ以下の整数、ｌｏｇは底が２の対数とする。実施例２の計算システムの構成も図１と同じであり、ネットワーク９００で接続された計算装置１００（Ｃ）１，…，１００（Ｃ）Ｎで構成される。
【００５０】
図２２に実施例２の計算装置の機能構成例を、図２３に実施例２の計算システムの処理フローの例を、図２４に実施例２で作成する分岐木を示す。計算装置１００（Ｃ）ｎは、キャリー演算子算出部８１０ｎ、Ｌｏｇ＊（Ｃ−１）分岐木作成部１２０（Ｃ）ｎ、ノード演算実行部８３０ｎ、キャリー伝搬処理部１４０（Ｃ）ｎ、ルート演算実行部１５０（Ｃ）ｎ、出力部１８０（Ｃ）ｎ、記録部１９０（Ｃ）ｎ備える。記録部１９０（Ｃ）ｎは、整数ａ，ｂの断片などを記録しておく。
【００５１】
キャリー演算子算出部８１０ｎは、他の計算装置と協調して[ａ]ｑと[ｂ]ｑに対して、ビット表現された桁ごとに、両方とも１であることを示す秘匿された演算子Ｓ、一方だけ１であることを示す秘匿された演算子Ｐ、両方とも０であることを示す秘匿された演算子Ｋのいずれか１つを求め、各桁のキャリー演算子とする（Ｓ８１０ｎ）。キャリー演算子算出部８１０ｎは計算装置１００ｎと同じであり、Ｏ（Ｌ）のオーダの通信量が必要である。
【００５２】
Ｌｏｇ＊（Ｃ−１）分岐木作成部１２０（Ｃ）ｎは、キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ＊（Ｃ−１）（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、図２４に示した分岐木を作成する（Ｓ１２０（Ｃ）ｎ）。本明細書では、この分岐木をＬｏｇ＊（Ｃ−１）分岐木と呼ぶことにする。この処理では、通信は必要ない。キャリー演算子を分割する数が異なるだけで、処理の概要は、実施例１と同じである。Ｌｏｇ＊（Ｃ−１）分岐木の深さはｌｏｇ＊（Ｃ）Ｌである。そして、ｌｏｇ＊（Ｃ）Ｌ≦ｌｏｇ＊（１）Ｌなので、Ｌｏｇ＊（Ｃ−１）分岐木の方がＬｏｇ分岐木（実施例１で示した分岐木）よりも深さが浅い。
【００５３】
ノード演算実行部８３０ｎは、Ｌｏｇ＊（Ｃ−１）分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする（Ｓ８３０ｎ）。ノード演算実行部８３０ｎは、計算装置１００ｎと同じである。よって、１つのノードに割り当てられたキャリー演算子が１つになるまで演算を行うには、Ｏ（ノードに割り当てられた数）のオーダの通信量が必要である。そして、分岐木の深さがｌｏｇ＊（Ｃ−１）Ｌなので、通信量はＯ（Ｌ・ｌｏｇ＊（Ｃ−１）Ｌ）のオーダである。
【００５４】
キャリー伝搬処理部１４０（Ｃ）ｎは、プレフィックスＬｏｇ＊（Ｃ−１）演算手段１６０（Ｃ−１）ｎを有し、同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間（兄弟ノード間）で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、プレフィックスＬｏｇ＊（Ｃ−１）演算手段の処理を実行し、その結果を各ノードのノードキャリー演算子にする（Ｓ１４０（Ｃ）ｎ）。この処理のイメージも実施例１と同じである。ただし、キャリー伝搬処理部１４０（Ｃ）ｎは、Ｃの値が１つ小さいプレフィックスＬｏｇ＊（Ｃ−１）演算手段１６０（Ｃ−１）ｎを有している点には注意されたい。以下で詳しく説明するが、キャリー伝搬処理部１４０（Ｃ）ｎは入れ子構造になっているので、１つずつ小さくしながら繰り返す処理を行う。
【００５５】
図２２には、Ｌｏｇ＊（Ｃ−１）分岐木作成部１２０（Ｃ）ｎ、ノード演算実行部８３０ｎ、キャリー伝搬処理部１４０（Ｃ）ｎ、ルート演算実行部１５０（Ｃ）ｎで、プレフィックスＬｏｇ＊（Ｃ）演算手段１６０（Ｃ）ｎを構成することを示している。同様に、プレフィックスＬｏｇ＊（Ｃ−１）演算手段１６０（Ｃ−１）ｎ（図示していない）は、Ｌｏｇ＊（Ｃ−２）分岐木作成部１２０（Ｃ−１）ｎ、ノード演算実行部８３０ｎ、キャリー伝搬処理部１４０（Ｃ−１）ｎ、ルート演算実行部１５０（Ｃ−１）ｎで構成されている。このように入れ子構造なので、ｃが２以上のときは、キャリー伝搬処理部１４０（ｃ）ｎはプレフィックスＬｏｇ＊（ｃ−１）演算手段１６０（ｃ−１）ｎを有しており、プレフィックスＬｏｇ＊（ｃ−１）演算手段１６０（ｃ−１）ｎは、Ｌｏｇ＊（ｃ−２）分岐木作成部１２０（ｃ−１）ｎ、ノード演算実行部８３０ｎ、キャリー伝搬処理部１４０（ｃ−１）ｎ、ルート演算実行部１５０（ｃ−１）ｎで構成されている。また、ｃ＝１のときはキャリー伝搬処理部１４０（１）ｎはプレフィックスＬｏｇ＊（０）演算手段１６０（０）ｎを有しており、プレフィックスＬｏｇ＊（０）演算手段１６０（０）ｎは、実施例１に示したプレフィックスＬｏｇ演算手段１６０（０）ｎと同じである。つまり、プレフィックスＬｏｇ＊（０）演算手段は、２分岐木作成部８２０ｎ、ノード演算実行部８３０ｎ、２分岐ルート演算実行部８５０ｎと同じ機能を有している。
【００５６】
したがって、ｃが２以上のときは、プレフィックスＬｏｇ＊（ｃ−１）演算手段は、以下の（１−１）〜（１−４）の処理を行う。
（１−１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列をｌｏｇ＊（ｃ−２）（ノードに割り当てられたキャリー演算子の数）個ごとに分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、Ｌｏｇ＊（ｃ−２）分岐木を作成する（Ｌｏｇ＊（ｃ−２）分岐木作成部１２０（ｃ−１）ｎの処理に相当する。）。
（１−２）Ｌｏｇ＊（ｃ−２）分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする（ノード演算実行部８３０ｎの処理に相当する。）。
（１−３）プレフィックスＬｏｇ＊（ｃ−２）演算手段を有し、（１−１）の処理で同じキャリー演算子の列から分割されたキャリー演算子の列が割り当てられたノード同士の間で、そのノードのノードキャリー演算子とそのノードよりも下の桁のキャリー演算子が割り当てられたノードのノードキャリー演算子で構成されるキャリー演算子の列に対して、プレフィックスＬｏｇ＊（ｃ−２）演算手段の処理を実行し、その結果を各ノードのノードキャリー演算子にする（キャリー伝搬処理部１４０（ｃ−１）ｎの処理に相当する。）。
（１−４）（１−１）の処理で１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする（ルート演算実行部１５０（ｃ−１）ｎの処理に相当する。）。
【００５７】
そして、ｃ＝１のとき、すなわちプレフィックスＬｏｇ＊（０）演算手段は、以下の（２−１），（２−２），（２−３）の処理を行う。
（２−１）キャリー演算子の列を１つのノードに割り当て、キャリー演算子の列を２分割してそれぞれ別のノードに割り当てる処理をキャリー演算子の数が１になるまで繰り返すことで、２分岐木を作成する（２分岐木作成部８２０ｎの処理に相当する。）。
（２−２）前記２分岐木のノードごとに、割り当てられたキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする（ノード演算実行部８３０ｎの処理に相当する。）。
（２−３）前記２分岐木の作成のときに１つのキャリー演算子が割り当てられたノードと、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする（２分岐ルート演算実行部８５０ｎの処理に相当する。）。
【００５８】
キャリー伝搬処理部１４０（Ｃ）ｎの処理（Ｓ１４０（Ｃ）ｎ）にも秘匿されたビットの乗算が含まれている。１段目の兄弟ノードに含まれるノードの数はＬ／ｌｏｇ＊（Ｃ−１）Ｌであり、これに対してＬｏｇ＊（Ｃ−２）分岐木を用いたキャリー計算を行うので、通信量はＯ（（Ｌ／ｌｏｇ＊（Ｃ−１）Ｌ）・ｌｏｇ＊（Ｃ−１）（Ｌ／ｌｏｇ＊（Ｃ−１）Ｌ））のオーダとなる。また、（Ｌ／ｌｏｇ＊（Ｃ−１）Ｌ）・ｌｏｇ＊（Ｃ−１）（Ｌ／ｌｏｇ＊（Ｃ−１）Ｌ）≦Ｌなので、結局、１段目の兄弟ノードに対する処理に必要な通信量は高々Ｏ（Ｌ）のオーダである。２段目以下も、兄弟ノードの数は増えるがその分兄弟ノードに含まれるノード数は減るので、段ごとに高々Ｏ（Ｌ）のオーダの通信量となる。そして、Ｌｏｇ＊（Ｃ−１）分岐木の深さがｌｏｇ＊（Ｃ）Ｌであることから、Ｌｏｇ＊（Ｃ−１）分岐木全体に対してステップＳ１４０（Ｃ）ｎの処理を行うには、Ｏ（Ｌ・ｌｏｇ＊（Ｃ）Ｌ）のオーダの通信量が必要となる。
【００５９】
ルート演算実行部１５０（Ｃ）ｎは、Ｌｏｇ＊（Ｃ−１）分岐木作成部１２０（Ｃ）ｎの処理（Ｓ１２０（Ｃ）ｎ）で１つのキャリー演算子が割り当てられたノード（葉ノード）と、そのノードよりも下の桁のキャリー演算子が割り当てられたノードが属する部分木のルートノードのノードキャリー演算子とで構成されるキャリー演算子の列に対して、
ｘをＳ，Ｐ，Ｋのいずれかとするときに、
Ｓ＝Ｓｘ，Ｋ＝Ｋｘ，ｘ＝Ｐｘ
の規則にしたがった演算を繰り返すと得られる１つのキャリー演算子を求め、ノードキャリー演算子とする（Ｓ１５０（Ｃ）ｎ）。この処理も実施例１のルート演算実行部１５０ｎの処理（Ｓ１５０ｎ）と同様の処理であり、整数ａ，ｂのビット長Ｌと分岐木の深さｌｏｇ＊（Ｃ）Ｌを考慮すると、Ｏ（Ｌ・ｌｏｇ＊（Ｃ）Ｌ）のオーダの通信量が必要である。
【００６０】
出力部１８０（Ｃ）ｎは、ルート演算実行部１５０（Ｃ）ｎの処理（Ｓ１５０（Ｃ）ｎ）の結果、ノードキャリー演算子がＳの桁から１つ上の桁へのキャリービットが１であることを示す秘匿された情報を出力し、その他の結果の桁はキャリービットが０であることを示す秘匿された情報を出力する（Ｓ１８０（Ｃ）ｎ）。
【００６１】
計算装置１００（Ｃ）１，…，１００（Ｃ）Ｎで構成された計算システムの場合、最も通信量が必要な処理の通信量のオーダがＯ（Ｌ・ｌｏｇ＊（Ｃ）Ｌ）なので、全体としてＯ（Ｌ・ｌｏｇ＊（Ｃ）Ｌ）のオーダの通信量が必要である。そして、ｌｏｇ＊（Ｃ）Ｌはｌｏｇ＊（１）Ｌ以下の値になるので、理論的には実施例１よりもさらに通信量を少なくできる。ただし、実施例１で説明したようにＬｏｇ分岐木でも実用上は十分に深さが浅いので、実用上の効果は実施例１と同じか少しよい程度だと考えられる。
【００６２】
実施例２の計算システムによれば、キャリー演算子の列をｌｏｇ＊（Ｃ−１）（ノードに割り当てられたキャリー演算子の数）個ごとに分割してＬｏｇ＊（Ｃ−１）分岐木を作成するので、分岐木の深さをｌｏｇ＊（Ｃ）Ｌにできる。よって、非特許文献２の分岐木の深さｌｏｇＬよりも浅くできる。また、プレフィックスＬｏｇ＊（Ｃ−１）演算手段を用いて兄弟ノード間でのキャリー伝搬を処理するので、３以上に分割した場合でもルート演算実行部の処理量を減らすことができる。したがって、本発明の計算システムでは、キャリーの計算での通信量をＯ（Ｌ・ｌｏｇ＊（Ｃ）Ｌ）にできる。
【００６３】
［プログラム、記録媒体］
上述の各種の処理は、記載に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。その他、本発明の趣旨を逸脱しない範囲で適宜変更が可能であることはいうまでもない。
【００６４】
また、上述の構成をコンピュータによって実現する場合、各装置が有すべき機能の処理内容はプログラムによって記述される。そして、このプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。
【００６５】
この処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、例えば、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリ等どのようなものでもよい。
【００６６】
また、このプログラムの流通は、例えば、そのプログラムを記録したＤＶＤ、ＣＤ−ＲＯＭ等の可搬型記録媒体を販売、譲渡、貸与等することによって行う。さらに、このプログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することにより、このプログラムを流通させる構成としてもよい。
【００６７】
このようなプログラムを実行するコンピュータは、例えば、まず、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、一旦、自己の記憶装置に格納する。そして、処理の実行時、このコンピュータは、自己の記録媒体に格納されたプログラムを読み取り、読み取ったプログラムに従った処理を実行する。また、このプログラムの別の実行形態として、コンピュータが可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することとしてもよく、さらに、このコンピュータにサーバコンピュータからプログラムが転送されるたびに、逐次、受け取ったプログラムに従った処理を実行することとしてもよい。また、サーバコンピュータから、このコンピュータへのプログラムの転送は行わず、その実行指示と結果取得のみによって処理機能を実現する、いわゆるＡＳＰ（Application Service Provider）型のサービスによって、上述の処理を実行する構成としてもよい。なお、本形態におけるプログラムには、電子計算機による処理の用に供する情報であってプログラムに準ずるもの（コンピュータに対する直接の指令ではないがコンピュータの処理を規定する性質を有するデータ等）を含むものとする。
【００６８】
また、この形態では、コンピュータ上で所定のプログラムを実行させることにより、本装置を構成することとしたが、これらの処理内容の少なくとも一部をハードウェア的に実現することとしてもよい。
【産業上の利用可能性】
【００６９】
本発明は、データを秘匿した状態で計算する秘密計算システムに利用できる。
【符号の説明】
【００７０】
１００ｎ，８００ｎ  計算装置          １２０ｎ  Ｌｏｇ分岐木作成部
１２１，１４１，８２１  ノード      １４０ｎ  キャリー伝搬処理部
１５０ｎ  ルート演算実行部          １６０（０）ｎ  プレフィックスＬｏｇ演算手段
１８０ｎ，８８０ｎ  出力部            １９０ｎ，８９０ｎ  記録部
８１０ｎ  キャリー演算子算出部        ８２０ｎ  ２分岐木作成部
８３０ｎ  ノード演算実行部            ８５０ｎ  ２分岐ルート演算実行部
９００  ネットワーク
【図１】
2014137740.tif 000014
【図２】
2014137740.tif 000015
【図３】
2014137740.tif 000016
【図４】
2014137740.tif 000017
【図５】
2014137740.tif 000018
【図６】
2014137740.tif 000019
【図７】
2014137740.tif 000020
【図８】
2014137740.tif 000021
【図９】
2014137740.tif 000022
【図１０】
2014137740.tif 000023
【図１１】
2014137740.tif 000024
【図１２】
2014137740.tif 000025
【図１３】
2014137740.tif 000026
【図１４】
2014137740.tif 000027
【図１５】
2014137740.tif 000028
【図１６】
2014137740.tif 000029
【図１７】
2014137740.tif 000030
【図１８】
2014137740.tif 000031
【図１９】
2014137740.tif 000032
【図２０】
2014137740.tif 000033
【図２１】
2014137740.tif 000034
【図２２】
2014137740.tif 000035
【図２３】
2014137740.tif 000036
【図２４】
2014137740.tif 000037