実空間で回る、虚空間で回る。偶数と奇数

  • 前の記事(こちら)で、置換行列の実数乗を考えて、「元に戻る回転」を複合的に作った
  • 実際は、このようにして作った回転の軌跡は、実空間に納まっている場合と虚空間を使っている場合とがある
  • 実空間を使って回れるのは、「軸数が奇数」の場合で、「軸数が偶数」の場合は、居空間を使う
  • 簡単な例を考えよう
  • 軸数が2で、(1,0)->(0,1),(0,1)->(1,0)と言う交代・置換のとき、2次元空間で、これを連続的に行おうとすると、「途中経過」では2軸をどこに置いたらよいのか、困る。イメージするなら、3次元空間を使ってくるりと回らせるようなことになる。この2軸を3次元で回す、ということが「虚空間」を使うということ
  • 軸数が3の場合はどうだろう。(1,0,0)->(0,1,0)->(0,0,1)->(1,0,0)というようなやりとりだと、くるくる回っている姿が想像できる
  • 確かに、軸数の偶奇で軌跡の虚数部があるかないかを次のようにして、確かめてみることができる
    • 奇数のときには軌跡座標の虚部が0(ただし、奇数軸のすべてで巡回すること)
  • この話は、「奇数次元での回転」にはへそがあり、「偶数次元での回転」にはへそがないこととつながる話(こちら)
    • 軸数が奇数のとき、軸を置換する回転は、実空間での回転として定義できて、それは、正規直交基底の先端が作るディリクレな部分空間(次元が1つ小さい空間)での回転に関する話。この部分空間の次元は偶数で、このような「偶数次元空間」ではうまい回転がある
    • 軸数が偶数のときは、1次元小さい部分空間(この空間は奇数次元空間)にうまい回転がない。うまい回転はないので、1次元を「へそ」にして、残りの次元(偶数)の回転が作れる
# 次元
ks<-2:15
maxIm<-rep(0,length(ks))
for(ik in 1:length(ks)){
	k<-ks[ik]
# 次元kの単位ベクトル
M<-diag(rep(1,k))
# 置換行列をいくつ作るか
n<-1
# 置換行列のリスト
T<-list()
for(i in 1:n){
	# 全軸がくるりと回るように置換行列を作る
	#T[[i]]<-M[sample(1:k),]
	T[[i]]<-M[c(2:k,1),]
}
# 各置換行列の単位時間当たりの回転程度を自然数で与える
how.many.times<-sample(2:10,n,replace=TRUE)

# 各置換行列の特異値分解の固有値と固有ベクトルを格納
S<-list()
V<-list()
U<-list()
for(i in 1:n){
	tmp<-T[[i]]
	e.out<-eigen(tmp)
	S[[i]]<-e.out$values
	V[[i]]<-e.out$vectors
	U[[i]]<-solve(V[[i]])
}
# すべての周期の公倍数であって、かつ、k!の倍数であるような時刻
# もとに戻るはずの時刻
z<-prod(how.many.times)*factorial(k)

# 連続的時刻と元に戻るはずの時刻のリスト
t<-seq(from=0,to=100,length=1000)
t<-c(t,z)
# 初期座標
x<-runif(k)*100
Niter<-length(t)
X<-matrix(0,Niter,k)
# 時刻ごとに座標を計算
for(i in 1:length(t)){
	tmpx<-x
	# 置換行列ごとに、指定時刻までの回転をさせ
	# すべての置換行列の処理を重ねる
	for(j in 1:n){
		tmpx<-V[[j]]%*%diag((S[[j]]+complex(0,0))^(t[i]/how.many.times[j]))%*%U[[j]]%*%tmpx
	}
	X[i,]<-tmpx
}
# plotする
matplot(Re(X),type="l")
plot(as.data.frame(X))

library(rgl)
#plot3d(Re(X)[,1:3],type="l")
# もとに戻っていることの確認
X[1,]-X[length(t),]

# 各置換行列が単位行列に戻っていることの確認
for(i in 1:n){
	print(V[[j]]%*%diag((S[[j]]+complex(0,0))^(z/how.many.times[j]))%*%U[[j]])
}
#print(apply(Im(X),2,max))
# 虚部の最大値を軸別出す
# さらにその最大値を取る
maxIm[ik]<-max(apply(Im(X),2,max))
S
T
}
plot(ks,maxIm,type="b")