(57)【要約】【課題】  ユニタリ行列の固有値を容易に算出する。【解決手段】  エルミート行列算出部１１にユニタリ行列を入力し、このユニタリ行列とその共役転置行列との和であるエルミート行列を算出する。そして、このエルミート行列をエルミート行列固有値算出部１２に入力し、このエルミート行列の固有値を算出する。そして、このエルミート行列の固有値をリスト生成部１３に入力し、これを定数倍し、その演算結果を出力する。  この手順を固有値算出対象のユニタリ行列Ｕ、或いはそれから生成したユニタリ行列に適用し、ユニタリ行列Ｕの固有値の実部、虚部及び重複度を特定するための情報を得、ユニタリ行列Ｕの固有値を求める。【選択図】    図１
2006139575.tif 000002
【特許請求の範囲】
【請求項１】
ユニタリ行列の固有値を計算する固有値計算装置であって、
ユニタリ行列が入力され、当該ユニタリ行列とその共役転置行列との和であるエルミート行列を算出して出力するエルミート行列算出手段と、
前記エルミート行列が入力され、当該エルミート行列の固有値を算出して出力するエルミート行列固有値算出手段と、
前記エルミート行列の固有値が入力され、当該エルミート行列の固有値を定数倍し、その演算結果を出力するリスト生成手段と、
を有することを特徴とする固有値計算装置。
【請求項２】
ユニタリ行列Ｕの固有値を計算する固有値計算装置であって、
前記ユニタリ行列Ｕが入力され、当該ユニタリ行列Ｕが実行列であるか否かを判定する第１の判定手段と、
前記ユニタリ行列Ｕが入力され、当該ユニタリ行列Ｕとその共役転置行列である第１の共役転置行列Ｕ＊との和である第１のエルミート行列Ｕ＋Ｕ＊を算出して出力する第１のエルミート行列算出手段と、
前記第１のエルミート行列Ｕ＋Ｕ＊が入力され、当該第１のエルミート行列Ｕ＋Ｕ＊の固有値である第１の固有値を算出して出力する第１のエルミート行列固有値算出手段と、
前記第１の固有値が入力され、当該第１の固有値を１／２倍して前記ユニタリ行列Ｕの固有値の実部を算出し、算出した前記ユニタリ行列Ｕの固有値の実部ａｊ（１≦ｊ≦ｕ，１≦ｕ≦ｎ，当該ユニタリ行列Ｕはｎ×ｎ行列）とその重複度ｐｊとの対からなる第１のリストＡ＝［（ａｊ，ｐｊ）］を生成して出力する第１のリスト生成手段と、
前記ユニタリ行列Ｕが実行列であると判定された場合に、前記第１のリストＡ＝［（ａｊ，ｐｊ）］が入力され、その実部ａｊから平方根ｂｊ＝√（１−（ａｊ）２）を算出し、固有値リスト［（ａｊ＋ｂｊ・ｉ），ｐｊ／２］，［（ａｊ−ｂｊ・ｉ），ｐｊ／２］（ｉは虚数単位）を生成し、生成した当該固有値リストを出力する第２のリスト生成手段と、
を有することを特徴とする固有値計算装置。
【請求項３】
ユニタリ行列Ｕの固有値を計算する固有値計算装置であって、
前記ユニタリ行列Ｕが入力され、当該ユニタリ行列Ｕとその共役転置行列である第１の共役転置行列Ｕ＊との和である第１のエルミート行列Ｕ＋Ｕ＊を算出して出力する第１のエルミート行列算出手段と、
前記第１のエルミート行列Ｕ＋Ｕ＊が入力され、当該第１のエルミート行列Ｕ＋Ｕ＊の固有値である第１の固有値を算出して出力する第１のエルミート行列固有値算出手段と、
前記第１の固有値が入力され、当該第１の固有値を１／２倍して前記ユニタリ行列Ｕの固有値の実部を算出し、算出した前記ユニタリ行列Ｕの固有値の実部ａｊ（１≦ｊ≦ｕ，１≦ｕ≦ｎ，当該ユニタリ行列Ｕはｎ×ｎ行列）とその重複度ｐｊとの対からなる第１のリストＡ＝［（ａｊ，ｐｊ）］を生成して出力する第１のリスト生成手段と、
前記第１のリストＡ＝［（ａｊ，ｐｊ）］が入力され、この実部ａｊから平方根ｂｊ＝√（１−（ａｊ）２）を算出し、第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］を生成し、生成した当該第２のリストＡ’を出力する第２のリスト生成手段と、
前記ユニタリ行列Ｕと虚数単位ｉが入力され、当該ユニタリ行列Ｕと虚数単位ｉとの積ｉ・Ｕを算出して出力する第１の積演算手段と、
前記積ｉ・Ｕが入力され、当該積ｉ・Ｕとその共役転置行列である第２の共役転置行列（ｉ・Ｕ）＊との和である第２のエルミート行列ｉ・Ｕ＋（ｉ・Ｕ）＊を算出して出力する第２のエルミート行列算出手段と、
前記第２のエルミート行列ｉ・Ｕ＋（ｉ・Ｕ）＊が入力され、当該第２のエルミート行列ｉ・Ｕ＋（ｉ・Ｕ）＊の固有値である第２の固有値を算出して出力する第２のエルミート行列固有値算出手段と、
前記第２の固有値が入力され、当該第２の固有値を−１／２倍して前記ユニタリ行列Ｕの固有値の虚部ｂｋ（１≦ｋ≦ｖ，１≦ｖ≦ｎ，当該ユニタリ行列はｎ×ｎ行列）を算出し、算出した当該虚部ｂｋとその重複度ｑｋとの対からなる第３のリストＢ＝［（ｂｋ，ｑｋ）］を生成し、生成した当該第３のリストＢを出力する第３のリスト生成手段と、
を有することを特徴とする固有値計算装置。
【請求項４】
請求項３記載の固有値計算装置であって、
前記第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］及び前記第３のリストＢ＝［（ｂｋ，ｑｋ）］が入力され、これらを格納するリストメモリと、
前記リストメモリ内の前記第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］から１つの要素（ａ，ｂ，ｐ）を抽出し、ａ＝０であるか否か及び当該第２のリストＡ’に要素（−ａ，ｂ，ｐ’）が存在するか否かを判定する第２の判定手段と、
前記第２の判定手段において、ａ＝０或いは前記要素（−ａ，ｂ，ｐ’）が前記第２のリストＡ’に存在しないと判定された場合に、前記要素（ａ，ｂ，ｐ）が入力され、前記リストメモリ内の前記第３のリストＢ＝［（ｂｋ，ｑｋ）］から、要素（ｂ，ｑ）と要素（−ｂ，ｑ’）との少なくとも一方を抽出し、（ａ＋ｂ・ｉ，ｑ）及び（ａ−ｂ・ｉ，ｑ’）の少なくとも一方を生成して出力する固有値要素生成手段と、
を有することを特徴とする固有値計算装置。
【請求項５】
請求項４記載の固有値計算装置であって、
前記第２の判定手段において、前記要素（−ａ，ｂ，ｐ’）（ａ≠０）が前記第２のリストＡ’に存在すると判定された場合、ｂ＝０であるか否か、及び前記リストメモリ内の前記第３のリストＢ＝［（ｂｋ，ｑｋ）］に要素（ｂ，ｑ）と要素（−ｂ，ｑ’）とが共に存在するか否かを判定する第３の判定手段を有し、
前記固有値要素生成手段は、
前記第３の判定手段においてｂ＝０であると判定された場合、前記要素（ａ，ｂ，ｐ）及び（−ａ，ｂ，ｐ’）が入力され、（ａ，ｐ）及び（−ａ，ｐ’）を生成して出力し、
前記第３の判定手段において前記第３のリストＢ＝［（ｂｋ，ｑｋ）］に前記要素（ｂ，ｑ）又は要素（−ｂ，ｑ’）の何れか一方しか存在しないと判定された場合、存在すると判定された側のｂ又は−ｂであるｂ’、並びに前記要素（ａ，ｂ，ｐ）及び（−ａ，ｂ，ｐ’）が入力され、（ａ＋ｂ’・ｉ，ｐ）及び（−ａ＋ｂ’・ｉ，ｐ’）を生成して出力する手段である、
ことを特徴とする固有値計算装置。
【請求項６】
請求項５記載の固有値計算装置であって、
前記積ｉ・Ｕと前記ユニタリ行列Ｕとが入力され、当該ユニタリ行列Ｕと当該積ｉ・Ｕとの積ｉ・Ｕ２を算出して出力する第２の積演算手段と、
前記積ｉ・Ｕ２が入力され、当該積ｉ・Ｕ２とその共役転置行列である第３の共役転置行列（ｉ・Ｕ２）＊との和である第３のエルミート行列ｉ・Ｕ２＋（ｉ・Ｕ２）＊を算出して出力する第３のエルミート行列算出手段と、
前記第３のエルミート行列ｉ・Ｕ２＋（ｉ・Ｕ２）＊が入力され、当該第３のエルミート行列ｉ・Ｕ２＋（ｉ・Ｕ２）＊の固有値である第３の固有値を算出して出力する第３のエルミート行列固有値算出手段と、
前記第３の固有値が入力され、当該第３の固有値を−１／４倍して前記ユニタリ行列Ｕの固有値の実部ａｇ（１≦ｇ≦ｗ，１≦ｗ≦ｎ）と虚部ｂｇとの積ａｇ・ｂｇを算出し、算出した当該積ａｇ・ｂｇとその重複度ｒｇとの対からなる第４のリストＣ＝［（ａｇ・ｂｇ，ｒｇ）］を生成し、生成した当該第４のリストＣを出力する第４のリスト生成手段と、
を有し、
前記リストメモリは、
さらに前記第４のリストＣを格納し、
前記固有値要素生成手段は、
前記第３の判定手段において、前記リストメモリ内の前記第３のリストＢ＝［（ｂｋ，ｑｋ）］に要素（ｂ，ｑ）（ｂ≠０）と要素（−ｂ，ｑ’）とが共に存在すると判定された場合に、
前記リストメモリ内の前記第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］から前記要素（ａ，ｂ，ｐ）と（−ａ，ｂ，ｐ’）との対を抽出し、前記第３のリストＢ＝［（ｂｋ，ｑｋ）］から前記要素（ｂ，ｑ）を抽出し、前記第４のリストＣ＝［（ａｇ・ｂｇ，ｒｇ）］からａ・ｂに対応する要素（ａ・ｂ，ｒ）を抽出し、ｓ＝（−ｐ’＋ｑ＋ｒ）／２を算出し、（ａ＋ｂｉ，ｓ）、（ａ−ｂｉ，ｐ−ｓ）、（−ａ＋ｂｉ，ｑ−ｓ）及び（−ａ−ｂｉ，ｒ−ｓ）を生成し、生成した（ａ＋ｂｉ，ｓ）、（ａ−ｂｉ，ｐ−ｓ）、（−ａ＋ｂｉ，ｑ−ｓ）及び（−ａ−ｂｉ，ｒ−ｓ）を出力する手段である、
ことを特徴とする固有値計算装置。
【請求項７】
ユニタリ行列Ｕの固有値を計算する固有値計算装置であって、
前記ユニタリ行列Ｕが入力され、当該ユニタリ行列Ｕとその共役転置行列である第１の共役転置行列Ｕ＊との和である第１のエルミート行列Ｕ＋Ｕ＊を算出して出力する第１のエルミート行列算出手段と、
前記第１のエルミート行列Ｕ＋Ｕ＊が入力され、当該第１のエルミート行列Ｕ＋Ｕ＊の固有値である第１の固有値を算出して出力する第１のエルミート行列固有値算出手段と、
前記第１の固有値が入力され、当該第１の固有値を１／２倍して前記ユニタリ行列Ｕの固有値の実部を算出し、算出したユニタリ行列の固有値の実部ａｊ（１≦ｊ≦ｕ，１≦ｕ≦ｎ）とその重複度ｐｊとの対からなる第１のリストＡ＝［（ａｊ，ｐｊ）］を生成して出力する前記第１のリスト生成手段と、
前記第１のリストＡ＝［（ａｊ，ｐｊ）］が入力され、この実部ａｊから平方根ｂｊ＝√（１−（ａｊ）２）を算出し、第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］を生成し、生成した当該第２のリストＡ’を出力する前記第２のリスト生成手段と、
複素数β＝ｍ’＋ｍ・ｉ（ｉは虚数単位、（ｍ’）２＋ｍ２＝１）を設定して出力する複素数設定手段と、
前記ユニタリ行列Ｕ及び前記複素数βが入力され、当該ユニタリ行列Ｕと当該複素数βとの積β・Ｕを算出して出力する第３の積演算手段と、
前記積β・Ｕが入力され、当該積β・Ｕとその共役転置行列である第４の共役転置行列（β・Ｕ）＊との和である第４のエルミート行列β・Ｕ＋（β・Ｕ）＊を算出して出力する第４のエルミート行列算出手段と、
前記第４のエルミート行列β・Ｕ＋（β・Ｕ）＊が入力され、当該第４のエルミート行列β・Ｕ＋（β・Ｕ）＊の固有値である第４の固有値を算出して出力する第４のエルミート行列固有値算出手段と、
前記第４の固有値が入力され、当該第４の固有値を１／２倍した値ｃｈ（１≦ｈ≦ｘ，１≦ｘ≦ｎ，当該ユニタリ行列はｎ×ｎ行列）を算出し、算出した当該値ｃｈとその重複度ｚｈとの対からなる第５のリストＤ＝［（ｃｈ，ｚｈ）］を生成し、生成した当該第５のリストＤを出力する第５のリスト生成手段と、
前記第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］及び前記第５のリストＤ＝［（ｃｈ，ｚｈ）］が入力され、これらを格納するリストメモリと、
ｍ’，ｍ，ａ，ｂを示す情報が入力され、前記第５のリストＤに要素（ａ・ｍ’−ｂ・ｍ，ｚ）又は（ａ・ｍ’＋ｂ・ｍ，ｚ’）が存在するか否かを検索し、当該第５のリストＤに当該要素（ａ・ｍ’−ｂ・ｍ，ｚ）が存在した場合、（ａ＋ｂ・ｉ，ｚ）を生成して出力し、当該要素（ａ・ｍ’＋ｂ・ｍ，ｚ’）が存在した場合、（ａ−ｂ・ｉ，ｚ’）を生成して出力する固有値要素生成手段と、
を有することを特徴とする固有値計算装置。
【請求項８】
請求項７記載の固有値計算装置であって、
前記複素数設定手段は、
前記第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］の要素をａｊの大きさ順に並び替えた第６のリストＡ’’を生成し、当該第６のリストＡ’’の隣り合う要素（ａ，ｂ，ｐ）及び（ａ’，ｂ’，ｐ’）の全ての対に対してａ・ｂ’−ａ’・ｂを計算し、その最小値の１／２をｍとして算出し、ｍ’＝√（１−ｍ２）を算出し、前記複素数β＝ｍ’＋ｍ・ｉを設定して出力する手段である、
ことを特徴とする固有値計算装置。
【請求項９】
請求項７記載の固有値計算装置であって、
前記複素数設定手段は、
前記第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］が入力され、複素数β＝ｍ’＋ｍ・ｉをランダムに生成し、仮リスト［（ａｊ・ｍ’−ｂｊ・ｍ，ａｊ・ｍ’＋ｂｊ・ｍ）］を生成し、当該仮リスト［（ａｊ・ｍ’−ｂｊ・ｍ，ａｊ・ｍ’＋ｂｊ・ｍ）］に要素の重複がないか判断し、要素の重複がなかった場合に、当該ランダムに生成した複素数β＝ｍ’＋ｍ・ｉを出力する手段である、
ことを特徴とする固有値計算装置。
【請求項１０】
ユニタリ行列の固有値計算方法であって、
エルミート行列算出手段に前記ユニタリ行列が入力され、当該エルミート行列算出手段が、当該ユニタリ行列とその共役転置行列との和であるエルミート行列を算出して出力する手順と、
エルミート行列固有値算出手段に前記エルミート行列が入力され、当該エルミート行列固有値算出手段が、当該エルミート行列の固有値を算出して出力する手順と、
前記エルミート行列の固有値がリスト生成手段に入力され、当該リスト生成手段が当該エルミート行列の固有値を定数倍し、その演算結果を出力する手順と、
を有することを特徴とする固有値計算方法。
【請求項１１】
請求項１から９の何れかに記載の固有値計算装置としてコンピュータを機能させるための固有値計算プログラム。
【請求項１２】
請求項１１記載の固有値計算プログラムを格納したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、固有値を計算する固有値計算装置、固有値計算方法、その固有値計算プログラム及び記録媒体に関し、特に、ユニタリ行列の固有値を計算する固有値計算装置、固有値計算方法、固有値計算プログラム及び記録媒体に関する。
【背景技術】
【０００２】
＜使用する記号の定義＞
本明細書では、行列Ａの転置行列をｔＡで表し、その転置行列の全ての要素を各々共役複素数で置き換えた行列である共役転置行列（随伴行列とも呼ぶ）をＡ＊で表す。このとき、エルミート（Hermite）行列（Ａが実行列の場合は対称行列）は、Ａ＝Ａ＊となる行列であり、ユニタリ（unitary）行列は、ＡＡ＊＝Ｉとなる行列である（但し、Ｉは単位行列を表す）。
＜本発明の背景＞
固有値計算において一番扱いやすい行列はエルミート行列である。すなわち、対象のエルミート行列をHouseholder変換やLanczosの方法等を用いて三重対角行列（三重対角エルミート行列）に変換し、それにQR法やSturm法を適用すれば、その固有値を求めることができる（例えば、非特許文献１，２参照。）。
【０００３】
一方、一般的な正方行列Ａの固有値の算出には以下の手法が用いられることが一般的である。すなわち、対象の正方行列Ａを、有限回の演算によって実現できるユニタリ相似変換によって都合のよい中間形Ａ’＝Ｕ＊ＡＵ（Ｕはユニタリ行列）に変形し、その中間形Ａ’にＱＲ法等の反復計算を適用してその固有値を求める手法がとられる（例えば、非特許文献１，２参照。）。この手法は、ＱＲ法等の反復計算によって中間形Ａ’が上三角形行列に収束する事実を前提にしたものであり、この前提が保たれる限り正しい固有値の算出が可能である。
【非特許文献１】森正武，杉原正顕，室田一雄著，「岩波講座応用数学  線形計算」，岩波書店，1994.
【非特許文献２】F. シャトラン著，伊理正夫，伊理由美訳，「行列の固有値」，シュプリンガー・フェアラーク東京，1993.
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかし、正方行列Ａが持つ複数の固有値のうち、相互に絶対値が等しいものが存在していた場合、上述した中間形Ａ’＝Ｕ＊ＡＵに反復計算を適用してその固有値を求める手法では、正しい固有値が求まらないことがある。すなわち、前述の通り、この固有値算出方法は、反復計算により中間形Ａ’が上三角形行列に収束する事実を前提としている。しかし、正方行列Ａが絶対値の等しい複数の固有値を持っていた場合、この反復計算によって中間形Ａ’が上三角形行列に収束しない場合もあり、その結果、正しい固有値を求められない場合も生じてくる。
【０００５】
ここでユニタリ行列の固有値の絶対値はすべて１である。そのため、ユニタリ行列を対象として前述の手法を適用した場合、正しい固有値を算出できない場合がある。
本発明はこのような点に鑑みてなされたものであり、ユニタリ行列の正しい固有値を容易に算出できる技術を提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明では上記課題を解決するために、まず、入力されたユニタリ行列とその共役転置行列との和であるエルミート行列を算出する。そして、このエルミート行列の固有値を算出し、このエルミート行列の固有値を定数倍し、その演算結果を出力する。
ここで、前述のように、エルミート行列の固有値を算出することは容易である。また、この手順を固有値算出対象のユニタリ行列Ｕ、或いはそれから生成したユニタリ行列に適用することにより、ユニタリ行列Ｕの固有値の実部、虚部及び重複度を特定するための情報を得ることができる。例えば、上記の手順を固有値算出対象のユニタリ行列Ｕに適用した場合、その出力は、ユニタリ行列Ｕの固有値の実部とその重複度とを特定するものとなる。また、上記の手順をユニタリ行列ｉ・Ｕ（ｉは虚数単位）に適用した場合、その出力は、ユニタリ行列Ｕの固有値の虚部とその重複度とを特定するものとなる。また、上記の手順をユニタリ行列ｉ・Ｕ２に適用した場合、その出力は、ユニタリ行列Ｕの固有値の実部及び虚部の積とその重複度とを特定するものとなる。なお、重複度とは、重複解の重複数を意味する。例えば、求めた値が０.２，０.２，０.２，０.４，０.５，０.５，０.７であった場合、値「０.２」の重複度は３となり、「０.５」の重複度は２となる。
【０００７】
このように、上記の手順によりユニタリ行列Ｕの固有値の実部、虚部及び重複度を特定するための情報を得ることができ、これによりユニタリ行列Ｕの固有値を特定することができる。
【発明の効果】
【０００８】
以上のように本発明では、ユニタリ行列の固有値の算出に計算のしやすいエルミート行列の固有値を利用することとしたため、ユニタリ行列の正しい固有値を容易に算出することが可能となる。
【発明を実施するための最良の形態】
【０００９】
以下、本発明の実施の形態を図面を参照して説明する。
〔第１の実施の形態〕
まず、本発明における第１の実施の形態について説明する。
＜原理＞
まず、本形態の原理について説明する。
図１は、本形態の固有値計算装置１０の基本的な構成を示したブロック図である。
図１に例示するように、本形態の固有値計算装置１０は、エルミート行列算出部１１、エルミート行列固有値算出部１２及びリスト生成部１３を有している。
【００１０】
まず、エルミート行列算出部１１にユニタリ行列が入力され、エルミート行列算出部１１は、当該ユニタリ行列とその共役転置行列との和であるエルミート行列を算出して出力する。次に、エルミート行列固有値算出部１２に、このエルミート行列が入力され、エルミート行列固有値算出部１２は、当該エルミート行列の固有値を算出して出力する。そして、リスト生成部１３にこのエルミート行列の固有値が入力され、リスト生成部１３は、当該エルミート行列の固有値を用いて当該エルミート行列の固有値を定数倍し、その演算結果を出力する。
【００１１】
次に、この基本構成をユニタリ行列の固有値の算出に適用して説明する。なお、以下では、固有値を求めるユニタリ行列をｎ行ｎ列のユニタリ行列Ｕとする。この場合、Ｕ＋Ｕ＊はエルミート行列となる。
［Ｕが実の場合］
まず、ユニタリ行列Ｕが実の場合について説明する。この場合、Ｕは直交行列となり、Ｕ＊＝ｔＵとなり、Ｖ＝Ｕ＋Ｕ＊は実対称行列となる。
まず、エルミート行列算出部１１に、ユニタリ行列Ｕが入力され、エルミート行列算出部１１は、当該ユニタリ行列Ｕとその共役転置行列Ｕ＊との和であるエルミート行列Ｖ＝Ｕ＋Ｕ＊を算出し、出力する。次に、エルミート行列固有値算出部１２にエルミート行列Ｖ＝Ｕ＋Ｕ＊が入力され、エルミート行列固有値算出部１２は、エルミート行列Ｖ＝Ｕ＋Ｕ＊に対し、実対称行列の固有値を求める公知のルーチンを適用し、エルミート行列Ｖ＝Ｕ＋Ｕ＊の固有値を求める。ここで、ユニタリ行列Ｕは共役転置行列Ｕ＊と可換であるため、ユニタリ行列Ｕの固有値と共役転置行列Ｕ＊の固有値との和は、エルミート行列Ｖ＝Ｕ＋Ｕ＊の固有値と等しくなる。また、ユニタリ行列Ｕの固有値（例えば、α＝ａ＋ｉ・ｂ）を共役複素数で置き換えたもの（ａ−ｉ・ｂ）は共役転置行列Ｕ＊の固有値となる。そのため、ユニタリ行列Ｕの固有値の実部をａγ（γ＝１，２，...，ｎ）とすると、エルミート行列Ｖ＝Ｕ＋Ｕ＊の固有値は２ａγとなる。なお、ここでは、固有値に重複度がある場合でも、その同じ固有値を重複度分並べている。
【００１２】
算出されたエルミート行列Ｖ＝Ｕ＋Ｕ＊の固有値２ａγは、リスト生成部１３に送られる。リスト生成部１３は、まず、送られたエルミート行列Ｖ＝Ｕ＋Ｕ＊の固有値２ａγのうち共通する値をまとめ、固有値２ａｊ（１≦ｊ≦ｕ，１≦ｕ≦ｎ）とその重複度ｐｊとの対を生成する。さらに、この固有値２ａｊを１／２倍し、ユニタリ行列Ｕの固有値の実部ａｊ（１≦ｊ≦ｕ，１≦ｕ≦ｎ）とその重複度ｐｊとの対からなるリストＡ＝［（ａｊ，ｐｊ）］を生成する。
また、ユニタリ行列Ｕの固有値の絶対値（実部の二乗と虚部の二乗との和の平方根）は１であるという関係を用い、リスト生成部１３は、ユニタリ行列Ｕの固有値の虚部ｂｊの絶対値を√（１−ａｊ２）によって算出する。
【００１３】
次に、ユニタリ行列Ｕの固有値の絶対値が１であることから、この固有値が虚であるかどうかは、−１＜ａｊ＜１が成り立つかどうかによって判断する。
ここで、−１＜ａｊ＜１を満たす場合、これを実部ａｊとする固有値は虚である。そして、このユニタリ行列Ｕは実であることから、この固有値は必ず複素共役の対となる。つまり、この実部ａｊをもつ固有値は、ａｊ＋√（１−ａｊ２）とａｊ−√（１−ａｊ２）の対になる。すなわち、この固有値の実部ａｊの重複度ｐｊは必ず偶数となる。
一方、−１＜ａｊ＜１を満たさない場合（ａｊ＝±１と同値）、この固有値は実であり、この実部ａｊをもつ固有値はａｊとなる。すなわち、実部ａｊ＝±１ならば、その固有値は±１（複号同順）となる。
【００１４】
以上より、ユニタリ行列Ｕの固有値が求まり、虚固有値の重複度は（１／２）・ｐｊとなり、実固有値（固有値が±１の場合）の重複度はｐｊとなる。
［Ｕが虚の場合］
次に、ユニタリ行列Ｕが複素の場合を説明する。すなわち、Ｕはユニタリ行列、Ｖ＝Ｕ＋Ｕ＊はエルミート行列である。
この場合もＵが実の場合と同様に、エルミート行列の固有値を求めるルーチンを用いてＶ＝Ｕ＋Ｕ＊の固有値を求めることにより、Ｕの固有値の実部と、虚部の絶対値とがわかる。ただし、Ｕが虚の場合、Ｕが実の場合と異なり、実部ａｊをもつ固有値が、ａｊ＋√（１−ａｊ２）とａｊ−√（１−ａｊ２）の対になるとは限らない。そのため、ユニタリ行列Ｕだけではなく、ユニタリ行列ｉ・Ｕをも図１の固有値計算装置１０に入力し、それぞれのリストを得る。
【００１５】
すなわち、まず、固有値計算装置１０にユニタリ行列Ｕが入力され、Ｕが実の場合と同様にリストＡ＝［（ａｊ，ｐｊ）］が生成される。また、ｂｊ＝√（１−ａｊ２）によって虚部の絶対値ｂｊを求め、三つ組みのリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］を生成する。
次に、エルミート行列算出部１１にユニタリ行列ｉ・Ｕが入力され、エルミート行列算出部１１は、当該ユニタリ行列ｉ・Ｕとその共役転置行列（ｉ・Ｕ）＊との和であるエルミート行列Ｖ’＝ｉ・Ｕ＋（ｉ・Ｕ）＊を算出し、出力する。次に、エルミート行列固有値算出部１２にエルミート行列Ｖ’＝ｉ・Ｕ＋（ｉ・Ｕ）＊が入力され、エルミート行列固有値算出部１２は、エルミート行列Ｖ’＝ｉ・Ｕ＋（ｉ・Ｕ）＊に対し、エルミート行列の固有値を求める公知のルーチンを適用し、エルミート行列Ｖ’＝ｉ・Ｕ＋（ｉ・Ｕ）＊の固有値を求める。
【００１６】
ここで、ユニタリ行列は正規行列なので、ユニタリ行列ｉ・Ｕの固有値の虚部ｂγとすると、エルミート行列Ｖ’＝ｉ・Ｕ＋（ｉ・Ｕ）＊の固有値は−２ｂγとなる。なお、ここでは、固有値に重複度がある場合でも、その同じ固有値を重複度分並べている。
算出されたエルミート行列Ｖ’＝ｉ・Ｕ＋（ｉ・Ｕ）＊の固有値−２ｂγは、リスト生成部１３に送られる。リスト生成部１３は、まず、送られたエルミート行列Ｖ’＝ｉ・Ｕ＋（ｉ・Ｕ）＊の固有値−２ｂγのうち共通する値をまとめ、固有値−２ｂｋ（１≦ｋ≦ｖ，１≦ｖ≦ｎ）とその重複度ｑｋとの対を生成する。さらに、この固有値−２ｂｋを−（１／２）倍し、ユニタリ行列Ｕの固有値の虚部ｂｋとその重複度ｑｋとの対からなるリストＢ＝［（ｂｋ，ｑｋ）］を作成する。
【００１７】
以上より、ユニタリ行列Ｕの固有値の実部、虚部及び重複度からなるリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］と、虚部及び重複度からなるリストＢ＝［（ｂｋ，ｑｋ）］とが生成されたことになる。
次に、リストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］から要素（ａ，ｂ，ｐ）を順番に取り出す。
１．ここでａ＝０であるか、リストＡ’に（−ａ，ｂ，ｐ’）という要素がなければ、Ｕの固有値で虚部が±ｂであるものの実部はａだけであることがわかる（実部が、−ａというものはない）。そのため、最初の成分がｂである（ｂ，ｑ）をリストＢから抽出することにより、Ｕの固有値で実部がａとなるものについて、虚部がｂとなるもの、すなわち、ａ＋ｂ・ｉがｑ個存在することがわかる。また、最初の成分が−ｂである（−ｂ，ｑ’）をリストＢから抽出することにより、Ｕの固有値で実部がａとなるものについて、虚部が−ｂとなるもの、すなわち、ａ−ｂ・ｉがｑ’個存在することがわかる。
【００１８】
２．一方、リストＡ’に（−ａ，ｂ，ｐ’）（ａ≠０）という要素があり、リストＢに（ｂ，ｑ），（−ｂ，ｑ’）の一方の要素しかない場合、この存在する側の要素（ｂ，ｑ）或いは（−ｂ，ｑ’）の最初の成分をｂ’とすると、Ｕの固有値で、実部が±ａとなるものの虚部はｂ’だけであることがわかる（虚部が−ｂ’というものはない）。よって、Ｕの固有値で実部が±ａとなるものについて、ａ＋ｂ’・ｉがｐ個、−ａ＋ｂ’・ｉがｐ’個存在することがわかる。
これまでの処理によって固有値が決定できていないものは、リストＡ’に（ａ，ｂ，ｐ），（−ａ，ｂ，ｐ’）（ａ≠０）という対があり、しかも、リストＢに（ｂ，ｑ），（−ｂ，ｑ’）（ｂ≠０）という対がある場合のみである。この場合、前述したリストＡ’とリストＢのみでは固有値を特定することができない。
【００１９】
図２は、この際になぜ固有値が特定できないのかを示した図である。
まず、ｉ・Ｕの固有値は、Ｕの固有値を角度９０°だけ回転させたものと一致する。よって、ユニタリ行列Ｕの固有値候補α１を９０°回転させたもの（ｉ・Ｕの固有値）の実部と、ユニタリ行列Ｕの他の固有値候補α２を９０°回転させたもの（ｉ・Ｕの固有値）の実部とが一致する場合、ｉ・Ｕ＋（ｉ・Ｕ）＊の固有値から、これらの固有値候補α１，α２を区別することができない。なお、固有値候補とは、リストＡ’及びリストリストＢの実部，虚部のすべての組み合わせを意味する。
【００２０】
図２は、このことを説明するための図である。この図は、ユニタリ行列Ｕの固有値の実部と虚部を示した図であり、横軸は実部を示す実軸であり、縦軸は虚部を示す虚軸である。
図２は、ユニタリ行列Ｕの固有値候補ａｋ±ｂｋ・ｉを１８０°回転させたものが、他の固有値候補ａｊ±ｂｊ・ｉと一致する場合を示している。このような状況は、リストＡ’に（ａ，ｂ，ｐ），（−ａ，ｂ，ｐ’）（ａ≠０）という対があり、しかも、リストＢに（ｂ，ｑ），（−ｂ，ｑ’）（ｂ≠０）という対がある場合に生じる。
【００２１】
この場合、ユニタリ行列Ｕの固有値候補ａｋ−ｂｋ・ｉを９０°回転させたものの実部ａは、他の固有値候補−ａｊ＋ｂｊ・ｉを９０°回転させたものの実部ａと一致する。そのため、ｉ・Ｕ＋（ｉ・Ｕ）＊の固有値が−２ａとして求められたとしても、これが固有値候補ａｋ−ｂｋ・ｉに対応するものか、他の固有値候補−ａｊ＋ｂｊ・ｉに対応するものかを区別することができず、Ｕの固有値を特定することもできない。
以上より、このようなときはさらにユニタリ行列Ｗ＝ｉ・Ｕ２を図１の固有値計算装置１０に入力し、それぞれのリストを得る。
【００２２】
すなわち、エルミート行列算出部１１に、ユニタリＷが入力され、エルミート行列算出部１１は、ユニタリＷとその共役転置行列Ｗ＊との和であるエルミート行列Ｖ’’＝Ｗ＋Ｗ＊を算出し、出力する。次に、エルミート行列固有値算出部１２にエルミート行列Ｖ’’＝Ｗ＋Ｗ＊が入力され、エルミート行列固有値算出部１２は、エルミート行列Ｖ’’＝Ｗ＋Ｗ＊に対し、エルミート行列の固有値を求める公知のルーチンを適用し、エルミート行列Ｖ’’＝Ｗ＋Ｗ＊の固有値を求める。
ここで、ユニタリ行列は正規行列なので、ユニタリ行列の可換性より、ユニタリ行列Ｗの固有値の実部をａｕとし虚部ｂｕとすると、エルミート行列Ｖ’’＝Ｗ＋Ｗ＊の固有値は−４ａγ・ｂγとなる。なお、ここでは、固有値に重複度がある場合でも、その同じ固有値を重複度分並べている。
【００２３】
算出されたエルミート行列Ｖ’’＝Ｗ＋Ｗ＊の固有値−４ａγ・ｂγは、リスト生成部１３に送られる。リスト生成部１３は、まず、送られたエルミート行列Ｖ’’＝Ｗ＋Ｗ＊の固有値−４ａγ・ｂγのうち共通する値をまとめ、固有値−４ａｇ・ｂｇ（１≦ｇ≦ｗ，１≦ｗ≦ｎ）とその重複度ｒｇとの対を生成する。さらに、この固有値−４ａｇ・ｂｇを−（１／４）倍し、ａｇ・ｂｇとその重複度ｒｇとの対からなるリストＣ＝［（ａｇ・ｂｇ，ｒｇ）］を作成する。
その後、リストＡ’から（ａ，ｂ，ｐ）と（−ａ，ｂ，ｐ’）、リストＢから（ｂ，ｑ）、リストＣから（ａｂ，ｒ）を抽出する。ここで、ユニタリ行列Ｕの固有値ａ＋ｂ・ｉ，ａ−ｂ・ｉ，−ａ＋ｂ・ｉ，−ａ−ｂ・ｉの重複度をそれぞれｍ１，ｍ２，ｍ３，ｍ４とおくと、（ａ，ｂ，ｐ）と（−ａ，ｂ，ｐ’）からｍ１＋ｍ２＝ｐ，ｍ３＋ｍ４＝ｐ’となることがわかり、（ｂ，ｑ）からｍ１＋ｍ３＝ｑとなることがわかり、（ａｂ，ｒ）からｍ１＋ｍ４＝ｒとなることがわかる。
【００２４】
これから、ｓ＝（−ｐ’＋ｑ＋ｒ）／２とおくと、
ｍ１＝ｓ
ｍ２＝ｐ−ｓ
ｍ３＝ｑ−ｓ
ｍ４＝ｒ−ｓ
と重複度が求まる。これにより、ユニタリ行列Ｕの固有値として、ａ＋ｂ・ｉがｍ１個、、ａ−ｂ・ｉがｍ２個、−ａ＋ｂ・ｉがｍ３個、−ａ−ｂ・ｉがｍ４個存在することがわかる。
【００２５】
＜具体的な構成＞
次に、本形態の具体的な構成について例示する。
図３は、本形態における固有値計算装置１００の構成を例示したブロック図である。
図３に例示するように、この例の固有値計算装置１００は、ＣＰＵ（Central Processing Unit）１１０、入力部１２０、出力部１３０、ハードディスク装置１４０、ＲＡＭ（Random Access Memory）１５０、ＲＯＭ（Read Only Memory）１６０及びバス１７０を有している。
【００２６】
ＣＰＵ１１０は、入力された各種プログラムに従って様々な演算処理を実行するプロセッサであり、レジスタ１１１が接続されている。入力部１２０は、データが入力される入力ポート、キーボード、マウス等であり、出力部１３０は、データを出力する出力ポート、ディスプレイ等である。ハードディスク装置１４０は、windows（登録商標）等のＯＳ（Operating System）プログラムを格納するＯＳプログラム領域１４１、本形態の固有値計算を実行するための固有値計算プログラムを格納した固有値計算プログラム領域１４２を有している。また、ＲＡＭ１５０は、ＯＳプログラムを格納する固有値計算プログラム領域１５２、固有値計算プログラムを格納する固有値計算プログラム領域１５２及び固有値を求めるユニタリ行列Ｕを格納したデータ領域１５３を有している。また、バス１７０は、ＣＰＵ１１０、入力部１２０、出力部１３０、ハードディスク装置１４０、ＲＡＭ１５０及びＲＯＭ１６０を通信可能に接続している。
【００２７】
図４は、本形態における固有値計算プログラム２００の構成を例示した概念図である。この図に例示するように、固有値計算プログラム２００は、エルミート行列算出プログラム２０２、エルミート行列固有値算出プログラム２０３、第１〜３の判定プログラム２１１〜２１３、第１〜４のリスト生成プログラム２２１〜２２４、固有値要素生成プログラム２３１及び積演算プログラム２４１を有している。ここで、エルミート行列固有値算出プログラム２０３としては、例えば、数値計算ソフトウェアＭＡＴＬＡＢ（登録商標）が有するエルミート行列の固有値を求めることが可能なプログラム等を用いることができる。なお、エルミート行列固有値算出プログラム２０３のルーチンとしては、例えば、エルミート行列をHouseholder変換やLanczosの方法等を用いて三重対角行列（三重対角エルミート行列）に変換し、それにQR法やSturm法を適用してその固有値を求めるルーチンを例示できる（例えば、非特許文献１，２や伊理正夫、藤野和建著，「数値計算の常識」，共立出版，１９８５等参照。）。
【００２８】
＜具体的な処理＞
次に、本形態の具体的な処理について例示する。
図５〜７は、本形態における固有値要素生成処理を説明するためのフローチャートである。以下、これらの図に沿って本形態の固有値要素生成処理について説明していく。
まず、ＣＰＵ１１０は、ハードディスク装置１４０のＯＳプログラム領域１４１のＯＳプログラム、及び固有値計算プログラム領域１４２の固有値計算プログラム２００を読み出し、これらをＲＡＭ１５０のＯＳプログラム領域１５１及び固有値計算プログラム領域１５２に格納する。次に、ＣＰＵ１１０は、ＲＡＭ１５０のＯＳプログラム領域１５１からＯＳプログラムを順次読み出しこれを実行した上で、固有値計算プログラム領域１４２から第１の判定プログラム２１１を読み出し実行する。この第１の判定プログラム２１１が読み込まれたＣＰＵ１１０（第１の判定手段）は、ＲＡＭ１５０のデータ領域１５３からユニタリ行列Ｕを読み込み（入力）、当該ユニタリ行列Ｕが実行列であるか否かを判定する（ステップＳ１）。
【００２９】
ここで、ユニタリ行列Ｕが実行列であると判定された場合、ＣＰＵ１１０は、Ｕ＋ｔＵの固有値を１／２倍したもののリストＡ（固有値の１／２倍と重複度の対）を作成する（ステップＳ２）。すなわち、まずＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２からエルミート行列算出プログラム２０２を読み出して実行する。このエルミート行列算出プログラム２０２が読み込まれたＣＰＵ１１０（第１のエルミート行列算出手段）には、レジスタ１１１から読み出されたユニタリ行列Ｕが入力され、このＣＰＵ１１０は、当該ユニタリ行列Ｕとその共役転置行列である第１の共役転置行列Ｕ＊（＝ｔＵ／Ｕが実であるため）との和である第１のエルミート行列Ｕ＋Ｕ＊を算出してレジスタ１１１に出力、格納する。次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２からエルミート行列固有値算出プログラム２０３を読み出して実行する。このエルミート行列固有値算出プログラム２０３が読み込まれたＣＰＵ１１０（第１のエルミート行列固有値算出手段）には、レジスタ１１１から第１のエルミート行列Ｕ＋Ｕ＊が入力され、このＣＰＵ１１０は、当該第１のエルミート行列Ｕ＋Ｕ＊の固有値である第１の固有値を算出してレジスタ１１１に対して出力、格納する。次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から第１のリスト生成プログラム２２１を読み込んで実行する。この第１のリスト生成プログラム２２１が読み込まれたＣＰＵ１１０（第１のリスト生成手段）には、レジスタ１１１から第１の固有値が入力され、このＣＰＵ１１０は、当該第１の固有値を１／２倍してユニタリ行列Ｕの固有値の実部を算出し、算出したユニタリ行列Ｕの固有値の実部ａｊ（１≦ｊ≦ｕ，１≦ｕ≦ｎ，当該ユニタリ行列Ｕはｎ×ｎ行列）とその重複度ｐｊとの対からなる第１のリストＡ＝［（ａｊ，ｐｊ）］を生成してレジスタ１１１に対して出力、格納する。
【００３０】
以上のようにリストＡが生成されると、次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から第２のリスト生成プログラム２２２を読み出して実行する。この第２のリスト生成プログラム２２２が読み込まれたＣＰＵ１１０（第２のリスト生成手段）には、レジスタ１１１から第１のリストＡ＝［（ａｊ，ｐｊ）］が入力される。そして、このＣＰＵ１１０は、リストＡの実部ａｊが±１でないとき、この実部ａｊから平方根ｂｊ＝√（１−（ａｊ）２）を算出し、第１のリストＡ＝［（ａｊ，ｐｊ）］の要素（ａ，ｐ）を（（ａ＋ｂ・ｉ），ｐ／２）と（（ａ−ｂ・ｉ），ｐ／２）に置き換えた固有値リスト［（ａｊ＋ｂｊ・ｉ），ｐｊ／２］，［（ａｊ−ｂｊ・ｉ），ｐｊ／２］（ｉは虚数単位）を生成し、生成した当該固有値リストをバス１７０及び出力部１３０を通じ出力して処理を終了する（ステップＳ３）。
【００３１】
一方、ステップ１においてユニタリ行列Ｕが実行列でないと判定された場合、ＣＰＵ１１０は、Ｕ＋Ｕ＊の固有値を１／２倍したもののリストＡ（固有値の１／２倍と重複度の対）を作成し、レジスタ１１１に格納する（ステップＳ４）。なお、この詳細はｔＵがＵ＊に置き換わる以外は、上述したステップ２の処理と同様である。
次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から第２のリスト生成プログラム２２２を読み出して実行する。この第２のリスト生成プログラム２２２が読み込まれたＣＰＵ１１０（第２のリスト生成手段）には、レジスタ１１１から第１のリストＡ＝［（ａｊ，ｐｊ）］が入力され、このＣＰＵ１１０は、第１のリストＡの実部ａｊから平方根ｂｊ＝√（１−（ａｊ）２）を算出し、第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］を生成し、生成した当該第２のリストＡ’をレジスタ１１１（リストメモリ）に対して出力、格納する（ステップＳ５）。
【００３２】
次に、ＣＰＵ１１０は、ｉ・Ｕ＋（ｉ・Ｕ）＊の固有値を−１／２倍したもののリストＢ（固有値の−１／２倍と重複度の対）を作成する（ステップＳ６）。すなわち、まず、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から積演算プログラム２４１を読み出して実行する。この積演算プログラム２４１が読み込まれたＣＰＵ１１０（第１の積演算手段）には、レジスタ１１１からユニタリ行列Ｕと虚数単位ｉ（事前にレジスタ１１１に格納）が入力され、このＣＰＵ１１０は、当該ユニタリ行列Ｕと虚数単位ｉとの積ｉ・Ｕを算出し、この積ｉ・Ｕをレジスタ１１１に対して出力、格納する。次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２からエルミート行列算出プログラム２０２を読み込んで実行する。このエルミート行列算出プログラム２０２が読み込まれたＣＰＵ１１０（第２のエルミート行列算出手段）には、レジスタ１１１から積ｉ・Ｕが入力され、このＣＰＵ１１０は、当該積ｉ・Ｕとその共役転置行列である第２の共役転置行列（ｉ・Ｕ）＊との和である第２のエルミート行列ｉ・Ｕ＋（ｉ・Ｕ）＊を算出してレジスタ１１１に出力、格納する。次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２からエルミート行列固有値算出プログラム２０３を読み込んで実行する。このエルミート行列固有値算出プログラム２０３が読み込まれたＣＰＵ１１０（第２のエルミート行列固有値算出手段）には、レジスタ１１１から第２のエルミート行列ｉ・Ｕ＋（ｉ・Ｕ）＊が入力され、このＣＰＵ１１０は、当該第２のエルミート行列ｉ・Ｕ＋（ｉ・Ｕ）＊の固有値である第２の固有値を算出して、レジスタ１１１に出力、格納する。次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から第３のリスト生成プログラム２２３を読み込んで実行する。この第３のリスト生成プログラム２２３が読み込まれたＣＰＵ１１０（第３のリスト生成手段）には、レジスタ１１１から第２の固有値が入力される。そして、このＣＰＵ１１０は、当該第２の固有値を−１／２倍してユニタリ行列Ｕの固有値の虚部ｂｋ（１≦ｋ≦ｖ，１≦ｖ≦ｎ，当該ユニタリ行列はｎ×ｎ行列）を算出し、算出した当該虚部ｂｋとその重複度ｑｋとの対からなる第３のリストＢ＝［（ｂｋ，ｑｋ）］を生成し、生成した当該第３のリストＢをレジスタ１１１（リストメモリ）に対して出力、格納する。
【００３３】
次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から第２の判定プログラム２１２を読み出して実行する。この第２の判定プログラム２１２が読み込まれたＣＰＵ１１０（第２の判定手段）は、レジスタ１１１（リストメモリ）内の第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］からまだ調べていない１つの要素（ａ，ｂ，ｐ）を抽出してレジスタ１１１に格納し（ステップＳ７）、ａ＝０であるか否か及び当該第２のリストＡ’に要素（−ａ，ｂ，ｐ’）が存在するか否かを判定する（ステップＳ８）。
ここで、ａ＝０或いは要素（−ａ，ｂ，ｐ’）が第２のリストＡ’に存在しないと判定された場合、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から固有値要素生成プログラム２３１を読み出して実行する。この固有値計算プログラム領域１５２が読み込まれたＣＰＵ１１０（固有値要素生成手段）には、レジスタ１１１から要素（ａ，ｂ，ｐ）が入力される。また、このＣＰＵ１１０は、レジスタ１１１内の第３のリストＢ＝［（ｂｋ，ｑｋ）］から、要素（ｂ，ｑ）と要素（−ｂ，ｑ’）とを抽出し、（ａ＋ｂ・ｉ，ｑ）及び（ａ−ｂ・ｉ，ｑ’）を生成してレジスタ１１１に対して出力し、これらをレジスタ１１１の要素（ａ，ｂ，ｐ）と置き換える。また、第３のリストＢ＝［（ｂｋ，ｑｋ）］に要素（ｂ，ｑ）或いは要素（−ｂ，ｑ’）の一方しか存在しなかった場合は、ＣＰＵ１１０は、レジスタ１１１内の第３のリストＢ＝［（ｂｋ，ｑｋ）］から、要素（ｂ，ｑ）或いは要素（−ｂ，ｑ’）の一方のみを抽出し、（ａ＋ｂ・ｉ，ｑ）（要素（ｂ，ｑ）が存在した場合）或いは（ａ−ｂ・ｉ，ｑ’）（要素（−ｂ，ｑ’）が存在した場合）を生成してレジスタ１１１に対して出力し、これをレジスタ１１１の要素（ａ，ｂ，ｐ）と置き換える（ステップＳ９）。
【００３４】
一方、ステップＳ８において、要素（−ａ，ｂ，ｐ’）（ａ≠０）が第２のリストＡ’に存在すると判定された場合、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から第３の判定プログラム２１３を読み出して実行する。この第３の判定プログラム２１３が読み込まれたＣＰＵ１１０（第３の判定手段）は、ステップＳ８で抽出された要素（ａ，ｂ，ｐ）をレジスタ１１１から読み出し、ｂ＝０であるか否か、及びレジスタ１１１内の第３のリストＢ＝［（ｂｋ，ｑｋ）］に要素（ｂ，ｑ）と要素（−ｂ，ｑ’）とが共に存在するか否かを判定する（ステップＳ１０）。
【００３５】
ここで、第３のリストＢ＝［（ｂｋ，ｑｋ）］に要素（ｂ，ｑ）（ｂ≠０）と要素（−ｂ，ｑ’）とが共に存在すると判断された場合、後述するステップＳ１２を実行する。
一方、ｂ＝０であると判定された場合、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から固有値要素生成プログラム２３１を読み出して実行する。この固有値計算プログラム領域１５２が読み込まれたＣＰＵ１１０（固有値要素生成手段）には、要素（ａ，ｂ，ｐ）及び（−ａ，ｂ，ｐ’）が入力され、このＣＰＵ１１０は、（ａ，ｐ）及び（−ａ，ｐ’）を生成してレジスタ１１１に出力し、これらを要素（ａ，ｂ，ｐ）及び（−ａ，ｂ，ｐ’）と置き換えて格納する。また、ステップＳ１０で第３のリストＢ＝［（ｂｋ，ｑｋ）］に要素（ｂ，ｑ）又は要素（−ｂ，ｑ’）の何れか一方しか存在しないと判定された場合、固有値計算プログラム領域１５２が読み込まれたＣＰＵ１１０（固有値要素生成手段）には、存在すると判定された側のｂ又は−ｂであるｂ’、並びに要素（ａ，ｂ，ｐ）及び（−ａ，ｂ，ｐ’）が入力され、このＣＰＵ１１０は、（ａ＋ｂ’・ｉ，ｐ）及び（−ａ＋ｂ’・ｉ，ｐ’）を生成してレジスタ１１１に出力し、これらを要素（ａ，ｂ，ｐ）及び（−ａ，ｂ，ｐ’）と置き換えて格納する（ステップＳ１１）。そして、このステップＳ１１が処理後、ステップＳ１２に進む。
【００３６】
ステップＳ１２では、第２の判定プログラム２１２が読み込まれたＣＰＵ１１０が、レジスタ１１１の第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］に、まだ調べていない要素が存在するか否かを判断する。これは、例えば、ステップＳ７で要素を抽出するたびにその要素にフラグをたてておき、そのフラグの有無を検索することによって行われる。また、ステップＳ７において、リストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］の先頭から順番に要素を抽出することとし、リストＡ’の最後の要素の抽出が行われたか否かによってこの判断を行ってもよい。
【００３７】
ここで、まだ調べていない要素が存在する場合にはステップＳ７に戻り、まだ調べていない要素が存在しない場合には、第２の判定プログラム２１２が読み込まれたＣＰＵ１１０が、リストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］に置き換えが行われていない要素が存在するか否かを判断する。この判断は、例えば、要素の置き換えを行うたびに、その要素にフラグをたてておき、そのフラグの有無を検索することによって行われる。
ここで、置き換えられていない要素が存在しないと判断された場合、ＣＰＵ１１０は、各要素が置き換えられたレジスタ１１１のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］をバス１７０及び出力部１３０を通じて出力し、処理を終了する。
【００３８】
一方、まだ置き換えられていない要素が存在すると判断された場合、ＣＰＵ１１０は以下の処理を実行する。なお、以下の処理は、ステップＳ１０において、第３のリストＢ＝［（ｂｋ，ｑｋ）］に要素（ｂ，ｑ）（ｂ≠０）と要素（−ｂ，ｑ’）とが共に存在すると判定された場合の処理に相当する。
まず、Ｗ＝ｉ・Ｕ２とし、Ｗ＋Ｗ＊の固有値を−１／４倍したもののリストＣ（固有値の−１／４倍と重複度の対）を作成する（ステップＳ１４）。すなわち、まず、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から積演算プログラム２４１を読み出して実行する。この積演算プログラム２４１が読み込まれたＣＰＵ１１０（第２の積演算手段）には、レジスタ１１１から積ｉ・Ｕとユニタリ行列Ｕとが入力され、このＣＰＵ１１０は、当該ユニタリ行列Ｕと当該積ｉ・Ｕとの積ｉ・Ｕ２を算出して、レジスタ１１１に出力、格納する。次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２からエルミート行列算出プログラム２０２を読み込んで実行する。このエルミート行列算出プログラム２０２が読み込まれたＣＰＵ１１０（第３のエルミート行列算出手段）には、レジスタ１１１から積ｉ・Ｕ２が入力され、このＣＰＵ１１０は、当該積ｉ・Ｕ２とその共役転置行列である第３の共役転置行列（ｉ・Ｕ２）＊との和である第３のエルミート行列ｉ・Ｕ２＋（ｉ・Ｕ２）＊を算出して、レジスタ１１１に出力、格納する。次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２からエルミート行列固有値算出プログラム２０３を読み込んで実行する。このエルミート行列固有値算出プログラム２０３が読み込まれたＣＰＵ１１０（第３のエルミート行列固有値算出手段）には、レジスタ１１１から第３のエルミート行列ｉ・Ｕ２＋（ｉ・Ｕ２）＊が入力され、このＣＰＵ１１０は、当該第３のエルミート行列ｉ・Ｕ２＋（ｉ・Ｕ２）＊の固有値である第３の固有値を算出してレジスタ１１１に出力、格納する。次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から第４のリスト生成プログラム２２３を読み込んで実行する。この第４のリスト生成プログラム２２３が読み込まれたＣＰＵ１１０（第４のリスト生成手段）には、レジスタ１１１から第３の固有値が入力される。そして、このＣＰＵ１１０は、当該第３の固有値を−１／４倍してユニタリ行列Ｕの固有値の実部ａｇ（１≦ｇ≦ｗ，１≦ｗ≦ｎ）と虚部ｂｇとの積ａｇ・ｂｇを算出し、算出した当該積ａｇ・ｂｇとその重複度ｒｇとの対からなる第４のリストＣ＝［（ａｇ・ｂｇ，ｒｇ）］を生成し、生成した当該第４のリストＣをレジスタ１１１（リストメモリ）に出力、格納する。
【００３９】
次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から固有値要素生成プログラム２３１を読み取り実行する。ここで固有値要素生成プログラム２３１が読み込まれたＣＰＵ１１０（固有値要素生成手段）は、まず、レジスタ１１１から、まだ置き換えられていない第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］から要素（ａ，ｂ，ｐ）と（−ａ，ｂ，ｐ’）との対を１つ抽出し（ステップＳ１５）、第３のリストＢ＝［（ｂｋ，ｑｋ）］から要素（ｂ，ｑ）を抽出し（ステップＳ１６）、第４のリストＣ＝［（ａｇ・ｂｇ，ｒｇ）］からａ・ｂに対応する要素（ａ・ｂ，ｒ）を抽出する（ステップＳ１７）。なお、ａ・ｂに対応する要素（ａ・ｂ，ｒ）が存在しない場合はｒ＝０とする。そして、このＣＰＵ１１０は、ｓ＝（−ｐ’＋ｑ＋ｒ）／２を算出し、（ａ＋ｂｉ，ｓ）、（ａ−ｂｉ，ｐ−ｓ）、（−ａ＋ｂｉ，ｑ−ｓ）及び（−ａ−ｂｉ，ｒ−ｓ）を生成し、生成した（ａ＋ｂｉ，ｓ）、（ａ−ｂｉ，ｐ−ｓ）、（−ａ＋ｂｉ，ｑ−ｓ）及び（−ａ−ｂｉ，ｒ−ｓ）をレジスタ１１１に出力し、第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］の（ａ，ｂ，ｐ）を（ａ＋ｂｉ，ｓ）と（ａ−ｂｉ，ｐ−ｓ）とに置き換え、（−ａ，ｂ，ｐ’）を（−ａ＋ｂｉ，ｑ−ｓ）と（−ａ−ｂｉ，ｒ−ｓ）とに置き換えてレジスタ１１１に格納する（ステップＳ１８）。なお、ここで重複度が０になったものは第２のリストＡ’から排除する。
【００４０】
次にＣＰＵ１１０は、レジスタ１１１を参照し、まだ置き換えられていない第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］の要素があるか否かを判断する（ステップＳ１９）。ここで、まだ置き換えられていない要素があると判断された場合にはステップＳ１５に戻り、置き換えられていない要素がないと判断された場合には、置き換えられた第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］をバス１７０及び出力部１３０を介して出力して処理を終了する。
次に、本形態の実施例を説明する。
【００４１】
＜実施例１＞
実施例１はユニタリ行列Ｕが実（直交行列）の場合の例である。この場合、ステップＳ１（図５）ではＹＥＳと判断され、ステップＳ２に進む。ここで、Ｕが以下のような直交行列である場合、
【００４２】
【数１】
2006139575.tif 000003
なお、実際には、Ｕ＋ｔＵを計算するためにｔＵを計算したり、１６個の成分をすべての計算したりする必要はなく、δ１≦δ２を満たすＵの（δ１，δ２）成分と（δ２，δ１）成分の和を、ε１≦ε２を満たすＵ＋ｔＵの（ε１，ε２）成分（右上部分）として求め、それを転置したものをＵ＋ｔＵの左下成分（ε１≧ε２）とすればよい。もちろん、ｔＵを計算し、Ｕ＋ｔＵの成分をすべての計算してもよい。
【００４３】
このＵ＋ｔＵをエルミート行列の固有値を求めるルーチン（あるいは、実対称行列の固有値を求めるルーチン) にかけると、１．７３６４６６８と−０．５１７９０６８２という２つの二重根が返ってくる。よって、ステップＳ２で生成されるリストＡは、
［（０．８６８２３３４０，２），（−０．２５８９５３４１，２）］
となる。
そして、これからステップＳ３において、
［（０．８６８２３３４０＋０．４９６１５５９８・ｉ，１），（０．８６８２３３４０−０．４９６１５５９８・ｉ，１），（−０．２５８９５３４１＋０．９６５８８９８１・ｉ，１），（−０．２５８９５３４１−０．９６５８８９８１・ｉ，１）］
という固有値のリストが生成され出力される。
【００４４】
＜実施例２＞
実施例１はユニタリ行列Ｕが虚の場合（直交行列でない場合）の例である。この場合、ステップＳ１（図５）ではＮＯと判断され、ステップＳ４（図６）に進む。ここで、Ｕが以下のようなユニタリ行列である場合、
【００４５】
【数２】
2006139575.tif 000004
なお、実際には、Ｕ＋Ｕ＊を計算するためにＵ＊を計算したり、９個の成分をすべての計算したりする必要はなく、δ１≦δ２を満たすＵの（δ１，δ２）成分と（δ２，δ１）成分の複素共役との和を、ε１≦ε２を満たすＵ＋Ｕ＊の（ε１，ε２）成分（右上部分）として求め、それを複素共役転置したものをＵ＋Ｕ＊の左下成分（ε１≧ε２）とすればよい。もちろん、Ｕ＊を計算し、Ｕ＋Ｕ＊の成分をすべての計算してもよい（以下同様）。
【００４６】
このＵ＋Ｕ＊をエルミート行列の固有値を求めるルーチンにかけると、１．８５７９０８９，−０．３７９００８６０，−１．０７９０５３９０という単根が返ってくる。よって、ステップＳ４で生成されるリストＡは、
［（０．９２８９５４４５，１），（−０．１８９５０４３０，１），（−０．５３９５２６９５，１）］
となり、ステップＳ５で生成されるリストＡ’は、
［（０．９２８９５４４５，０．３７０１９４０４，１），（−０．１８９５０４３０，０．９８１８７９８９，１），（−０．５３９５２６９５，０．８４１９６８３３，１）］
となる。
【００４７】
次に、ステップＳ６において、Ｖ＝ｉ・Ｕに対して同様な計算を行うと以下のようになる。
【数３】
2006139575.tif 000005
ここでも前と同様に、Ｖ＊を計算したり、Ｖ＋Ｖ＊の全ての成分を計算したりする必要はない。
このＶ＋Ｖ＊エルミート行列の固有値を求めるルーチンにかけると、−１．６８３９３６７，１．９６３７５９８，０．７４０３８８０８という単根が返ってくる。
【００４８】
これから，ステップＳ６で生成されるリストＢは、
［（０．８４１９６８３５，１），（−０．９８１８７９９０，１），（−０．３７０１９４０４，１）］
となる。
ここでリストＡ’には（ａ，ｂ，ｍ）と（−ａ，ｂ，ｍ’）という形の対はないため、リストＡ’の要素は全てステップＳ９で処理され、リストＢを用いて、Ｕの固有値のリスト
［（０．９２８９５４４５−０．３７０１９４０４・ｉ，１），（−０．１８９５０４３０−０．９８１８７９９０・ｉ，１），（−０．５３９５２６９５＋０．８４１９６８３３・ｉ，１）］
が求まる。
【００４９】
＜実施例３＞
最後に、ユニタリ行列Ｕが虚の場合（直交行列でない場合）であって、Ｕ＋Ｕ＊が絶対値の等しい符号が反対である固有値を持つ場合の例について説明する。
この場合、ステップＳ１（図５）ではＮＯと判断され、ステップＳ４（図６）に進む。ここで、Ｕが以下のようなユニタリ行列である場合、
【００５０】
【数４】
2006139575.tif 000006
なお、実際には、Ｕ＋Ｕ＊を計算するためにＵ＊を計算したり、９個の成分をすべての計算したりする必要はなく、δ１≦δ２を満たすＵの（δ１，δ２）成分と（δ２，δ１）成分の複素共役との和を、ε１≦ε２を満たすＵ＋Ｕ＊の（ε１，ε２）成分（右上部分）として求め、それを複素共役転置したものをＵ＋Ｕ＊の左下成分（ε１≧ε２）とすればよい。
【００５１】
このＵ＋Ｕ＊をエルミート行列の固有値を求めるルーチンにかけると、−１．２００００００，０．５６００００００，１．２００００００という単根が返ってくる。よって、ステップＳ４で生成されるリストＡは、
［（−０．６０００００００，１），（０．２８００００００，１），（０．６０００００００，１）］
となり、ステップＳ５で生成されるリストＡ’は、
［（−０．６０００００００，０．８０００００００，１），（０．２８００００００，０．９６００００００，１），（０．６０００００００，０．８０００００００，１）］
となる。
次に、ステップＳ６において、Ｖ＝ｉ・Ｕに対して同様な計算を行うと以下のようになる。
【００５２】
【数５】
2006139575.tif 000007
ここでも前と同様に、Ｖ＊を計算したり、Ｖ＋Ｖ＊の全ての成分を計算したりする必要はない。
このＶ＋Ｖ＊エルミート行列の固有値を求めるルーチンにかけると、１．６００００００，−１．９２０００００，−１．６００００００という単根が返ってくる。
【００５３】
これから，ステップＳ６で生成されるリストＢは、
［（−０．８０００００００，１），（０．９６００００００，１），（０．８０００００００，１）］
となる。
その後、ステップＳ７以降の処理が行われるが、リストＡ’の要素（０．２８００００００，０．９６００００００，１）については、ステップＳ９の処理が行われる。そして、リストＢの要素（０．９６００００００，１）を用い、リストＡ’の要素（０．２８００００００，０．９６００００００，１）が（０．２８００００００＋０．９６００００００・ｉ，１）に置き換えられる。その結果、この段階でリストＡ’は、
［（−０．６０００００００，０．８０００００００，１），（０．２８００００００＋０．９６００００００・ｉ，１），（０．６０００００００，０．８０００００００，１）］
となる。
【００５４】
また、リストＡ’の要素（−０．６０００００００，０．８０００００００，１），（０．６０００００００，０．８０００００００，１）の対に対しては、リストＢに（−０．８０００００００，１）と（０．８０００００００，１）の要素が存在するため（ステップＳ１０）処理されず、この時点ではそのままとなる。
そして、置き換えのできなかったＡ’の要素があるため、ステップＳ１３の判断がＹＥＳとなりステップＳ１４（図７）に進む。
ステップＳ１４では、Ｗ＝Ｖ・Ｕに対して同様の計算を行うと以下のようになる。
【００５５】
【数６】
2006139575.tif 000008
ここでも前と同様、Ｗ＊を計算したり、Ｗ＋Ｗ＊のすべての成分を計算したりする必要はない。
このＷ＋Ｗ＊をエルミート行列の固有値を求めるルーチンにかけると、単根−１．０７５２０００と、二重根−１．９２０００００が返ってくる。これから、ステップＳ１４で求まるリストＣは、
［（０．２６８８００００，１），（０．４８００００００，２）］
となる。
【００５６】
次に、リストＡ’から、まだ置き換えていない対（ａ，ｂ，ｐ），（−ａ，ｂ，ｐ’）をとる（ステップＳ１５）。ここで置き換えていない対は、ただ一組（−０．６０００００００，０．８０００００００，１），（０．６０００００００，０．８０００００００，１）だけである。すなわち、ｐ＝１，ｐ’＝１である。
リストＢには（０．８０００００００，１），（−０．８０００００００，１）があるため、ステップＳ１６では、（ｂ，ｑ）として（０．６０００００００，０．８０００００００，１）が抽出されｑ＝１となる。
【００５７】
またａｂ＝−０．４８００００００であるが、リストＣ
［（０．２６８８００００，１），（０．４８００００００，２）］
には（−０．４８００００００，ｒ）に合致するものが存在しないため、ｒ＝０となる（ステップＳ１７）。
よって、ｓ＝（−ｐ’＋ｑ＋ｒ）／２＝０、ｐ−ｓ＝１、ｒ−ｓ＝０となり、
（−０．６０００００００，０．８０００００００，１）
は、
（−０．６０００００００−０．８０００００００・ｉ，１）
に、
（０．６０００００００，０．８０００００００，１）
は、
（０．６０００００００＋０．８０００００００・ｉ，１）
に置き換えられ（ステップＳ１８）、リストＡ’は、
［（−０．６０００００００−０．８０００００００・ｉ，１），（０．２８００００００＋０．９６００００００・ｉ，１），（０．６０００００００＋０．８０００００００・ｉ，１）］
となって処理が終了する。
【００５８】
〔第２の実施の形態〕
次に、本発明における第２の実施の形態について説明する。
本形態は、エルミート行列の固有値を求めるルーチンを高々二回しか使わない手法である。なお、以下では第１の実施の形態との相違点を中心に説明する。
＜原理＞
まず、本形態の原理について説明する。
本形態の基本的な構成は図１の固有値計算装置１０と同様である。
【００５９】
［Ｕが実の場合］
ユニタリ行列Ｕが実の場合の処理は、第１の実施の形態と全く同じである。
［Ｕが複素の場合］
ユニタリ行列Ｕが複素の場合、まず、第１の実施の形態と同じくＵ＋Ｕ＊の固有値を求める。
まず、第１の実施の形態と同様、固有値計算装置１０にユニタリ行列Ｕが入力され、Ｕが実の場合と同様にリストＡ＝［（ａｊ，ｐｊ）］が生成される。また、ｂｊ＝√（１−ａｊ２）によって虚部ｂｊを求め、三つ組みのリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］を生成する。
【００６０】
ここで、もしリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］に、（ａ，ｂ，ｐ），（−ａ，ｂ，ｐ’）（ａ≠０，±１）という対がなければ、第１の実施の形態で述べた通り、ｉ・Ｕに対し、ｉ・Ｕ＋（ｉ・Ｕ）＊の固有値を求めることにより、Ｕのすべての固有値の虚部が決まる。この処理は第１の実施の形態と同様であるため説明を省略する。
以下では、第１の実施の形態との相違点である、リストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］に（ａ，ｂ，ｐ），（−ａ，ｂ，ｐ’）（ａ≠０，±１）という対がある場合の処理について説明する。
【００６１】
ユニタリ行列Ｕに絶対値が１の複素数β＝ｅｘｐ（ｉ・θ）を掛けたβ・Ｕもユニタリ行列である。本形態では、このユニタリ行列β・Ｕを固有値計算装置１０に入力し、新たなリストを得る。ただし、この場合、任意にとったユニタリ行列Ｕの固有値候補ａｊ±ｂｊ・ｉ（とり得る固有値の値）に対し、それを２θ回転させたものが、他の固有値候補と重ならないようにθを選択しなければならない。以下、この理由を説明する。
まず、β・Ｕの固有値は、Ｕの固有値を角度θだけ回転させたものと一致する。よって、ユニタリ行列Ｕの固有値候補α１をθ回転させたもの（β・Ｕの固有値）の実部と、ユニタリ行列Ｕの他の固有値候補α２をθ回転させたもの（β・Ｕの固有値）の実部とが一致したのでは、β・Ｕ＋（β・Ｕ）＊の固有値から、これらの固有値候補α１，α２を区別することができない。
【００６２】
図８は、このことを説明するための図である。この図は、ユニタリ行列Ｕの固有値の実部と虚部を示した図であり、横軸は実部を示す実軸であり、縦軸は虚部を示す虚軸である。
図８は、ユニタリ行列Ｕの固有値候補ａｋ±ｂｋ・ｉを２θ回転させたものが、他の固有値候補ａｊ±ｂｊ・ｉと一致する場合を示している。この場合、ユニタリ行列Ｕの固有値候補ａｋ−ｂｋ・ｉをθ回転させたものの実部ａは、他の固有値候補ａｊ＋ｂｊ・ｉをθ回転させたものの実部ａと一致する。そのため、β・Ｕ＋（β・Ｕ）＊の固有値が２ａとして求められたとしても、これが固有値候補ａｋ−ｂｋ・ｉに対応するものか、他の固有値候補ａｊ＋ｂｊ・ｉに対応するものかを区別することができず、Ｕの固有値を特定することもできない。
【００６３】
このような問題が生じない都合の良いθを決定する手法としては、以下のものを例示できる。
［ランダムに選択する方法］
第１の例は、絶対値１の複素数β＝ｅｘｐ（ｉ・θ）をランダムに発生させ、すべての固有値候補に対し、２θ回転で重なるものがあるか否か調べ、なければそのθを採用し，あれば改めてθを取り直す方法である。一般に固有値候補を２θ回転させたものが他の固有値候補と重なることはまれである。また、２θ回転で重なるものがあるか否か調べる処理量は、エルミート行列の固有値を求めるルーチンの処理量よりもかなり少ない。よって、このような方法でも第１の実施の形態よりも処理量を減らし、処理の高速化を図ることができる。
【００６４】
［固有値候補間の最小角よりも小さな２θを設定する方法］
第２の例は、固有値候補間の最小角よりも小さな２θを設定することにより、確実に好適なθを選択できる方法である。この場合、まず、虚部が正のすべての固有値候補ａ＋ｂ・ｉをａの大きい順に並び替える。これは、ａ＋ｂ・ｉを偏角の小さい順に並べるということに相当する。次に、隣り合うすべての対ａ＋ｂ・ｉとａ’＋ｂ’・ｉとからａ・ｂ’−ａ’・ｂを計算する。これは、ａ＋ｂ・ｉとａ’＋ｂ’・ｉの間の角の正弦の値を求めることに相当する。そして、これの最小値（重根はまとめてあつかうので０ということはない）の１／２をｍとおき、隣り合う対の間の最小の角をψとし、ｓｉｎθ＝ｍとすると、２θ＜ψを満たす。
【００６５】
なぜならば，θ≠０より、ｃｏｓθ＜１に注意すれば、
ｓｉｎ２θ＝２ｓｉｎθ・ｃｏｓθ＜２ｓｉｎθ＝２ｍ＝ｓｉｎψ
だからである。
すなわち、ｓｉｎθ＝ｍとなるθは好適なθである。そして、ｍ’＝√（１−ｍ２）とおき、β＝ｍ’＋ｍ・ｉとすることにより、上記のような角度の不都合がない絶対値１の複素数βを求めることができる。なお、この固有値候補間の最小角よりも小さな２θを設定する方法の処理量は、エルミート行列の固有値を求めるルーチンの処理量よりもかなり少ない。よって、このような方法でも第１の実施の形態よりも処理量を減らし、処理の高速化を図ることができる。
【００６６】
以上のように適切なβを設定した後、固有値計算装置１０（図１）のエルミート行列算出部１１に、ユニタリ行列β・Ｕが入力され、エルミート行列算出部１１は、当該ユニタリ行列β・Ｕとその共役転置行列（β・Ｕ）＊との和であるエルミート行列Ｖ’＝β・Ｕ＋（β・Ｕ）＊を算出し、出力する。次に、エルミート行列固有値算出部１２にエルミート行列Ｖ’＝β・Ｕ＋（β・Ｕ）＊が入力され、エルミート行列固有値算出部１２は、エルミート行列Ｖ’＝β・Ｕ＋（β・Ｕ）＊に対し、エルミート行列の固有値を求める公知のルーチンを適用し、エルミート行列Ｖ’’’＝β・Ｕ＋（β・Ｕ）＊の固有値を求める。ここで、固有値候補ａ＋ｂ・ｉ，ａ−ｂ・ｉをθ回転したものの実部はそれぞれａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍであるから、エルミート行列Ｖ’’’の固有値の実部は、ユニタリ行列Ｕの実部ａ、虚部ｂに対し、２（ａ・ｍ’−ｂ・ｍ）、２（ａ・ｍ’＋ｂ・ｍ）となる。なお、ここでは、固有値に重複度がある場合でも、その同じ固有値を重複度分並べている。
【００６７】
算出されたエルミート行列Ｖ’’’は、リスト生成部１３に送られる。リスト生成部１３は、まず、送られたエルミート行列Ｖ’’’の固有値のうち共通する値をまとめ、さらに、その固有値を１／２倍した値ｃｈ（１≦ｈ≦ｘ，１≦ｘ≦ｎ）とその重複度ｚｈとの対を生成し、それらからなるリストＤ＝［（ｃｈ，ｚｈ）］を生成する。
そして、前述のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］と、リストＤ＝［（ｃｈ，ｚｈ）］とを用い、ユニタリ行列の固有値の虚部を決定する。
＜具体的な構成＞
次に、本形態の具体的な構成について例示する。
【００６８】
本形態の固有値計算装置の構成は、図３に示した第１の実施の形態のものと同様である。ただし、固有値計算プログラムの構成のみが第１の実施の形態と相違する。
図９は、本形態における固有値計算プログラム３００の構成を例示した概念図である。この図に例示するように、固有値計算プログラム３００は、エルミート行列算出プログラム２０２、エルミート行列固有値算出プログラム２０３、第１，２の判定プログラム２１１，２１２、第１，５のリスト生成プログラム２２１，３２１、固有値要素生成プログラム２３１及び積演算プログラム２４１を有している。なお、固有値計算プログラム３００において第１の実施の形態と共通する事項については、図４と同じ符号を付した。
【００６９】
＜具体的な処理＞
次に、本形態の具体的な処理について例示する。
図１０〜１２は、本形態における固有値要素生成処理を説明するためのフローチャートである。以下、これらの図に沿って本形態の固有値要素生成処理について説明していく。なお、以下ではＵが虚の場合の処理についてのみ説明し、Ｕが実であるか否かの判断、Ｕの実の場合に行われる処理については第１の実施の形態と同様であるため、説明を省略する。
【００７０】
まず、ＣＰＵ１１０は、Ｕ＋Ｕ＊の固有値を１／２倍したものに係る第１のリストＡ＝［（ａｊ，ｐｊ）］（固有値の１／２倍と重複度の対）を作成し、レジスタ１１１に格納する（ステップＳ２０）。なお、この処理は、前述したステップ４の処理と同じである。
次に、ＣＰＵ１１０は、第１のリストの各要素（ａ，ｐ）に対し、平方根ｂ＝√（１−（ａ）２）を計算し、（ａ，ｐ）を（ａ，ｂ，ｐ）で置き換えた第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］を作成し、レジスタ１１１（リストメモリ）に格納する（ステップＳ２１）。なお、この処理は、前述したステップ５の処理と同じである。
【００７１】
次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から第２の判定プログラム２１２を読み出して実行する。第２の判定プログラム２１２が読み込まれたＣＰＵ１１０は、レジスタ１１１の第２のリストＡ’に要素（ａ，ｂ，ｐ）及び（−ａ，ｂ，−ｐ’）（ａ≠０，±１）という対があるか否かを判断する（ステップＳ２２）。
ここで、第２のリストＡ’に要素（ａ，ｂ，ｐ）及び（−ａ，ｂ，−ｐ’）（ａ≠０，±１）という対がないと判断された場合、ＣＰＵ１１０は、ｉ・Ｕ＋（ｉ・Ｕ）＊の固有値を−１／２倍したものの第３のリストＢ＝［（ｂｋ，ｑｋ）］（固有値の−１／２倍と重複度の対）を作成し、生成した当該第３のリストＢをレジスタ１１１（リストメモリ）に対して出力、格納する（ステップＳ２３）。なお、この処理は前述したステップＳ６と同様である。
【００７２】
次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から第２の判定プログラム２１２を読み出して実行する。この第２の判定プログラム２１２が読み込まれたＣＰＵ１１０（第２の判定手段）は、レジスタ１１１（リストメモリ）内の第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］からまだ調べていない１つの要素（ａ，ｂ，ｐ）を抽出してレジスタ１１１に格納する（ステップＳ２４）。
次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から固有値要素生成プログラム２３１を読み出して実行する。この固有値計算プログラム領域１５２が読み込まれたＣＰＵ１１０（固有値要素生成手段）には、レジスタ１１１から要素（ａ，ｂ，ｐ）が入力される。また、このＣＰＵ１１０は、レジスタ１１１内の第３のリストＢ＝［（ｂｋ，ｑｋ）］から、要素（ｂ，ｑ）と要素（−ｂ，ｑ’）とを抽出し、（ａ＋ｂ・ｉ，ｑ）及び（ａ−ｂ・ｉ，ｑ’）を生成してレジスタ１１１に対して出力し、これらをレジスタ１１１の要素（ａ，ｂ，ｐ）と置き換える。また、第３のリストＢ＝［（ｂｋ，ｑｋ）］に要素（ｂ，ｑ）或いは要素（−ｂ，ｑ’）の一方しか存在しなかった場合は、ＣＰＵ１１０は、レジスタ１１１内の第３のリストＢ＝［（ｂｋ，ｑｋ）］から、要素（ｂ，ｑ）或いは要素（−ｂ，ｑ’）の一方のみを抽出し、（ａ＋ｂ・ｉ，ｑ）（要素（ｂ，ｑ）が存在した場合）或いは（ａ−ｂ・ｉ，ｑ’）（要素（−ｂ，ｑ’）が存在した場合）を生成してレジスタ１１１に対して出力し、これをレジスタ１１１の要素（ａ，ｂ，ｐ）と置き換える（ステップＳ２５）。
【００７３】
次に、第２の判定プログラム２１２が読み込まれたＣＰＵ１１０が、レジスタ１１１の第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］に、まだ調べていない要素が存在するか否かを判断する。ここで、まだ調べていない要素が存在すると判断された場合にはステップＳ２４に戻り、調べていない要素が存在しないと判断された場合には、上述のように置き換えられた第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］がバス１７０及び出力部１３０を通じて出力し、処理を終了する。
一方、ステップＳ２２において、第２のリストＡ’に要素（ａ，ｂ，ｐ）及び（−ａ，ｂ，−ｐ’）（ａ≠０，±１）という対があると判断された場合、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から複素数設定プログラム３６２を読み出して実行する。なお、この例の複素数設定プログラム３６２は、前述の「固有値候補間の最小角よりも小さな２θを設定する方法」により好適な複素数βを生成するためのプログラムである。複素数設定プログラム３６２が読み込まれたＣＰＵ１１０（複素数設定手段）は、前述の「固有値候補間の最小角よりも小さな２θを設定する方法」に従い、複素数β＝ｍ’＋ｍ・ｉ（ｉは虚数単位、（ｍ’）２＋ｍ２＝１）を設定し、これをレジスタ１１１に出力して格納する。つまり、まず、このＣＰＵ１１０は、レジスタ１１１の第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］の要素（ａ，ｂ，ｐ）をａｊの大きさ順に並び替えた第６のリストＡ’’を生成し、これをレジスタ１１１に格納する（ステップＳ２７）。また、このＣＰＵ１１０は、レジスタ１１１内の第６のリストＡ’’の隣り合う要素（ａ，ｂ，ｐ）及び（ａ’，ｂ’，ｐ’）の全ての対に対してａ・ｂ’−ａ’・ｂを計算し、その最小値の１／２をｍとして算出し、ｍ’＝√（１−ｍ２）を算出し、複素数β＝ｍ’＋ｍ・ｉを設定し、これをレジスタ１１１に出力して格納する（ステップＳ２８）。
【００７４】
次に、ＣＰＵ１１０は、レジスタ１１１内の第６のリストＡ’’の要素（ａ，ｂ，ｐ）（ａ＝１，−１は除く）を（ａ，ｂ，ｐ，ａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍ）に置き換え、この第６のリストＡ’’をレジスタ１１１に格納する（ステップＳ２９）。
次に、ＣＰＵ１１０は、β・Ｕ＋（β・Ｕ）＊の固有値を１／２倍したもののリストＤ（固有値の１／２倍と重複度の対）を作成する（ステップＳ３０）。すなわち、まず、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から積演算プログラム２４１を読み出して実行する。この積演算プログラム２４１が読み込まれたＣＰＵ１１０（第３の積演算手段）には、レジスタ１１１からユニタリ行列Ｕと複素数βとが入力され、このＣＰＵ１１０は、当該ユニタリ行列Ｕと複素数βとの積β・Ｕを算出し、レジスタ１１１に出力して格納する。
【００７５】
次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２からエルミート行列算出プログラム２０２を読み込んで実行する。エルミート行列算出プログラム２０２が読み込まれたＣＰＵ１１０（第４のエルミート行列算出手段）には、レジスタ１１１から積β・Ｕが入力され、このＣＰＵ１１０は、当該積β・Ｕとその共役転置行列である第４の共役転置行列（β・Ｕ）*との和である第４のエルミート行列β・Ｕ＋（β・Ｕ）*を算出し、レジスタ１１１に出力、格納する。次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２からエルミート行列固有値算出プログラム２０３を読み出して実行する。エルミート行列固有値算出プログラム２０３が読み込まれたＣＰＵ１１０（第４のエルミート行列固有値算出手段）には、レジスタ１１１から第４のエルミート行列β・Ｕ＋（β・Ｕ）*が入力され、このＣＰＵ１１０は、当該第４のエルミート行列β・Ｕ＋（β・Ｕ）*の固有値である第４の固有値を算出し、レジスタ１１１に出力、格納する。次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から第５のリスト生成プログラム３２１を読み出して実行する。第５のリスト生成プログラム３２１が読み込まれたＣＰＵ１１０（第５のリスト生成手段）には、レジスタ１１１から第４の固有値が入力される。そして、このＣＰＵ１１０は、当該第４の固有値を１／２倍した値ｃｈ（１≦ｈ≦ｘ，１≦ｘ≦ｎ）を算出し、算出した当該値ｃｈとその重複度ｚｈとの対からなる第５のリストＤ＝［（ｃｈ，ｚｈ）］を生成し、生成した当該第５のリストＤをレジスタ１１１（リストメモリ）に出力、格納する。
【００７６】
次に、ＣＰＵ１１０は、ＲＡＭ１５０の固有値計算プログラム領域１５２から固有値要素生成プログラム２３１を読み込んで実行する。固有値要素生成プログラム２３１が読み込まれたＣＰＵ１１０（固有値要素生成手段）は、まず、レジスタ１１１からまだ調べていない第６のリストＡ’’の要素（ａ，ｂ，ｐ，ａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍ）を読み出す（ステップＳ３１）。次に、このＣＰＵ１１０は、読み出した要素（ａ，ｂ，ｐ，ａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍ）のａが１あるいは−１であるか否かを判断する（ステップＳ３２ａ）。ここで、ａが１あるいは−１であれば、読み出した要素（ａ，ｂ，ｐ，ａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍ）を（ａ，ｐ）に置き換え、これをレジスタ１１１に格納してステップＳ３３に進む。一方、ａが１あるいは−１でなければ、このＣＰＵ１１０は、レジスタ１１１の第５のリストＤ＝［（ｃｈ，ｚｈ）］に、要素（ａ・ｍ’−ｂ・ｍ，ｚ）又は（ａ・ｍ’＋ｂ・ｍ，ｚ’）が存在するか否かを検索する（ステップＳ３２ｃ）。ここで、存在しないと判断された場合にはステップＳ３３に進み、存在すると判断された場合には、さらに何れが存在するかを特定する（ステップＳ３２ｄ）。そして、要素（ａ・ｍ’−ｂ・ｍ，ｚ）と（ａ・ｍ’＋ｂ・ｍ，ｚ’）が存在すると判断された場合には、要素（ａ＋ｂ・ｉ，ｚ）と（ａ−ｂ・ｉ，ｚ’）とを生成し、要素（ａ，ｂ，ｐ，ａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍ）をこれらの二つに置き換えてレジスタ１１１に出力、格納する（ステップＳ３２ｅ）。また、要素（ａ・ｍ’−ｂ・ｍ，ｚ）のみが存在すると判断された場合には、要素（ａ＋ｂ・ｉ，ｚ）を生成し、要素（ａ，ｂ，ｐ，ａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍ）をこれに置き換えてレジスタ１１１に出力、格納する（ステップＳ３２ｆ）。また、要素（ａ・ｍ’＋ｂ・ｍ，ｚ’）のみが存在すると判断された場合には、要素（ａ−ｂ・ｉ，ｚ’）を生成し、要素（ａ，ｂ，ｐ，ａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍ）をこれに置き換えてレジスタ１１１に出力、格納する（ステップＳ３２ｇ）。そして、ステップＳ３３に進む。
【００７７】
ステップＳ３３では、ＣＰＵ１１０が、レジスタ１１１からまだ調べていない第６のリストＡ’’の要素があるか否かを判断する（ステップＳ３３）。ここで、まだ調べていない要素があると判断された場合には、ステップＳ３１に戻り、調べていない要素がないと判断された場合には、レジスタ１１１の要素が置き換えられた第６のリストＡ’’をバス１７０及び出力部１３０を通じて出力し、処理を終了する。
図１３は、複素数設定プログラム３６２が、前述の「ランダムに選択する方法」により好適な複素数βを生成するためのプログラムである場合の処理を示したフローチャートである。なお、この場合、前述のステップＳ２７〜Ｓ３３の代わりにステップＳ４１〜Ｓ４８の処理が実行される。
【００７８】
ステップＳ４１では、複素数設定プログラム３６２が読み込まれたＣＰＵ１１０（複素数設定手段）には、レジスタ１１１から第２のリストＡ’＝［（ａｊ，ｂｊ，ｐｊ）］が入力され、このＣＰＵ１１０は、複素数β＝ｍ’＋ｍ・ｉをランダムに生成して（ステップＳ４１）、仮リスト［（ａｊ・ｍ’−ｂｊ・ｍ，ａｊ・ｍ’＋ｂｊ・ｍ）］を生成し、レジスタ１１１に格納する（ステップＳ４２）。次に、このＣＰＵ１１０は、レジスタ１１１の仮リスト［（ａｊ・ｍ’−ｂｊ・ｍ，ａｊ・ｍ’＋ｂｊ・ｍ）］を検索し、当該仮リスト［（ａｊ・ｍ’−ｂｊ・ｍ，ａｊ・ｍ’＋ｂｊ・ｍ）］に要素の重複がないか判断する（ステップＳ４３）。ここで、要素の重複があると判断された場合には、ステップＳ４１に戻る。一方、要素の重複がないと判断された場合には、ステップＳ４１でランダムに生成した複素数β＝ｍ’＋ｍ・ｉをレジスタ１１１に出力、格納する。
【００７９】
次に、ＣＰＵ１１０は、レジスタ１１１内の第２のリストＡ’の要素（ａ，ｂ，ｐ）（ａ＝１，−１は除く）を（ａ，ｂ，ｐ，ａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍ）に置き換え、この第６のリストＡ’’をレジスタ１１１に格納する（ステップＳ４４）。
次に、ＣＰＵ１１０は、β・Ｕ＋（β・Ｕ）＊の固有値を１／２倍したもののリストＤ（固有値の１／２倍と重複度の対）を作成する（ステップＳ４５）。なお、この処理はステップＳ３０と同様である。
次に、固有値要素生成プログラム２３１が読み込まれたＣＰＵ１１０（固有値要素生成手段）が、レジスタ１１１からまだ調べていない第２のリストＡ’の要素（ａ，ｂ，ｐ，ａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍ）を読み出し（ステップＳ４６）、ステップＳ３２と同様な処理により、要素（ａ，ｂ，ｐ，ａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍ）の置き換えを行う（ステップＳ４７）。そして、ＣＰＵ１１０が、レジスタ１１１からまだ調べていない第２のリストＡ’の要素があるか否かを判断する（ステップＳ４８）。ここで、まだ調べていない要素があると判断された場合には、ステップＳ４６に戻り、調べていない要素がないと判断された場合には、レジスタ１１１の要素が置き換えられた第２のリストＡ’をバス１７０及び出力部１３０を通じて出力し、処理を終了する。
【００８０】
＜実施例４＞
この実施例は、前述の実施例３のユニタリ行列Ｕに本形態の方法を適用した例である。なお、この実施例では、［固有値候補間の最小角よりも小さな２θを設定する方法］を用い複素数βを決定する例である。
まず、実施例３と同じ計算により、リストＡが、
［（−０．６０００００００，１），（０．２８００００００，１），（０．６０００００００，１）］
となり（ステップＳ２０）、
リストＡ’は，
［（−０．６０００００００，０．８０００００００，１），（０．２８００００００，０．９６００００００，１），（０．６０００００００，０．８０００００００，１）］
となる（ステップＳ２１）。
【００８１】
ここで、リストＡ’に（−０．６０００００００，０．８０００００００，１），（０．６０００００００，０．８０００００００，１）という対があるためステップＳ２７（図１１）に進む。
Ａ’の要素を，その最初の成分の大きい順に並べ替えたリストＡ’’は、
［（０．６０００００００，０．８０００００００，１），（０．２８００００００，０．９６００００００，１），（−０．６０００００００，０．８０００００００，１）］
となる（ステップＳ２７）。
【００８２】
次に、リストＡ’’で隣りあう要素（ａ，ｂ，ｐ），（ａ’，ｂ’，ｐ’）すべての対に対し、ａｂ’−ａ’ｂを計算すると、
０．３５２０００００と０．８０００００００となるので、小さい方０．３５２０００００の１／２をとり、ｍ＝０．１７６０００００とおく。これから
ｍ’＝√（１−ｍ２）＝√（１−０．１７６０００００２）＝√０．９６９０２４００＝０．９８４３９０１７
となり、
β＝０．９８４３９０１７＋０．１７６０００００ｉ
となる（ステップＳ２８）。
【００８３】
よって、リストＡ’’は、以下のものに書換えられる（ステップＳ２９）。
［（０．６０００００００，０．８０００００００，０．４４９８３４１０，０．７３１４３４１０），（０．２８００００００，０．９６００００００，０．１０６６６９２５０．４４４５８９２５），（−０．６０００００００，０．８０００００００，−０．７３１４３４１０，−０．４４９８３４１０）］
次に、ステップＳ３０において、Ｖ＝β・Ｕに対し、前と同じように計算すると以下のようになる。
【数７】
2006139575.tif 000009
ここでも前と同様、Ｖ＊を計算したり、Ｖ＋Ｖ＊のすべての成分を計算したりする必要はない。
Ｖ＋Ｖ＊をエルミート行列の固有値を求めるルーチンにかけると、−０．８９９６６８２０，０．２１３３３８５０，０．８９９６６８２０という単根が返ってくる。
これから、リストＤは、
［（−０．４４９８３４１０，１），（０．１０６６６９２５，１），（０．４４９８３４１０，１）］
となる（ステップＳ３０）。
【００８４】
その後、ステップＳ３１〜Ｓ３３において、リストＤを参照しつつリストＡ’’の要素を置き換える。まず、リストＡ’’の要素
（０．６０００００００，０．８０００００００，０．４４９８３４１０，０．７３１４３４１０）
は、リストＤに要素（０．４４９８３４１０，１）があって、０．７３１４３４１０を第一成分とする要素がないので（ステップＳ３２ｃ）、（０．６０００００００＋０．８０００００００・ｉ，１）に置き換えられる（ステップＳ３２ｆ）。
【００８５】
また、リストＡ’’の要素
（０．２８００００００，０．９６００００００，０．１０６６６９２５，０．４４４５８９２５）
は、リストＤに要素（０．１０６６６９２５，１）があって、０．４４４５８９２５を第一成分とする要素がないので（ステップＳ３２ｃ）、（０．２８００００００＋０．９６００００００・ｉ，１）に置き換えられる（ステップＳ３２ｆ）。
また、リストＡ’’の要素
（−０．６０００００００，０．８０００００００，−０．７３１４３４１０，−０．４４９８３４１０）
は、リストＤに要素（−０．４４９８３４１０，１）があって，−０．７３１４３４１０を第一成分とする要素がないので（ステップＳ３２ｃ）、（−０．６０００００００−０．８０００００００・ｉ）に置き換えられる（ステップＳ３２ｆ）。
【００８６】
以上でリストＡ’’の置き換えは終了し、
［（０．６０００００００＋０．８０００００００・ｉ，１），（０．２８００００００＋０．９６００００００・ｉ，１），（−０．６０００００００−０．８０００００００・ｉ，１）］
を出力して処理を終了する。
なお、本発明は上述の各実施の形態に限定されるものではない。例えば、第１の実施の形態では、Ｕが実であるか否かを判断し（ステップＳ１）、実の場合にステップＳ２，Ｓ３の処理によってＵの固有値を求めたが、ステップＳ１〜Ｓ３の機能を設けず、Ｕが実であるか虚であるかに関わらず、ステップＳ４以降の処理を行ってＵの固有値を求めることとしてもよい。
【００８７】
また、第２の実施の形態におけるステップＳ２９やステップＳ４４では、第６のリストＡ’’の要素（ａ，ｂ，ｐ）（ａ＝１，−１は除く）を（ａ，ｂ，ｐ，ａ・ｍ’−ｂ・ｍ，ａ・ｍ’＋ｂ・ｍ）に置き換え、置き換え後の要素を用い、ステップＳ３２ｃの判断を行うこととしたが、この要素の置き換えを行わず、ステップＳ３２ｃにおいて、要素（ａ，ｂ，ｐ）からｃ＝ａ・ｍ’−ｂ・ｍ或いはｃ＝ａ・ｍ’＋ｂ・ｍを算出し、このｃを用いてステップＳ３２ｃの判断を行うこととしてもよい。
また、ｐ＝ｚ＋ｚ’を満たすわけであるから、ステップＳ３２ｃでｃ＝ａ・ｍ’−ｂ・ｍのみを計算し、リストＤに（ｃ，ｚ）が存在する場合にｑ＝ｚとおき、存在しない場合にｑ＝０とおき、Ｕの（固有値，重複度）を（ａ＋ｂ・ｉ，ｑ）（ａ−ｂｉ，ｐ−ｑ）として出力することとしてもよい。
【００８８】
また、上述の各種の処理は、記載に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。さらに、本明細書において装置とは、複数の機能の論理的集合構成であり、各機能が同一筐体内にあるものには限らない。その他、本発明の趣旨を逸脱しない範囲で適宜変更が可能であることはいうまでもない。
また、上述した固有値算出プログラムは、コンピュータが読み取り可能な記録媒体に記録しておくことができる。コンピュータが読み取り可能な記録媒体としては、例えば、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリ等どのようなものでもよいが、具体的には、例えば、磁気記録装置として、ハードディスク装置、フレキシブルディスク、磁気テープ等を、光ディスクとして、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ（Random Access Memory）、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）等を、光磁気記録媒体として、ＭＯ（Magneto-Optical disc）等を、半導体メモリとしてＥＥＰ−ＲＯＭ（Electronically Erasable and Programmable-Read Only Memory）等を用いることができる。
【００８９】
また、このプログラムの流通は、例えば、その固有値算出プログラムを記録したＤＶＤ、ＣＤ−ＲＯＭ等の可搬型記録媒体を販売、譲渡、貸与等することによって行う。さらに、このプログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することにより、このプログラムを流通させる構成としてもよい。
また、上述の各実施の形態は、例えば、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、一旦、自己のハードディスク装置１４０に格納し、このプログラムに従った処理を上述のように実行するものである。しかし、固有値計算装置にサーバコンピュータからプログラムが転送されるたびに、逐次、受け取ったプログラムに従った処理を実行することとしてもよい。また、サーバコンピュータから、この固有値計算装置へのプログラムの転送は行わず、その実行指示と結果取得のみによって処理機能を実現する、いわゆるＡＳＰ（Application Service Provider）型のサービスによって、上述の処理を実行する構成としてもよい。なお、本形態におけるプログラムには、電子計算機による処理の用に供する情報であってプログラムに準ずるもの（コンピュータに対する直接の指令ではないがコンピュータの処理を規定する性質を有するデータ等）を含むものとする。
【００９０】
また、この形態では、コンピュータ上で所定のプログラムを実行させることにより、本装置を構成することとしたが、これらの処理内容の少なくとも一部をハードウェア的に実現することとしてもよい。
【産業上の利用可能性】
【００９１】
本発明は、量子コンピュータの量子回路の設計における固有値算出に適用することができる（例えば、村上裕美，河野泰人，関川浩「Cartan分解を利用した量子回路の生成」，第１０回量子情報技術研究会資料，社団法人電子情報学会  量子情報技術時限研究専門委員会，２００４年５月  参照。）
【図面の簡単な説明】
【００９２】
【図１】本形態における固有値計算装置の基本的な構成を示したブロック図である。
【図２】第１の実施の形態において、リストＡ’に（ａ，ｂ，ｐ），（−ａ，ｂ，ｐ’）（ａ≠０）という対があり、しかも、リストＢに（ｂ，ｑ），（−ｂ，ｑ’）（ｂ≠０）という対がある場合に固有値が特定できない理由を説明するための図である。
【図３】第１の実施の形態における固有値計算装置の構成を例示したブロック図である。
【図４】第１の実施の形態における固有値計算プログラムの構成を例示した概念図である。
【図５】第１の実施の形態における固有値要素生成処理を説明するためのフローチャートである。
【図６】第１の実施の形態における固有値要素生成処理を説明するためのフローチャートである。
【図７】第１の実施の形態における固有値要素生成処理を説明するためのフローチャートである。
【図８】第２の実施の形態において回転各θが不適切である場合を示す図である。
【図９】第２の実施の形態における固有値計算プログラム３００の構成を例示した概念図である。
【図１０】第２の実施の形態における固有値要素生成処理を説明するためのフローチャートである。
【図１１】第２の実施の形態における固有値要素生成処理を説明するためのフローチャートである。
【図１２】図１１におけるステップＳ３２の処理を説明するためのフローチャートである。
【図１３】第２の実施の形態における固有値要素生成処理を説明するためのフローチャートである。
【符号の説明】
【００９３】
１０，１００  固有値計算装置
１１  エルミート行列算出部
１２  エルミート行列固有値算出部
１３  リスト生成部
【図１】
2006139575.tif 000010
【図２】
2006139575.tif 000011
【図３】
2006139575.tif 000012
【図４】
2006139575.tif 000013
【図５】
2006139575.tif 000014
【図６】
2006139575.tif 000015
【図７】
2006139575.tif 000016
【図８】
2006139575.tif 000017
【図９】
2006139575.tif 000018
【図１０】
2006139575.tif 000019
【図１１】
2006139575.tif 000020
【図１２】
2006139575.tif 000021
【図１３】
2006139575.tif 000022