3. ベクトル積から外積代数まで 駆け足で読む『数学をいかに使うか』

  • 駆け足で読む『数学をいかに使うか』の目次はこちら
  • 3次元ベクトル空間\mathbf{R}^3でのベクトル積(外積)は、a=(a_1,a_2,a_3),b=(b_1,b_2,b_3)に対して、a \times b = (|\begin{pmatrix} a_2 & a_3 \\ b_2 & b_3 \end{pmatrix}|,|\begin{pmatrix} a_3 & a_1 \\ b_3 & b_1 \end{pmatrix}|,|\begin{pmatrix} a_1 & a_2 \\ b_1 & b_2 \end{pmatrix}|) という\mathbf{R}^3のベクトル。
  • 他方、内積は[tex:=\sum_{i=1}^3 a_i b_i]
  • 内積の定義はn次元においてもそのまま通用するが、ベクトル積はそうはなっていない。その理由を含めて考えると、ベクトル積・外積代数というものが出てくる。それを以下に示す
  • n次元のベクトル積
    • n次元空間ベクトルがn-1個あったとき、そのベクトル積は、n次元ベクトルになる
    • 今、n-1個のベクトルをx_2,x_3,...,x_nとし、もう一つn次元ベクトルx_1を置く
    • x_1,...,x_nを行ベクトルとする行列Xを考えると、そのDeterminant(det(X))が算出できる
    • x_2,...,x_nのベクトル積はn次元ベクトルvであって、x_1vとの内積はXのDeterminantである([tex:=det(X)])という関係にある
  • それをRで書くと次のようになる
library(MCMCpack)
# 複素数行列のDeterminantの計算用関数
detComplex<-function(M){
	e.out<-eigen(M)
	prod(e.out[[1]])
}
# 外積計算用関数
ExteriorProduct<-function(V){
	ret<-rep(0,length(V[1,]))
	for(i in 1:length(ret)){
		ret[i]<-(-1)^(i+1)*detComplex(V[,-i])
	}
	ret
}
# 例えばn=7次でやってみる
n<-7
# 適当に複素数を要素とする正方行列を作る
X<-matrix(complex(real = rdirichlet(1,rep(1,n^2)), imaginary = rdirichlet(1,rep(1,n^2))),ncol=n)
# Hermite化する
X<-t(Conj(X))%*%X
# Determinantを計算する
detX<-detComplex(X)
detX
# n個のベクトルから適当にn-1個を選ぶ
s<-sample(1:n,(n-1))
# 選ばれたn-1個のベクトルについて外積を計算する
ep<-ExteriorProduct(X[s,])
# 外積は長さnのベクトルである
ep
# 選ばれなかったベクトルと、選ばれたn-1個のベクトルの外積との内積を計算すると
# 選ばれなかったベクトルと選ばれたベクトルとが作る行列のDeterminantになっていることが以下の計算でわかる
sum(X[-s,]*ep)
detComplex(X)
sum(X[-s,]*ep)-detComplex(X)
  • 長さnのベクトルn-1本から、長さnのベクトルが1本できた。これは、n次元空間をVとしてV^{n-1}からVへと写したもの
  • ベクトル積を一般次元に拡張する
  • ベクトル積はn次元ベクトルがn-1本集まったときに定義できた
  • n次元ベクトルがr([tex:r
  • それは、n-1個のベクトルが作る(n-1)\times n行列からn-2列を取り出したもの(n-1通りある)が作る(n-1)\times (n-1)行列のDeterminantに正負を考慮したものになっている
  • このベクトル積様なものの個数は、「組み合わせ」で決まるので、べき集合の要素数(n次元ベクトルn本に対して考えれば、2^n)になる
  • この2^n個の要素たちは「代数」的に完結するので、以下のように「外積代数」としてまとめられる(参考→こちら)
  • 外積代数はベクトル解析につながっている
    • 外積・微分形式・外微分…時空間軌道の解析から始まった「曲線」「曲面」「多様体」に関する話題の一端であるこの記事につながる
    • この先に関する若干の補足はこちら
  • 外積代数を用いて、微分形式・外微分などを用いることで積分に関する以下の公式がわかりやすくなる
  • Gauss-Stokesの公式(こちら)、「ベクトル場の回転を曲面上で面積分したものが、元のベクトル場を曲面の境界で線積分したものに一致する」
    • \int_{\partial S} \omega = \int_S d\omega
\int_{\partial S} \omega = \int_S d\omega
  • 自分なりに外積代数・微分形式・外微分・Gauss-Stokesの公式を書いてみる
    • n次元空間には、n個の線形独立なベクトルがおける。簡単に考えるなら、n本のベクトルからなる正規直交基底を考える
    • 外積代数
      • 外積代数では、1,2,...,nを要素とする集合のべき集合の要素である部分集合に対応したものを考える
      • そのような要素は2^n個ある
      • この2^n個は、部分集合であるが、部分集合としての要素数が、0,1,2,...,nのいずれかであって、それぞれの要素数は\begin{pmatrix} n \\ i \end{pmatrix};r=0,1,...nとなっている
      • それらは符号の取り方の工夫をすることで、あるルールづけがなされている
    • 微分形式
      • 外積代数では「単位ベクトル」を考えたが、こちらは微分なので、「微小ベクトル」を考える。微小ベクトルだが、方向については、「単位ベクトル」をそのままひきつぐ
      • 外積代数と同様に2^n種類あるそれぞれに、関数がある
        • f_{i}^r(x);r=0,1,...,n;i=1,2,...,\begin{pmatrix}n \\ r \end{pmatrix}
      • 外積代数では、対応する部分集合の要素数で0,1,...,n通りに分類できたが、この要素数rごとにw^r=\sum_{i=1}^{\begin{pmatrix}n \\ r \end{pmatrix}} f_{i}^r (x) G_i^rのようにG_i^r(部分集合として要素数rの外積代数の一つ)に関して足し合わせたものをr次の微分形式と呼ぶ
    • 外微分
      • r次の微分形式w^rの外微分dw^rを次のように定義する
      • dw^r=\sum_{i=1}^{\begin{pmatrix}n \\ r \end{pmatrix}} df_i^r G_i^r
      • ここで外積代数G_i^rの交代性が功を奏して、ぱたぱたと項が消える
    • Gauss-Stokesの公式
      • \int_{\partial S} \omega = \int_S d\omegawdwはこのようにして定めた微分形式と外微分であって、この表現法を使うと、r次の微分形式を境界に関して積分したものと、その外微分を領域全体について積分したものとが一致する、ということが導ける
      • これは、空間が1次元のときには、外微分を領域(ここからここまで)について積分したものと、微分形式を境界(1次元線分の境界は2点)について向き・正負に注意して積分したものに一致することに対応する
        • f(b)-f(a)=\int_a^b f'(x)dx
  • 外積代数の計算をRでやってみる
    • 次元nのとき、要素数は、nからi個を取り出して、その順列になる(それ以外は、0になる)から、\sum_{i=0}^n \begin{pmatrix} n \\ i \end{pmatrix} \times i!。それらが、2^nの基本要素で張られる
    • 以下のソースではelemListが基本要素、allElemがすべての要素。MはallElemの演算結果を基本要素数の長さのベクトルで表している。またM2は、基本要素のどれに相当するかを符号つきで表している
# 次元
n<-3
s<-1:n
# 順列・置換に関して、その符号を計算するには、置換を表す行列のdeterminantが使える
s2<-sample(s)
M<-diag(rep(1,n))[s2,]
det(M)
# それを使って、演算を、要素の組(集合)と符号とで表すことにする
# その関数
SignaturePermutation<-function(s){
	n<-length(s)
	sig<-1
	if(n>1){
		s2<-order(s)
		M<-diag(rep(1,n))[s2,]
		sig<-det(M)
	}
	list(set=as.set(s),sign=sig)

}
# 二つの要素を演算処理するとき、要素の重複があれば0になるので、それをする関数を作る
a<-sample(s,sample(0:n))
a
SignaturePermutation(a)
a2<-sample(s,sample(0:n))
a2
SignaturePermutation(a2)


Zerocheck<-function(s1,s2){
	ret<-TRUE
	if(length(set_intersection(as.set(s1),as.set(s2)))==0){
		ret<-FALSE
	}
	ret
}
Zerocheck(a,a2)


# 集合のパッケージ
library(sets)
library(gtools)
t<-as.set(s)
# 冪集合を作る
# これは、基本要素のセットとなる
pow.t<-set_power(t)

# 2^n個の基本要素をリストにする
# ID、要素数の等しいものごとに束ねたときの束内ID、集合
elemList<-list()
cnt<-1
numcnt<-1
cntINnumcnt<-1
currentn<-0
elemList[[1]]<-list()
for(i in pow.t){
	n<-length(i)
	print(n)
	print(i)
	if(n>currentn){
		cntINnumcnt<-1
		numcnt<-numcnt+1
		currentn<-n
		elemList[[numcnt]]<-list()
	}
	elemList[[numcnt]][[cntINnumcnt]]<-list(id=cnt,id2=cntINnumcnt,set=i,n=length(i))
	cntINnumcnt<-cntINnumcnt+1
	cnt<-cnt+1
}

# 演算順を自由にした、すべてについての情報をリストにする
allElem<-list()
cnt<-1
v<-c()
tmp<-SignaturePermutation(v)
allElem[[cnt]]<-list(id=cnt,v=v,set=tmp$set,sign=tmp$sign)
cnt<-cnt+1
for(i in 1:n){
	tmpperm<-permutations(n,i)
	for(j in 1:length(tmpperm[,1])){
		v<-tmpperm[j,]
		tmp<-SignaturePermutation(v)
		allElem[[cnt]]<-list(id=cnt,v=v,set=tmp$set,sign=tmp$sign)
		cnt<-cnt+1
	}
}
allElem

N<-length(allElem)

M<-array(0,c(N,N,2^n))
M2<-matrix(0,N,N)
for(i in 1:N){
	for(j in 1:N){
		vi<-allElem[[i]]$v
		vj<-allElem[[j]]$v
		#if(!(length(vi)==0 & length(vj)==0)){
			if(!Zerocheck(vi,vj)){
				tmpv<-c(vi,vj)
				tmpout<-SignaturePermutation(tmpv)
				print(tmpv)
				tmplen<-length(tmpv)
				for(k in 1:length(elemList[[tmplen+1]])){
					if(tmpout$set==elemList[[tmplen+1]][[k]]$set){
						print(elemList[[tmplen+1]][[k]])
						print(M[i,j,])
						M[i,j,elemList[[tmplen+1]][[k]]$id]<-tmpout$sign
						M2[i,j]<-elemList[[tmplen+1]][[k]]$id*tmpout$sign
						print(M[i,j,])
					}
				}
			}
		#}
	}
}
M2
    • n=3の場合
> M2
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
 [1,]    0    2    3    4    5    6   -5    7   -6    -7     8    -8    -8     8     8    -8
 [2,]    2    0    5    6    0    0    0    8    0    -8     0     0     0     0     0     0
 [3,]    3   -5    0    7    0   -8    0    0    8     0     0     0     0     0     0     0
 [4,]    4   -6   -7    0    8    0   -8    0    0     0     0     0     0     0     0     0
 [5,]    5    0    0    8    0    0    0    0    0     0     0     0     0     0     0     0
 [6,]    6    0   -8    0    0    0    0    0    0     0     0     0     0     0     0     0
 [7,]   -5    0    0   -8    0    0    0    0    0     0     0     0     0     0     0     0
 [8,]    7    8    0    0    0    0    0    0    0     0     0     0     0     0     0     0
 [9,]   -6    0    8    0    0    0    0    0    0     0     0     0     0     0     0     0
[10,]   -7   -8    0    0    0    0    0    0    0     0     0     0     0     0     0     0
[11,]    8    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0
[12,]   -8    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0
[13,]   -8    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0
[14,]    8    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0
[15,]    8    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0
[16,]   -8    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0