有限体上の線形代数を探訪する ~ 固有値・固有ベクトル編 ~
前回の記事では有限体上の線形空間における直交補空間について考えた。本稿ではその続きとして固有値と固有ベクトルについて考えてみる。
固有値と固有ベクトル
本[1]では実数体または複素数体のいずれかを表すということになっているが、この定義を体の視点から見るとベクトルのスカラー倍さえ定まっていれば意味を成す。したがってを有限体としてもこの固有値・固有ベクトルの定義は妥当であると言える。
固有空間
もう一つ大切な概念として固有空間がある。これについても定義の妥当性を確認しておこう。以下に本[1]に記載されている定義を示す。
この定義も特に実数体や複素数体に固有の性質は利用していないため、有限体上の線形空間に対しても同様の定義を適用可能である。
固有空間の和
実数体や複素数体上の線形空間の場合、固有空間の和は実際には直和になる。有限体の場合も果たしてそうなるのだろうか?これを確かめるために、まず複素数体の場合の証明の概要を本[1]から抜粋する。
示すべきは、線形変換の相異なる固有値に対する固有ベクトルが線形独立になることである。相異なる固有値に対する固有ベクトルをとする。このとき、が線形従属であると仮定すれば、は線型独立だがは線形従属であるようなが存在する。このとき、は
(1)
と表せる。この両辺にを適用すれば
(2)
となる。式(1)の両辺にを掛けて(2)から引くと以下のようになる。
は線形独立であり、かつは相異なるので、である。これよりとなるが、これはが固有ベクトルであることに矛盾する。よって仮定は誤りで、相異なる固有値に対する固有ベクトルは線形独立である。これより、固有空間の和は直和であると言える。(証明終わり)
この証明の中では複素数固有の性質は特に使われていないため、有限体でも同じように成立すると考えられる。
対角化
固有値は対角化と密接な関連がある。対角化はいつでも可能なわけではないが、有限体上の線形空間でも対角化可能となる条件は変わらないだろうか?これについて調べてみる。
まず、線形写像の表現行列が対角化可能となる条件を本[1]より引用する。
体力的に厳しいので、が固有空間の直和であればが対角行列で表現できることの証明だけ追ってみる。が全ての固有ベクトルであるとき、に対応する固有値をとすればとなる。よって基底に関するの表現行列は
となる。(証明終わり)
この証明の中では特に実数体や複素数体固有の議論は行っていないため、有限体でも同様に成り立つ。証明をさぼったが、逆についても同様である。
ここからさらに議論を積み重ねると、ある行列が対角化可能であるためには、各固有値について固有多項式の根としての多重度と対応する固有空間の次元が一致することが必要十分条件であることが言える。これについても証明を詳細に書き記す元気がなくなってきたので断念するが、本[1]を見る限りは有限体でも同様の条件が成立すると言えそうだ。
対角化できないケースの具体例
対角化ができる条件は分かったが、実数体や複素数の場合、具体的にこの条件が満たされない状況には以下の2通りがある。
後者については体が代数閉体の場合は起こり得ないことに注意されたい。
これらのケースは有限体であっても存在する。各種具体例についてsageで計算してみた結果を以下に示す。
・計算プログラム
#!/usr/bin/env sage from sage.all import * def main(): matrixList = [] matrixList.append(matrix(GF(3), [[2, 1], [1, 2]])) matrixList.append(matrix(GF(3), [[2, 0], [0, 2]])) matrixList.append(matrix(GF(3), [[2, 1], [0, 2]])) matrixList.append(matrix(GF(2), [[1, 1], [1, 0]])) matrixList.append(matrix(GF(4), [[1, 0], [0, 1]])) for mat in matrixList: try: print(f"matrix:\n{mat}") print(f"eigen values: {mat.eigenvalues()}") print("eigen vectors(right):") for ev in mat.eigenvectors_right(): print(ev) print("eigen spaces(right):") for es in mat.eigenspaces_right(): print(es) except NotImplementedError: print("NotImplementedError occurred.") print("") if __name__ == "__main__": main()
・実行結果
./gf-eigen.py matrix: [2 1] [1 2] eigen values: [0, 1] ★多重度1の固有値が2つ eigen vectors(right): ★固有ベクトルが1つずつ (0, [ (1, 1) ], 1) (1, [ (1, 2) ], 1) eigen spaces(right): (0, Vector space of degree 2 and dimension 1 over Finite Field of size 3 User basis matrix: [1 1]) (1, Vector space of degree 2 and dimension 1 over Finite Field of size 3 User basis matrix: [1 2]) matrix: [2 0] [0 2] eigen values: [2, 2] ★多重度2の固有値が1つ eigen vectors(right): ★固有ベクトルが2つ (2, [ (1, 0), (0, 1) ], 2) eigen spaces(right): (2, Vector space of degree 2 and dimension 2 over Finite Field of size 3 User basis matrix: [1 0] [0 1]) matrix: [2 1] [0 2] eigen values: [2, 2] ★多重度2の固有値が1つ eigen vectors(right): ★固有ベクトルが1つ (2, [ (1, 0) ], 2) eigen spaces(right): (2, Vector space of degree 2 and dimension 1 over Finite Field of size 3 User basis matrix: [1 0]) matrix: [1 1] [1 0] eigen values: [z2 + 1, z2] ★2つの固有値がどちらもGF(2)の中に存在しない eigen vectors(right): ★このケースでの固有ベクトル計算はsageでは未サポート NotImplementedError occurred. matrix: [1 0] [0 1] NotImplementedError occurred. ★素数位数でない有限体について固有値計算はsageでは未サポート
やってみて分かったが、sageでは未サポートのケースがいくつかあるようだ。位数が素数でない有限体に対して固有値が計算できないのは、内部的に代数閉包を計算しており、かつそれが位数が素数でない有限体については対応していないからのようで、そのあたりのことは公式ドキュメント[3]に記載がある。
しかし、素数位数であっても固有値がベースとなる体の中に存在しないケースで固有ベクトルが計算できない理由は良く分からない。恐らく何か理論的な難しさがあるのだろう。
有限体の代数閉包
具体例を見ていく中で、いくつか私が疑問に思ったことがある。
1つ目の答えはNoである。証明は超簡単で(と言っても私は自力で思いつかなかったが)、有限体が有限個の元から成るとする。このとき、の根はに含まれないので、有限体は代数閉体にはならない[2]。
では、有限体の代数閉包はどんな体になるのだろうか?軽く調べてみるといろいろ情報が出てくるが、これ単独で別の記事が書けそうな感じだったので、ここでは深入りしないでおく。これについてはまた機会があればブログに書きたいと思う。
対称行列の対角化
最後に対称行列に関して特筆すべき事項があるので、それについて紹介しよう。
実対称行列は適当な直交行列を用いて対角化可能であることが知られている。しかし、有限体の元を成分に持つ対称行列の場合は必ずしも対角化可能とは限らない[4]。
例えば、の元を成分に持つ以下のような行列を考えてみよう。
この行列の固有値は1のみで、対応する固有ベクトルはである。固有値の多重度が2で固有空間の次元が1のため、この行列は対角化できない。
なぜこうなるのかと言われると「成り立たないもんはしょうがない」ということになる(立派な反例があるので)。ただ、強いて言えば有限体の元を成分に持つ数ベクトルが成す空間では直交という概念が普通には定まらないので、そもそも直交行列の定義が怪しくなり、このような結果になっているのではないかと想像している。