- 9/15の記事でシューベルト計算についてメモした
- その背景となるグラスマン多様体、そのプリュッカー埋め込み、射影空間とかについて、Rを使いながら理解を確認してみる
- 複素ベクトル空間で考える。複素数を使うのは、複素数が代数的閉体であることから都合がよいという理由らしい。代数的閉体とは「一次以上の任意の K 係数変数多項式が K 上に根を持つこと」「一次以上の任意の K 係数一変数多項式が一次多項式の積として書けること」を言う(代数的閉体 - Wikipedia)
- n次元複素ベクトル空間 V を考える。n個の線形独立なベクトルで張られた空間、ということ。線形独立な長さnの複素ベクトルの組が張る空間とも言える
- このVの部分空間として、k次元複素ベクトル空間を考える。長さnの線形独立な複素ベクトルk本の組が張る空間のこと
- 2つのことを考える
- (1)このk次元複素ベクトル空間を張るには、k本のベクトルが要るが、そのとり方は一通りではない
- (2)このk次元複素ベクトル空間は、いろいろある、たくさんある。このたくさんある、k次元複素ベクトル空間のすべてを要素とする集合がグラスマン多様体である。
集合がどうして多様体になるかと言えば、後述するように、うまいこと高次元空間に埋め込むことができて「多様体」としてとらえることができるからであるここで言う多様対はmanifoldでは無くてvarietyらしい。両者は似ているが、varietyというときは代数的側面が強いそうだ(参照:History of manifolds and varieties)
- したがって、k本のベクトルのセットが2セットあったときに、それらが、同じk次元複素ベクトル空間を張っているのか、異なるk次元複素ベクトル空間を張っているのかが気になる
- ある部分空間を張っているベクトルのセットを行列(正則行列)で線形変換してできるベクトルのセットは、同じ部分空間を張る
- 従って、正則行列で変換したときに、同じベクトルセットにできるかどうかを確認すればよい
- 同じベクトルセットにできるかどうかの確認をするにあたり、「標準化」するというのはよい手である
- 次のように標準化することにする
- k次元複素ベクトル空間を張っているから、k本のベクトルの長さnのうちk個の要素を取り出して、行列を作ってやることにすれば、通りの行列のうち、少なくとも一つは逆行列を持つ(行列式が0ではない)
- そのようなk個の要素がとれたとすると、その行列の逆行列を使って、k本の長さnのベクトルが作る行列の中に、単位行列があるような状態にすることができる
- たとえば、このk個の要素が先頭からk個(1,2,...,k)だとすれば、行列のうちの、左側のk列の部分にの単位正方行列が現れ、残りの列はまちまちになる
- このように、k要素に関して「単位行列」が現れるように、なる逆行列を使って、標準化し、それによって、同じ行列にできる複素ベクトルセットは「同一視」することにする
- この同一視が、いわゆる射影空間のの考え方と同じであることを以下に記す
- 射影空間は、「n個の複素数が作る比」を問題にします
- 比を問題にする、とは、n個の要素のうち、どれか一つを基準にして、他の要素の値を変換し、その標準化によって同じ値のセットになったものは同一視する、ということと同じである
- したがって、n個の要素を、k=1本の長さnの複素ベクトルとすれば、行列が現れるようにの行列を線形変換して同一視判定をする、という作業になり、これは、k=1の場合のk本のベクトルセットの話と同じである
- ちなみに、n個の要素のうち、すくなくともk=1個は0ではない(割り算ができる~逆元が存在する)ということと、kが1ではない一般のときに、n個の要素のうち、すくなくともk個の要素の組で、逆行列が存在する(割り算ができる)ということが対応している
- したがって、n次元複素ベクトル空間に対して定まるn-1次元複素射影空間とは、k=1のグラスマン多様体のことであるとわかる
- さて、このグラスマン多様体(n次元複素ベクトルのk本セットであって、ただし、正則行列変換で同一視できるものは同一視してしまった上でできあがる、集合)が次元複素射影空間に埋め込まれて、多様体として見えるとはどういうことかを考えることにする
- 単位行列が現れるように変換する(標準化する)と、の自由度が残る。従ってk本のベクトルで作るグラスマン多様体は次元複素多様体である
- k本のベクトルが作る行列から、通りの行列を作ることができた。そのうちの少なくとも1つの行列式は0ではないから、個の行列式を並べたベクトルを考えると、ゼロベクトルではない
- ゼロベクトルではないので、個の値の比を考えることができて、それはなる、高次元の射影空間の点とみなせる
- この射影空間の点にすることをプリュッカー埋め込みと言う
- そして、この個の行列式(という値)たちはある関数があってその値が0になることが知られている
- 射影空間の値の組が斉次多項式の零点集合であるとき、それをこの射影空間の部分射影多様体と呼ぶので、グラスマン多様体は、プリュッカー埋め込みができて、その値の組・比は射影空間の部分射影多様体になっていることになる
- Rでやってみよう
- n次元ベクトルのk本のセットを標準化
n <- 4
k <- 2
W <- matrix(rnorm(n*k)+rnorm(n*k)*1i,k,n)
W
Wk <- W[1:k,1:k]
Wkinv <- solve(Wk)
Wst <- Wkinv %*% W
Wst
> Wst
[,1] [,2]
[1,] 1.000000e+00+0.000000e+00i -3.330669e-16+5.55112e-17i
[2,] -5.551115e-17+2.775558e-17i 1.000000e+00+0.00000e+00i
[,3] [,4]
[1,] -0.4911355+0.2134693i 0.1052459+0.1589503i
[2,] 0.5020897+0.0647459i 0.6297663-0.3715386i
- プリュッカー座標の計算
- ベクトルセットを標準化してもプリュッカー座標的には同一(射影空間的には同一)であることも示す
library(complexplus)
library(gtools)
cmb <- combinations(n,k)
pl <- pl.st <- rep(0,length(cmb[,1]))
for(i in 1:length(pl)){
pl[i] <- Det(W[,cmb[i,]])
pl.st[i] <- Det(Wst[,cmb[i,]])
}
pl
pl.st
pl / pl.st
pl/pl[1] - pl.st
- 行列の小行列式(部分行列の行列式)が満足する特徴から、プリュッカー座標が斉次方程式の零点であることが示せる
- 一般に、行列があったときに、n列からk列を選んで行列を作り、その行列式を考える。それがプリュッカー座標である
- 今、それを少し変えて、n列からk-1列を選び、それをとする。また、n列からk+1列を選び、それをとする
- ここでJから一つの要素を取り除き、その要素をIの末尾に付け加えることとする
- ,となる
- 今、ともに要素数kである。には同一列が2回登場することもある
- ここで、のそれぞれについて、行列が作れるから、その行列式を計算し、その積をとることを考える
- に重複列があるときは、その小行列式は0であるから、そのときのの小行列式の積も0となる
- いずれにしろ、あるについて、の要素のすべてについて、以下のように加算する
- この値は、いつも0になることが知られている(プリュッカー座標とかと関係なく、一般に行列で言われている
- このようにして得られる、小行列式の積の和の中には、その値が0になることが自明であるようなものもある(2つの積成分があって、同一積成分にことなる符号が付いているような場合)が、そうではないものもある
- その自明でないような式の集合が示す、零点集合のことを考えると、プリュッカー座標はの部分射影多様体であることがわかる
- Plücker_embedding(Wiki)を参照
- Rでやってみる。一般の行列でも0になることを示す
cmb_ <- combinations(n,k-1)
cmb. <- combinations(n,k+1)
for(i in 1:length(cmb_[,1])){
for(j in 1:length(cmb.[,1])){
print("#####")
print(paste("i=",i))
print(paste("j=",j))
a <- cmb_[i,]
b <- cmb.[j,]
print(paste("k-1 elems=",toString(sort(a))))
print(paste("k-2 elems=",toString(sort(b))))
tmp <- 0
tmpformula <- ""
print("======")
for(p in 1:(k+1)){
jL <- b[p]
a. <- c(a,jL)
b. <- b[-p]
W1 <- Det(W[,a.])
W2 <- Det(W[,b.])
print("----")
print(paste("k elems=",toString(sort(a.))))
print(paste("k elems=",toString(sort(b.))))
tmp <- tmp + (-1)^p * W1 * W2
print("----")
if(W1!=0 & W2!=0){
ss <- "+"
if((-1)^p == (-1)){
ss <- "-"
}
tmpformula <- paste(tmpformula,ss,"W", toString(a.), "W", toString(b.))
}
}
print(paste(tmpformula, "=", tmp))
print("#####")
}
}
-
- のときには、自明な式以外だとのみが残るそうで、これは斉次2次式なので、2次超平面になることがわかるのだという
- 少し長くなるが、k-1列、k+1列のすべての組み合わせでの実行結果を以下に示して確認する
[1] "#####"
[1] "i= 1"
[1] "j= 1"
[1] "k-1 elems= 1"
[1] "k-2 elems= 1, 2, 3"
[1] "======"
[1] "----"
[1] "k elems= 1, 1"
[1] "k elems= 2, 3"
[1] "----"
[1] "----"
[1] "k elems= 1, 2"
[1] "k elems= 1, 3"
[1] "----"
[1] "----"
[1] "k elems= 1, 3"
[1] "k elems= 1, 2"
[1] "----"
[1] " + W 1, 2 W 1, 3 - W 1, 3 W 1, 2 = 0"
[1] "#####"
[1] "#####"
[1] "i= 1"
[1] "j= 2"
[1] "k-1 elems= 1"
[1] "k-2 elems= 1, 2, 4"
[1] "======"
[1] "----"
[1] "k elems= 1, 1"
[1] "k elems= 2, 4"
[1] "----"
[1] "----"
[1] "k elems= 1, 2"
[1] "k elems= 1, 4"
[1] "----"
[1] "----"
[1] "k elems= 1, 4"
[1] "k elems= 1, 2"
[1] "----"
[1] " + W 1, 2 W 1, 4 - W 1, 4 W 1, 2 = 0"
[1] "#####"
[1] "#####"
[1] "i= 1"
[1] "j= 3"
[1] "k-1 elems= 1"
[1] "k-2 elems= 1, 3, 4"
[1] "======"
[1] "----"
[1] "k elems= 1, 1"
[1] "k elems= 3, 4"
[1] "----"
[1] "----"
[1] "k elems= 1, 3"
[1] "k elems= 1, 4"
[1] "----"
[1] "----"
[1] "k elems= 1, 4"
[1] "k elems= 1, 3"
[1] "----"
[1] " + W 1, 3 W 1, 4 - W 1, 4 W 1, 3 = 0"
[1] "#####"
[1] "#####"
[1] "i= 1"
[1] "j= 4"
[1] "k-1 elems= 1"
[1] "k-2 elems= 2, 3, 4"
[1] "======"
[1] "----"
[1] "k elems= 1, 2"
[1] "k elems= 3, 4"
[1] "----"
[1] "----"
[1] "k elems= 1, 3"
[1] "k elems= 2, 4"
[1] "----"
[1] "----"
[1] "k elems= 1, 4"
[1] "k elems= 2, 3"
[1] "----"
[1] " - W 1, 2 W 3, 4 + W 1, 3 W 2, 4 - W 1, 4 W 2, 3 = 1.11022302462516e-16"
[1] "#####"
[1] "#####"
[1] "i= 2"
[1] "j= 1"
[1] "k-1 elems= 2"
[1] "k-2 elems= 1, 2, 3"
[1] "======"
[1] "----"
[1] "k elems= 1, 2"
[1] "k elems= 2, 3"
[1] "----"
[1] "----"
[1] "k elems= 2, 2"
[1] "k elems= 1, 3"
[1] "----"
[1] "----"
[1] "k elems= 2, 3"
[1] "k elems= 1, 2"
[1] "----"
[1] " - W 2, 1 W 2, 3 - W 2, 3 W 1, 2 = -4.44089209850063e-16"
[1] "#####"
[1] "#####"
[1] "i= 2"
[1] "j= 2"
[1] "k-1 elems= 2"
[1] "k-2 elems= 1, 2, 4"
[1] "======"
[1] "----"
[1] "k elems= 1, 2"
[1] "k elems= 2, 4"
[1] "----"
[1] "----"
[1] "k elems= 2, 2"
[1] "k elems= 1, 4"
[1] "----"
[1] "----"
[1] "k elems= 2, 4"
[1] "k elems= 1, 2"
[1] "----"
[1] " - W 2, 1 W 2, 4 - W 2, 4 W 1, 2 = -2.22044604925031e-16"
[1] "#####"
[1] "#####"
[1] "i= 2"
[1] "j= 3"
[1] "k-1 elems= 2"
[1] "k-2 elems= 1, 3, 4"
[1] "======"
[1] "----"
[1] "k elems= 1, 2"
[1] "k elems= 3, 4"
[1] "----"
[1] "----"
[1] "k elems= 2, 3"
[1] "k elems= 1, 4"
[1] "----"
[1] "----"
[1] "k elems= 2, 4"
[1] "k elems= 1, 3"
[1] "----"
[1] " - W 2, 1 W 3, 4 + W 2, 3 W 1, 4 - W 2, 4 W 1, 3 = -1.11022302462516e-16"
[1] "#####"
[1] "#####"
[1] "i= 2"
[1] "j= 4"
[1] "k-1 elems= 2"
[1] "k-2 elems= 2, 3, 4"
[1] "======"
[1] "----"
[1] "k elems= 2, 2"
[1] "k elems= 3, 4"
[1] "----"
[1] "----"
[1] "k elems= 2, 3"
[1] "k elems= 2, 4"
[1] "----"
[1] "----"
[1] "k elems= 2, 4"
[1] "k elems= 2, 3"
[1] "----"
[1] " + W 2, 3 W 2, 4 - W 2, 4 W 2, 3 = 0"
[1] "#####"
[1] "#####"
[1] "i= 3"
[1] "j= 1"
[1] "k-1 elems= 3"
[1] "k-2 elems= 1, 2, 3"
[1] "======"
[1] "----"
[1] "k elems= 1, 3"
[1] "k elems= 2, 3"
[1] "----"
[1] "----"
[1] "k elems= 2, 3"
[1] "k elems= 1, 3"
[1] "----"
[1] "----"
[1] "k elems= 3, 3"
[1] "k elems= 1, 2"
[1] "----"
[1] " - W 3, 1 W 2, 3 + W 3, 2 W 1, 3 = 1.11022302462516e-16"
[1] "#####"
[1] "#####"
[1] "i= 3"
[1] "j= 2"
[1] "k-1 elems= 3"
[1] "k-2 elems= 1, 2, 4"
[1] "======"
[1] "----"
[1] "k elems= 1, 3"
[1] "k elems= 2, 4"
[1] "----"
[1] "----"
[1] "k elems= 2, 3"
[1] "k elems= 1, 4"
[1] "----"
[1] "----"
[1] "k elems= 3, 4"
[1] "k elems= 1, 2"
[1] "----"
[1] " - W 3, 1 W 2, 4 + W 3, 2 W 1, 4 - W 3, 4 W 1, 2 = 2.22044604925031e-16"
[1] "#####"
[1] "#####"
[1] "i= 3"
[1] "j= 3"
[1] "k-1 elems= 3"
[1] "k-2 elems= 1, 3, 4"
[1] "======"
[1] "----"
[1] "k elems= 1, 3"
[1] "k elems= 3, 4"
[1] "----"
[1] "----"
[1] "k elems= 3, 3"
[1] "k elems= 1, 4"
[1] "----"
[1] "----"
[1] "k elems= 3, 4"
[1] "k elems= 1, 3"
[1] "----"
[1] " - W 3, 1 W 3, 4 - W 3, 4 W 1, 3 = 0"
[1] "#####"
[1] "#####"
[1] "i= 3"
[1] "j= 4"
[1] "k-1 elems= 3"
[1] "k-2 elems= 2, 3, 4"
[1] "======"
[1] "----"
[1] "k elems= 2, 3"
[1] "k elems= 3, 4"
[1] "----"
[1] "----"
[1] "k elems= 3, 3"
[1] "k elems= 2, 4"
[1] "----"
[1] "----"
[1] "k elems= 3, 4"
[1] "k elems= 2, 3"
[1] "----"
[1] " - W 3, 2 W 3, 4 - W 3, 4 W 2, 3 = 0"
[1] "#####"
[1] "#####"
[1] "i= 4"
[1] "j= 1"
[1] "k-1 elems= 4"
[1] "k-2 elems= 1, 2, 3"
[1] "======"
[1] "----"
[1] "k elems= 1, 4"
[1] "k elems= 2, 3"
[1] "----"
[1] "----"
[1] "k elems= 2, 4"
[1] "k elems= 1, 3"
[1] "----"
[1] "----"
[1] "k elems= 3, 4"
[1] "k elems= 1, 2"
[1] "----"
[1] " - W 4, 1 W 2, 3 + W 4, 2 W 1, 3 - W 4, 3 W 1, 2 = 2.22044604925031e-16"
[1] "#####"
[1] "#####"
[1] "i= 4"
[1] "j= 2"
[1] "k-1 elems= 4"
[1] "k-2 elems= 1, 2, 4"
[1] "======"
[1] "----"
[1] "k elems= 1, 4"
[1] "k elems= 2, 4"
[1] "----"
[1] "----"
[1] "k elems= 2, 4"
[1] "k elems= 1, 4"
[1] "----"
[1] "----"
[1] "k elems= 4, 4"
[1] "k elems= 1, 2"
[1] "----"
[1] " - W 4, 1 W 2, 4 + W 4, 2 W 1, 4 = 5.55111512312578e-17"
[1] "#####"
[1] "#####"
[1] "i= 4"
[1] "j= 3"
[1] "k-1 elems= 4"
[1] "k-2 elems= 1, 3, 4"
[1] "======"
[1] "----"
[1] "k elems= 1, 4"
[1] "k elems= 3, 4"
[1] "----"
[1] "----"
[1] "k elems= 3, 4"
[1] "k elems= 1, 4"
[1] "----"
[1] "----"
[1] "k elems= 4, 4"
[1] "k elems= 1, 3"
[1] "----"
[1] " - W 4, 1 W 3, 4 + W 4, 3 W 1, 4 = 8.32667268468867e-17"
[1] "#####"
[1] "#####"
[1] "i= 4"
[1] "j= 4"
[1] "k-1 elems= 4"
[1] "k-2 elems= 2, 3, 4"
[1] "======"
[1] "----"
[1] "k elems= 2, 4"
[1] "k elems= 3, 4"
[1] "----"
[1] "----"
[1] "k elems= 3, 4"
[1] "k elems= 2, 4"
[1] "----"
[1] "----"
[1] "k elems= 4, 4"
[1] "k elems= 2, 3"
[1] "----"
[1] " - W 4, 2 W 3, 4 + W 4, 3 W 2, 4 = -4.44089209850063e-16"
[1] "#####"