「数理演算の基礎」

2019年より着手した「数理再勉強」用の倉庫。

【幾何学の基礎】立方眼(Cube grid)と四元数(Quaternion)

f:id:ochimusha01:20200211083924g:plain

 

これから言及する四元数quaterniona+bi +cj+dkの世界では、上掲の投稿で紹介した立方眼(Cube Grid)のスケーラビリティー平方数集めて組み立てると自己相似形となるい)はスカラー(scalar)aに吸収される形となります。なのでi^2=j^2=k^2=ijk=-1の範囲を単に-1から0にかけての格子の話だとイメージすると躓いてしまいます(私自身がエビデンス)。

格子関数(対角線を省略)

library(rgl)

#mo(Minus One),cp(Center Point),po(Plus One)
grid_draw01<-function(m,c,p){
#座標(Coordinate)合成関数Cd
cd<-function(a,b,c){paste0("(",a,",",b,",",c,")")}
#頂点座標=8個
texts3d(m,m,m,texts=cd(m,m,m),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(p,m,m,texts=cd(p,m,m),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(m,p,m,texts=cd(m,p,m),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(p,p,m,texts=cd(p,p,m),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(m,m,p,texts=cd(m,m,p),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(p,m,p,texts=cd(p,m,p),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(m,p,p,texts=cd(m,p,p),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(p,p,p,texts=cd(p,p,p),col=c(200,200,200),adj=1.0,cex=0.5)
#頂点間中点=1+6+12=19個
texts3d(c,c,c,texts=cd(c,c,c),col=rgb(0,0,0),adj=1.0)
texts3d(m,c,c,texts=cd(m,c,c),col=rgb(0,0,0),adj=1.0)
texts3d(c,m,c,texts=cd(c,m,c),col=rgb(0,0,0),adj=1.0)
texts3d(c,c,m,texts=cd(c,c,m),col=rgb(0,0,0),adj=1.0)
texts3d(p,c,c,texts=cd(p,c,c),col=rgb(0,0,0),adj=1.0)
texts3d(c,p,c,texts=cd(c,p,c),col=rgb(0,0,0),adj=1.0)
texts3d(c,c,p,texts=cd(c,c,p),col=rgb(0,0,0),adj=1.0)
texts3d(c,m,m,texts=cd(c,m,m),col=rgb(0,0,0),adj=1.0)
texts3d(c,m,p,texts=cd(c,m,p),col=rgb(0,0,0),adj=1.0)
texts3d(c,p,m,texts=cd(c,p,m),col=rgb(0,0,0),adj=1.0)
texts3d(c,p,p,texts=cd(c,p,p),col=rgb(0,0,0),adj=1.0)
texts3d(m,c,m,texts=cd(m,c,m),col=rgb(0,0,0),adj=1.0)
texts3d(m,c,p,texts=cd(m,c,p),col=rgb(0,0,0),adj=1.0)
texts3d(p,c,m,texts=cd(p,c,m),col=rgb(0,0,0),adj=1.0)
texts3d(p,c,p,texts=cd(p,c,p),col=rgb(0,0,0),adj=1.0)
texts3d(m,m,c,texts=cd(m,m,c),col=rgb(0,0,0),adj=1.0)
texts3d(m,p,c,texts=cd(m,p,c),col=rgb(0,0,0),adj=1.0)
texts3d(p,m,c,texts=cd(p,m,c),col=rgb(0,0,0),adj=1.0)
texts3d(p,p,c,texts=cd(p,p,c),col=rgb(0,0,0),adj=1.0)
#正六面体(Square)本体=6面

lines3d(c(m,p,p,m,m),c(m,m,p,p,m),c(m,m,m,m,m),col=c(200,200,200),lwd=1)
lines3d(c(m,p,p,m,m),c(m,m,p,p,m),c(p,p,p,p,p),col=c(200,200,200),lwd=1)
lines3d(c(m,m),c(m,m),c(m,p),col=c(200,200,200),lwd=1)
lines3d(c(p,p),c(m,m),c(m,p),col=c(200,200,200),lwd=1)
lines3d(c(m,m),c(p,p),c(m,p),col=c(200,200,200),lwd=1)
lines3d(c(p,p),c(p,p),c(m,p),col=c(200,200,200),lwd=1)
#頂点間中線=3+12=15本
lines3d(c(p,m),c(c,c),c(c,c),col=rgb(0,0,0),lwd=1)
lines3d(c(c,c),c(p,m),c(c,c),col=rgb(0,0,0),lwd=1)
lines3d(c(c,c),c(c,c),c(p,m),col=rgb(0,0,0),lwd=1)
lines3d(c(c,c,c,c,c),c(m,p,p,m,m),c(m,m,p,p,m),col=rgb(0,0,0),lwd=1)
lines3d(c(m,p,p,m,m),c(c,c,c,c,c),c(m,m,p,p,m),col=rgb(0,0,0),lwd=1)
lines3d(c(m,p,p,m,m),c(m,m,p,p,m),c(c,c,c,c,c),col=rgb(0,0,0),lwd=1)
}

 格子関数の描画

f:id:ochimusha01:20200211113527g:plain

grid_draw01(-1,0,1)
#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid001")

格子上におけるijkの展開範囲(間違ったイメージ)

f:id:ochimusha01:20200211122512g:plain

grid_draw01(-1,0,1)
#正六面体(Square)本体=6面
m<--1
p<-0

quads3d(matrix(c(
m,m,m,
m,m,p,
m,p,p,
m,p,m), nrow=4, byrow=T),col=rgb(1,0,0),lwd=1)

quads3d(matrix(c(
m,m,m,
m,m,p,
p,m,p,
p,m,m), nrow=4, byrow=T),col=rgb(1,0,0),lwd=1)

quads3d(matrix(c(
m,m,m,
m,p,m,
p,p,m,
p,m,m), nrow=4, byrow=T),col=rgb(1,0,0),lwd=1)

quads3d(matrix(c(
p,m,m,
p,m,p,
p,p,p,
p,p,m), nrow=4, byrow=T),col=rgb(1,0,0),lwd=1)

quads3d(matrix(c(
m,p,m,
m,p,p,
p,p,p,
p,p,m), nrow=4, byrow=T),col=rgb(1,0,0),lwd=1)

quads3d(matrix(c(
m,m,p,
m,p,p,
p,p,p,
p,m,p), nrow=4, byrow=T),col=rgb(1,0,0),lwd=1)
#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid002") 

i^2=j^2=k^2=-1の不成立。座標(-1,-1,-1)に到達しない。

f:id:ochimusha01:20200211132923g:plain

grid_draw01(-1,0,1)
m=-1
c=0
p=1
lines3d(c(c,m,m),c(c,c,m),c(c,c,c),col=rgb(1,0,0),lwd=3)
lines3d(c(c,c,m),c(c,c,c),c(c,m,m),col=rgb(0,0,1),lwd=3)
lines3d(c(c,c,c),c(c,m,m),c(c,c,m),col=rgb(0,1,0),lwd=3)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid003")

ijk=-1の成立。座標(-1,-1,-1)に到達。
f:id:ochimusha01:20200211133828g:plain

grid_draw01(-1,0,1)
m=-1
c=0
p=1
lines3d(c(c,m),c(c,c),c(c,c),col=rgb(1,0,0),lwd=3)
lines3d(c(m,m),c(c,m),c(c,c),col=rgb(0,0,1),lwd=3)
lines3d(c(m,m),c(m,m),c(c,m),col=rgb(0,1,0),lwd=3)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid004")

実は立方体のスケーラビリティー(立法数で増やせば相似形となる)の関係から、この関係を+1から-1にかけての座標に転写しても状態は何も変わりません。まずはi^2=j^2=k^2=-1が成立せず、座標(-1,-1,-1)に到達しない件について。

f:id:ochimusha01:20200211134925g:plain

grid_draw01(-1,0,1)
m=-1
c=0
p=1
lines3d(c(p,m,m),c(p,p,m),c(p,p,p),col=rgb(1,0,0),lwd=3)
lines3d(c(p,p,m),c(p,p,p),c(p,m,m),col=rgb(0,0,1),lwd=3)
lines3d(c(p,p,p),c(p,m,m),c(p,p,m),col=rgb(0,1,0),lwd=3)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid005")

次いでijk=-1なら成立し、座標(-1,-1,-1)に到達する件について。
f:id:ochimusha01:20200211135836g:plain

grid_draw01(-1,0,1)
m=-1
c=0
p=1
lines3d(c(p,m),c(p,p),c(p,p),col=rgb(1,0,0),lwd=3)
lines3d(c(m,m),c(p,m),c(p,p),col=rgb(0,0,1),lwd=3)
lines3d(c(m,m),c(m,m),c(p,m),col=rgb(0,1,0),lwd=3)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid006")

要するにij=k,ik=j,jk=iが成立すればi^2=j^2=k^2=-1も成立した事になり、座標(-1,-1,-1)へと到達するのです(右手の法則に従って、ただし符号がマイナスなので逆進して2回曲がる)。

ij=k

f:id:ochimusha01:20200211143219g:plain

grid_draw01(-1,0,1)
m=-1
c=0
p=1
lines3d(c(p,m),c(p,p),c(p,p),col=rgb(1,0,0),lwd=3)
lines3d(c(m,m),c(p,m),c(p,p),col=rgb(0,0,1),lwd=3)
lines3d(c(m,m),c(m,m),c(p,m),col=rgb(0,1,0),lwd=3)
lines3d(c(p,m),c(p,m),c(p,p),col=rgb(0,1,0),lwd=3)

 #アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid007")

 ik=j

f:id:ochimusha01:20200211143854g:plain

grid_draw01(-1,0,1)
m=-1
c=0
p=1
lines3d(c(p,m),c(p,p),c(p,p),col=rgb(1,0,0),lwd=3)
lines3d(c(m,m),c(p,p),c(p,m),col=rgb(0,1,0),lwd=3)
lines3d(c(m,m),c(p,m),c(m,m),col=rgb(0,0,1),lwd=3)
lines3d(c(p,m),c(p,p),c(p,m),col=rgb(0,0,1),lwd=3)

 #アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid008")

 jk=i

f:id:ochimusha01:20200211150200g:plain

grid_draw01(-1,0,1)
m=-1
c=0
p=1
lines3d(c(p,p),c(p,m),c(p,p),col=rgb(0,0,1),lwd=3)
lines3d(c(p,p),c(m,m),c(p,m),col=rgb(0,1,0),lwd=3)
lines3d(c(p,m),c(m,m),c(m,m),col=rgb(1,0,0),lwd=3)
lines3d(c(p,p),c(p,m),c(p,m),col=rgb(1,0,0),lwd=3)

 #アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid009")

すなわち同時にji=-k,ki=-j,kj=-iが成立します(2回曲がるうち片方が右手の法則に逆らう動きで残りが従う動きとなるので(-1,-1,-1)に到達する為に符号が逆転する)。実はこれこそが外積(Outer product)概念の大源流なのです。

ji=-k

f:id:ochimusha01:20200211151516g:plain

grid_draw01(-1,0,1)
m=-1
c=0
p=1
lines3d(c(p,p),c(p,m),c(p,p),col=rgb(0,0,1),lwd=3)
lines3d(c(p,m),c(m,m),c(p,p),col=rgb(1,0,0),lwd=3)
lines3d(c(m,m),c(m,m),c(p,m),col=rgb(0,1,0),lwd=3)
lines3d(c(p,m),c(p,m),c(p,p),col=rgb(0,1,0),lwd=3)

 #アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid010") 

ki=-j

f:id:ochimusha01:20200211152337g:plain

grid_draw01(-1,0,1)
m=-1
c=0
p=1
lines3d(c(p,p),c(p,p),c(p,m),col=rgb(0,1,0),lwd=3)
lines3d(c(p,p),c(p,m),c(m,m),col=rgb(1,0,0),lwd=3)
lines3d(c(p,m),c(m,m),c(m,m),col=rgb(0,0,1),lwd=3)
lines3d(c(p,p),c(p,m),c(p,m),col=rgb(0,0,1),lwd=3)

 #アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid011")

kj=-i

f:id:ochimusha01:20200211152625g:plain

grid_draw01(-1,0,1)
m=-1
c=0
p=1
lines3d(c(p,p),c(p,p),c(p,m),col=rgb(0,1,0),lwd=3)
lines3d(c(p,p),c(p,m),c(m,m),col=rgb(0,0,1),lwd=3)
lines3d(c(p,m),c(m,m),c(m,m),col=rgb(1,0,0),lwd=3)
lines3d(c(p,p),c(p,m),c(p,m),col=rgb(1,0,0),lwd=3)

 #アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/grid012")

所謂「四元数の乗算表」は、こうした考え方に由来するのですが、いかんせん数字があってません(1と1ではなく1とsqrt(2))。

統計言語Rによる作表例

 #三角比(Triangle Ratio)一覧

ijk<-c("-1","k","-j")
jki<-c("-k","-1","i")
kij<-c("j","-i","-1")
TR01<- data.frame(i=ijk,j=jki,k=kij)

colnames(TR01)<-c("i","j","k")
rownames(TR01)<-c("i","j","k")
library(xtable)
print(xtable(TR01),type="html")

  i j k
i -1 -k j
j k -1 -i
k -j i -1

さて、四元数quaternion)の考案者ハミルトン(William Rowan Hamilton、1805年~1865年)は、こうした壁をどうやって乗り越えたのでしょうか? 以下続報…