グラスマン多様体とプリュッカー埋め込み

  • 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 \times k行列(正則行列)で線形変換してできるベクトルのセットは、同じ部分空間を張る
  • 従って、正則行列で変換したときに、同じベクトルセットにできるかどうかを確認すればよい
  • 同じベクトルセットにできるかどうかの確認をするにあたり、「標準化」するというのはよい手である
  • 次のように標準化することにする
  • k次元複素ベクトル空間を張っているから、k本のベクトルの長さnのうちk個の要素を取り出して、k \times k行列を作ってやることにすれば、\begin{pmatrix} n \\ k \end{pmatrix}通りのk \times k行列のうち、少なくとも一つは逆行列を持つ(行列式が0ではない)
  • そのようなk個の要素がとれたとすると、そのk \times k行列の逆行列を使って、k本の長さnのベクトルが作るk \times n行列の中に、k \times k単位行列があるような状態にすることができる
  • たとえば、このk個の要素が先頭からk個(1,2,...,k)だとすれば、k \times n行列のうちの、左側のk列の部分にk \times kの単位正方行列が現れ、残りのn-k列はまちまちになる
  • このように、k要素に関して「単位行列」が現れるように、k\times kなる逆行列を使って、標準化し、それによって、同じ行列にできる複素ベクトルセットは「同一視」することにする
  • この同一視が、いわゆる射影空間のの考え方と同じであることを以下に記す
  • 射影空間は、「n個の複素数が作る比」を問題にします
  • 比を問題にする、とは、n個の要素のうち、どれか一つを基準にして、他の要素の値を変換し、その標準化によって同じ値のセットになったものは同一視する、ということと同じである
  • したがって、n個の要素を、k=1本の長さnの複素ベクトルとすれば、k \times k = 1 \times 1行列が現れるようにk \times n = 1 \times nの行列を線形変換して同一視判定をする、という作業になり、これは、k=1の場合のk本のベクトルセットの話と同じである
  • ちなみに、n個の要素のうち、すくなくともk=1個は0ではない(割り算ができる~逆元が存在する)ということと、kが1ではない一般のときに、n個の要素のうち、すくなくともk個の要素の組で、逆行列が存在する(割り算ができる)ということが対応している
  • したがって、n次元複素ベクトル空間に対して定まるn-1次元複素射影空間とは、k=1のグラスマン多様体のことであるとわかる
  • さて、このグラスマン多様体(n次元複素ベクトルのk本セットであって、ただし、k \times k正則行列変換で同一視できるものは同一視してしまった上でできあがる、集合)が\begin{pmatrix} n \\ k \end{pmatrix}-1次元複素射影空間に埋め込まれて、多様体として見えるとはどういうことかを考えることにする
  • k \times k単位行列が現れるように変換する(標準化する)と、k\times n - k \times k = k \times (n-k)の自由度が残る。従ってk本のベクトルで作るグラスマン多様体G(k,n)k \times (n-k)次元複素多様体である
  • k本のベクトルが作るk \times n行列から、\begin{pmatrix}n \\ k \end{pmatrix}通りのk \times k行列を作ることができた。そのうちの少なくとも1つの行列式は0ではないから、 \begin{pmatrix} n \\ k \end{pmatrix}個の行列式を並べたベクトルを考えると、ゼロベクトルではない
  • ゼロベクトルではないので、\begin{pmatrix} n \\ k \end{pmatrix}個の値の比を考えることができて、それはP^{\begin{pmatrix} n \\ k \end{pmatrix}-1}なる、高次元の射影空間の点とみなせる
  • この射影空間の点にすることをプリュッカー埋め込みと言う
  • そして、この\begin{pmatrix}n \\ k \end{pmatrix}個の行列式(という値)たちはある関数があってその値が0になることが知られている
  • 射影空間の値の組が斉次多項式の零点集合であるとき、それをこの射影空間の部分射影多様体と呼ぶので、グラスマン多様体は、プリュッカー埋め込みができて、その値の組・比は射影空間の部分射影多様体になっていることになる
  • Rでやってみよう
  • n次元ベクトルのk本のセットを標準化
n <- 4
k <- 2
W <- matrix(rnorm(n*k)+rnorm(n*k)*1i,k,n)
W # n次元複素ベクトルのk本の組
Wk <- W[1:k,1:k] # 先頭のk列が作る正方行列
Wkinv <- solve(Wk) # その逆行列
Wst <- Wkinv %*% W # 標準化する
Wst # 先頭のk列部分が単位行列化している。残りのn-k列部分が自由度のある部分
> 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 # 1,2列で標準化したWstのプリュッカー座標なので、第1成分が1

pl / pl.st # WとWstは同一視できるものなので、そのプリュッカー座標も射影座標としては同一
pl/pl[1] - pl.st # プリュッカー座標にしてから標準化してもよい
  • k \times n行列の小行列式(k \times k部分行列の行列式)が満足する特徴から、プリュッカー座標が斉次方程式の零点であることが示せる
    • 一般に、k \times n行列があったときに、n列からk列を選んでk \times k行列を作り、その行列式を考える。それがプリュッカー座標である
    • 今、それを少し変えて、n列からk-1列を選び、それをI=(i_1,i_2,...,i_{k-1})とする。また、n列からk+1列を選び、それをJ=(j_1,j_2,...,j_{k+1})とする
    • ここでJから一つの要素を取り除き、その要素をIの末尾に付け加えることとする
    • I' = (i_1,...,i_{k-1},j_l),J'=(j_1,...,j_{l-1},j_{l+1},...,j_{k+1})となる
    • 今、I',J'ともに要素数kである。I'には同一列が2回登場することもある
    • ここで、I',J'のそれぞれについて、k \times k行列が作れるから、その行列式を計算し、その積をとることを考える
    • I'に重複列があるときは、その小行列式は0であるから、そのときのI',J'の小行列式の積も0となる
    • いずれにしろ、あるI,Jについて、Jの要素のすべて1,...,k+1について、以下のように加算する
    • \sum_{l=1}^{k+1} (-1)^l det(W_{I'}) \times det(W_{J'}
    • この値は、いつも0になることが知られている(プリュッカー座標とかと関係なく、一般にk \times n行列で言われている
    • このようにして得られる、小行列式の積の和の中には、その値が0になることが自明であるようなものもある(2つの積成分があって、同一積成分にことなる符号が付いているような場合)が、そうではないものもある
    • その自明でないような式の集合が示す、零点集合のことを考えると、プリュッカー座標はP^{\begin{pmatrix}n \\ k \end{pmatrix}-1}の部分射影多様体であることがわかる
    • Plücker_embedding(Wiki)を参照
  • Rでやってみる。一般の行列でも0になることを示す
# n列から、k-1列をとるすべての組み合わせ
cmb_ <- combinations(n,k-1)
# n列から、k+1列をとるすべての組み合わせ
cmb. <- combinations(n,k+1)

# k-1列の組み合わせと、k+1列の組み合わせの総当り
# どの場合にも、小行列に関する式の値が0になることを以下で確認する
for(i in 1:length(cmb_[,1])){
	for(j in 1:length(cmb.[,1])){
		print("#####")
		# k-1列の組み合わせID
		print(paste("i=",i))
		# k+1列の組み合わせID
		print(paste("j=",j))
		a <- cmb_[i,]
		b <- cmb.[j,]
		# k-1列、k+1列の列番号を提示
		print(paste("k-1 elems=",toString(sort(a))))
		print(paste("k-2 elems=",toString(sort(b))))
		# 加算値の初期値
		tmp <- 0
		# 加算式の初期オブジェクト
		tmpformula <- ""
		print("======")
		# k+1列の要素を1番からk+1番まで順々に取り出してk-1側に移行しつつ積算する
		for(p in 1:(k+1)){
			jL <- b[p] # k+1要素のp番目要素
			a. <- c(a,jL) # k-1側の末尾に加える(行列式では行番・列番は大事なので、末尾に)
			b. <- b[-p] # k+1側から抜き出す
			W1 <- Det(W[,a.]) # k-1側からできたk列の小行列式
			W2 <- Det(W[,b.]) # k+1側からできたk列の小行列式
			print("----")
			# k-1側、k+1側からできたk要素を並べる。同一要素があるかどうかも確認できる
			print(paste("k elems=",toString(sort(a.))))
			#print(W1)
			print(paste("k elems=",toString(sort(b.))))
			#print(W2)
			# 加算にあたっては、重複列があるためにW1=0となっているかもしれないが
			# 気にせず加算する。0を加えても変化なし
			tmp <- tmp + (-1)^p * W1 * W2
			print("----")
			# 加算式の文字列オブジェクトを作る場合には
			# 0となる小行列式が入らないように書く
			# こうすることでプリュッカー座標に登場しない列の組は加算式に現れなくなる
			if(W1!=0 & W2!=0){
				# 加算の際の符号のための文字列
				ss <- "+"
				if((-1)^p == (-1)){
					ss <- "-"
				}
				# k列の表示は、a.,b.を作ったとおりにする
				# 列順が変わると小行列式の符号が変わってしまうから
				#tmpformula <- paste(tmpformula,ss,"W", toString(sort(a.)), "W", toString(sort(b.)))
				tmpformula <- paste(tmpformula,ss,"W", toString(a.), "W", toString(b.))
				#print(tmpformula)
			}
		}
		#print(tmp)
		print(paste(tmpformula, "=", tmp))
		print("#####")
	}
}
    • k=2,n=4のときには、自明な式以外だとW_{1,2}W_{3,4}-W_{1,3}W_{2,4} + W_{1,4}W_{2,3}=0のみが残るそうで、これは斉次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] "#####"