「諸概念の迷宮(Things got frantic)」用語集

本編で頻繁に使うロジックと関連用語のまとめ。

【指数・対数関数】【三角関数】【複素数座標系】「オイラーの巾着袋(Drawstring bag)」こと「オイラーの等式(e^πi=-1)」から「オイラーの原始量(Euler's primitive sweep)」へ

オイラーの等式e^πi=-1)」の証明については、Wikipediaにこうあります。

オイラーの等式(Euler's identity) - Wikipedia

指数関数 e^z は (1+z/N)^NのN が無限に大きくなるときの極限として定義でき、e^iπは その極限値となる。このアニメーションでは、N の値を1から100まで増加させている。複素数平面において1 + iπ/Nの累乗を点で表示しており、折れ線の端点が (1+iπ/N)^Nとなる。これにより、N の増加に伴って (1 + iπ/N)^N が−1に近付く様子が観察される。

f:id:ochimusha01:20190408165725g:plain

統計言語Rで追証してみましょう。そもそも上掲の式はヤコブ・ベルヌーイが自然対数eの導出に用いた複利計算式(1+1/N)^Nに立脚しています。

#オイラーの等式ヤコブ・ベルヌーイ方式による作図)

Eulers_identity<-function(n){
rim01<-pi*complex(real=0,imaginary=1)
Tarm=c(complex(real=1,imaginary=0),seq(rim01/n,rim01/n,length=n))
Reduce(function(a,b) {a+a*b}, Tarm, accumulate = T)

}
theta <- seq(pi, -pi, length=360) #円周率(ラジアン表記)

Eulers_identity00_plot<-function(n){
plot(cos(theta), sin(theta), xlim=c(-2,1),ylim=c(0,4),type="l",col=rgb(0,1,0), main="Euler’s identity", xlab="Real Expanse", ylab="Imaginary Expanse")
par(new=T) # 上書き指定

plot(Re(Eulers_identity(n)),Im(Eulers_identity(n)),xlim=c(-2,1),ylim=c(0,4),type="l",main="", xlab="", ylab="")

text(0, 0, "0",col=rgb(0,0,0))
text(1, 0, "1",col=rgb(0,0,1))
text(-1, 0, "-1",col=rgb(1,0,0))
text(0, 1, "π",col=rgb(0,1,0))
segments(0,0,1,0,col=rgb(0,0,1))
segments(0,0,-1,0,col=rgb(1,0,0))
}

#アニメーションさせてみる。
library("animation")
Time_Code=c(1,2,4,8,16,32,64,128)
saveGIF({
for (i in Time_Code){
  Eulers_identity00_plot(i)
}
}, interval = 0.1, movie.name = "TEST.gif")

f:id:ochimusha01:20190419000412g:plain

一方、オイラーはネイピアの対数表の底「0.9999999」から出発してるので、最初は(1-1/N)^Nの計算式でこの問題を解いたと考えられています。

#オイラーの等式オイラー方式による作図)

Eulers_identity<-function(n){
rim01<-pi*complex(real=0,imaginary=1)
Tarm=c(complex(real=1,imaginary=0),seq(rim01/n,rim01/n,length=n))
Reduce(function(a,b) {a-a*b}, Tarm, accumulate = T)

}
theta <- seq(pi, -pi, length=360) #円周率(ラジアン表記)

Eulers_identity00_plot<-function(n){
plot(cos(theta), sin(theta), xlim=c(-2,1),ylim=c(-4,0),type="l",col=rgb(0,1,0), main="Euler’s identity", xlab="Real Expanse", ylab="Imaginary Expanse")
par(new=T) # 上書き指定

plot(Re(Eulers_identity(n)),Im(Eulers_identity(n)),xlim=c(-2,1),ylim=c(-4,0),type="l",main="", xlab="", ylab="")

text(0, 0, "0",col=rgb(0,0,0))
text(1, 0, "1",col=rgb(0,0,1))
text(-1, 0, "-1",col=rgb(1,0,0))
text(0, 1, "π",col=rgb(0,1,0))
segments(0,0,1,0,col=rgb(0,0,1))
segments(0,0,-1,0,col=rgb(1,0,0))
}

#アニメーションさせてみる。
library("animation")
Time_Code=c(1,2,4,8,16,32,64,128)
saveGIF({
for (i in Time_Code){
  Eulers_identity00_plot(i)
}
}, interval = 0.1, movie.name = "TEST.gif")

f:id:ochimusha01:20190419001208g:plain

この2つの計算結果は複素図表上において共役関係にあり、それぞれが半周分を担当する事によって全周を構成するのです。

#オイラーの等式(全周分)

Eulers_identity<-function(n){
rim01<-pi*complex(real=0,imaginary=1)
Tarm=c(complex(real=1,imaginary=0),seq(rim01/n,rim01/n,length=n))
Reduce(function(a,b) {a+a*b}, Tarm, accumulate = T)

}
theta <- seq(pi, -pi, length=360) #円周率(ラジアン表記)
#グラフを描画してみる。
Eulers_identity01_plot<-function(n){
ei01<-Eulers_identity(n)
ei02<-Conj(ei01)
plot(cos(theta), sin(theta), xlim=c(-2,1),ylim=c(-4,4),type="l",col=rgb(0,1,0), main="Euler’s identity", xlab="Real Expanse", ylab="Imaginary Expanse")
par(new=T) # 上書き指定
plot(Re(ei01),Im(ei01),xlim=c(-2,1),ylim=c(-4,4),type="l",main="", xlab="", ylab="")
par(new=T) # 上書き指定
plot(Re(ei02),Im(ei02),xlim=c(-2,1),ylim=c(-4,4),type="l",main="", xlab="", ylab="")
text(0, 0, "0",col=rgb(0,0,0))
text(1, 0, "1",col=rgb(0,0,1))
text(-1, 0, "-1",col=rgb(1,0,0))
text(0, 1, "π",col=rgb(0,1,0))
text(0, -1, "π",col=rgb(0,1,0))
segments(0,0,1,0,col=rgb(0,0,1))
segments(0,0,-1,0,col=rgb(1,0,0))
}

#アニメーションさせてみる。

library("animation")
Time_Code=c(1,2,4,8,16,32,64,128)
saveGIF({
for (i in Time_Code){
  Eulers_identity01_plot(i)
}
}, interval = 0.1, movie.name = "TEST.gif")

f:id:ochimusha01:20190418235412g:plain

全体像を俯瞰すると観測原点「0,0…」からの全周視界(Perspective)形成過程とも見て取れます。

#オイラーの等式(全周分)

Eulers_identity<-function(n){
rim01<-pi*complex(real=0,imaginary=1)
Tarm=c(complex(real=1,imaginary=0),seq(rim01/n,rim01/n,length=n))
Reduce(function(a,b) {a+a*b}, Tarm, accumulate = T)

}
theta <- seq(pi, -pi, length=360) #円周率(ラジアン表記)
#グラフを描画してみる。
Eulers_identity01_plot<-function(n){
ei01<-Eulers_identity(n)
ei02<-Conj(ei01)
plot(cos(theta), sin(theta), xlim=c(-2,1),ylim=c(-4,4),type="l",col=rgb(0,1,0), main="Euler’s identity", xlab="Real Expanse", ylab="Imaginary Expanse")
par(new=T) # 上書き指定
plot(Re(ei01),Im(ei01),xlim=c(-2,1),ylim=c(-4,4),type="l",main="", xlab="", ylab="")
par(new=T) # 上書き指定
plot(Re(ei02),Im(ei02),xlim=c(-2,1),ylim=c(-4,4),type="l",main="", xlab="", ylab="")
#観測原点からの視界(Perspective)追加。
Expanse01<-c(1,Re(ei01),0,rev(Re(ei02)),1)
Expanse02<-c(0,Im(ei01),0,rev(Im(ei02)),0)
polygon(Expanse01, #x
Expanse02, #y
density=c(30), #塗りつぶす濃度
angle=c(45),     #塗りつぶす斜線の角度
col=rgb(0,1,0))  #塗りつぶす色
text(0, 0, "0",col=rgb(0,0,0))
text(1, 0, "1",col=rgb(0,0,1))
text(-1, 0, "-1",col=rgb(1,0,0))
text(0, 1, "π",col=rgb(0,1,0))
text(0, -1, "π",col=rgb(0,1,0))
segments(0,0,1,0,col=rgb(0,0,1))
segments(0,0,-1,0,col=rgb(1,0,0))
}

#アニメーションさせてみる。

library("animation")
Time_Code=c(1,2,4,8,16,32,64,128)
saveGIF({
for (i in Time_Code){
  Eulers_identity01_plot(i)
}
}, interval = 0.1, movie.name = "TEST.gif")

f:id:ochimusha01:20190419005154g:plain

①N(分割数)=1の時、観測原点「0,0…」からの視界(Perspective)では「半径πの円盤」と映る。
*単位円空間における「tan(pi/2)」、複素数空間における「1+πi」に該当。

f:id:ochimusha01:20190419023801p:plain

②Nが増大するにつれ、観測原点からの視界(Perspective)は急速に全球に近付く。
*実際には「半球」というより「3/4球」という感じ。そもそも複利計算式(1+1/N)^Nがベースになってるくらいだから、出足の伸びは物凄くグイグイ迫ってくる。

f:id:ochimusha01:20190419023836p:plain

f:id:ochimusha01:20190419031323p:plain
③ただしNがどれだけ増大しても複素数空間における「-1+0i」の方角は完全には埋まらない。すなわち全球観測原点からの視界(Perspective)が完成する事はない。

f:id:ochimusha01:20190419024537p:plain
こうした検討を経て浮かび上がってくるのが「オイラーの原始量Euler's primitive sweep)=観測原点をすっぽり包む全球型スクリーン」の世界観なのです。