【Rで球面幾何学】「半円しか描けなかった」世界の思い出？

一般に**三平方の定理**（<font color=blue>Three square theorem</font>）」あるいは**ピタゴラスの定理**（<font color=blue>Pythagorean Theorem</font>）として知られる<font color=green>X^2+Y^2=Z^2</font>の式、すなわち**単位円**（<font color=blue>Unit Circle、半径1の円弧</font>）上では<font color=green>x^2+y^2=1</font>、**単位球面**（<font color=blue>Unit Circle、半径1の球面</font>）上では<font color=green>x^2+y^2+z^2=1</font>となる定理について。
[【初心者向け】ピタゴラスの定理あるいは三平方の定理からの出発](https://qiita.com/ochimusha01/items/4c7f731b0ef3cc998aa1)
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_597772_c7cb8211-2ac7-8acb-c35a-573af944e931.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/e8e0b211-1b2d-8c5b-c773-f83e12dec147.gif)

# 「<font color=purple>半円しか描けなかった</font>」世界

しばしば<font color=green>y</font>の値を<font color=green>x</font>で求める関数に変換された<font color=green>y=sqrt(1-x^2)</font>の形式でも用いられますが、この形だと<font color=green>x^2>1</font>の時、平方根の概念で扱い切れなくなって答えが出ません。<font color=green>x</font>の値をy</font>で求める関数に変換された<font color=green>x=sqrt(1-y^2)</font>の場合も、やはり<font color=green>y^2>1</font>の時答えが出ず、従って数学史のある段階までこの関数は「**半円ずつしか描けない**」「<font color=purple>従って</font><font color=green>y=sqrt(1-x^2)</font><font color=purple>と</font><font color=green>y=-sqrt(1-x^2)</font><font color=purple>、あるいは</font><font color=green>x=sqrt(1-y^2)</font><font color=purple>と</font><font color=green>x=-sqrt(1-y^2)</font><font color=purple>の式のセットで運用するもの</font>」と考えられていたのでした。

# <font color=green>X</font>の関数として<font color=green>Y</font>を求めた場合の「<font color=purple>半円しか描けない</font>」

**平方根展開**時に<font color=green>0除算</font>が発生しないのは**第一象限**（<font color=blue>X=>0かつY=>0</font>）と**第二象限**（<font color=blue>X=<0かつY=>0</font>）となります。

Rの場合
![CFS02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/2dfd4ce6-a552-f9c1-31c2-d474d39fad5c.gif)

```R
#CFS=Circle Function Single
CFS<-function(Radian){
cx<-seq(-1,1,length=60)
f0<-function(x) sqrt(1-x^2)
cy<-f0(cx)
plot(cx,cy,asp=1,type="l",main="X^2+Y^2=1",xlab="X",ylab="sqrt(1-X^2)")

#塗りつぶし（背景）
polygon(cx, #x
cy, #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=c(200,200,200)) 　#塗りつぶす色

#塗りつぶし（三角）
polygon(c(-1,cx[Radian],1), #x
c(0,cy[Radian],0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(0,0,1)) 　#塗りつぶす色
#線追加（三角）
segments(cx[Radian],cy[Radian],cx[Radian],0,col=c(100,100,100))

#文字追加
text(c(-1,cx[Radian],1,cx[Radian]),c(0,cy[Radian],0,0), labels=c("a","b","c","d"),col=c(rgb(0,0,0),rgb(0,0,0),rgb(0,0,0),rgb(0,0,0)),cex=c(2,2,2,2))

}
#アニメーション
library("animation")
Time_Code=rev(seq(1,59, length=30))
saveGIF({
for (i in Time_Code){
　CFS(i)
}
}, interval = 0.1, movie.name = "CFS02.gif")
```
Pythonの場合
![output02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/e03fe927-3269-4d6f-5e17-e6a669c2de8c.gif)

```python
%matplotlib nbagg
import math as m
import cmath as c
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

#単位円データ作成
c0=np.linspace(0,m.pi,61,endpoint = True)
s0=[]
for num in range(len(c0)):
    s0.append(complex(m.cos(c0[num]),m.sin(c0[num])))
s1=np.array(s0)
plt.style.use('default')
fig = plt.figure()

#関数定義
def unit_circle(n):
    plt.cla()
    #スポーク線描画
    for num in range(len(s1)):
        plt.plot([0,s1[num].real],[0,s1[num].imag],color="gray",lw=0.5);    
    #円周描画
    plt.plot(s1.real,s1.imag,color="blue", label="Unit Cylinder")
    plt.ylim([0,1.1])
    plt.xlim([-1.1,1.1])
    plt.title("Pythagorean Theorem")
    plt.xlabel("Real")
    plt.ylabel("Imaginal")
    ax = fig.add_subplot(111)
    ax.set_aspect('equal', adjustable='box')
    ax.legend(loc='upper right')
    #補助線描画
    plt.axvline(0, 0, 1,color="purple")
    plt.axhline(0, 0, 1,color="purple")
    #移動線描画
    plt.plot([0,s1[n].real],[0,s1[n].imag],color="red",lw=1)
    plt.plot([s1[n].real,s1[n].real],[0,s1[n].imag],color="green",lw=1)
    plt.plot([1,s1[n].real],[0,s1[n].imag],color="green",lw=1)
    plt.plot([-1,s1[n].real],[0,s1[n].imag],color="green",lw=1)
    plt.fill([1,s1[n].real,-1,1],[0,s1[n].imag,0,0],color="lightgreen")
    plt.text(-1, 0, "A")
    plt.text(1, 0, "B")
    plt.text(s1[n].real, s1[n].imag, "C")
    plt.text(s1[n].real, 0, "D")
    
ani = animation.FuncAnimation(fig, unit_circle, interval=50,frames=len(s1))
ani.save("desktop/output02.gif", writer="pillow")
```



<font color=green>x</font>の値が<font color=green>1</font>から<font color=green>0</font>を経て<font color=green>-1</font>に推移する**関数**<font color=green>y=sqrt(1-x^2)</font>の内容は**三角関数**(<font color=blue>Trigonometric Function</font>)的に**表現**(<font color=blue>Expression</font>)すると、**角度**<font color=green>θ</font>の<font color=green>0ラジアン</font>(<font color=blue>0度</font>)から<font color=green>π/2ラジアン</font>(<font color=blue>90度</font>)を経て<font color=green>πラジアン</font>(<font color=blue>180度</font>)に推移する変遷を扱った形となります。**頂点**<font color=green>b</font>および**頂点**<font color=green>d</font>の<font color=green>x</font>**座標値**が<font color=green>Cos(θ)</font>,**頂点**<font color=green>b</font>の<font color=green>y</font>**座標値**が<font color=green>Sin(θ)</font>に対応。
[【初心者向け】「円そのもの」の近似から派生した角度概念の起源](https://qiita.com/ochimusha01/items/80b70db93cbf2612bd18)
![CFD01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/0ba98cbe-b449-9b1d-b0f0-4a6b60e55f35.gif)

```R
CFD<-function(Radian){
cx<-seq(-1,1,length=60)
f0<-function(x) sqrt(1-x^2)
cy<-f0(cx)
plot(cx,cy,asp=1,type="l",xlim=c(-1,1),ylim=c(-1,1),main="X^2+Y^2=1",xlab="X",ylab="sqrt(1-X^2) &-sqrt(1-X^2) ")

par(new=T)#上書き指定

plot(cx,-1*cy,asp=1,type="l",xlim=c(-1,1),ylim=c(-1,1),main="",xlab="",ylab="")

#塗りつぶし（上背景）
polygon(cx, #x
cy, #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=c(200,200,200)) 　#塗りつぶす色
#塗りつぶし（下背景）

polygon(cx, #x
-cy, #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=c(200,200,200)) 　#塗りつぶす色

#塗りつぶし（上三角）
polygon(c(-1,cx[Radian],1), #x
c(0,cy[Radian],0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(0,0,1)) 　#塗りつぶす色

#塗りつぶし（下三角）
cx1<-rev(cx)
cy1<-rev(cy)*-1
polygon(c(1,cx1[Radian],-1), #x
c(0,cy1[Radian],0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(1,0,0)) 　#塗りつぶす色

#線追加（三角）
segments(cx[Radian],cy[Radian],cx[Radian],0,col=rgb(0,0,1))
segments(cx1[Radian],cy1[Radian],cx1[Radian],0,col=rgb(1,0,0))

#文字追加
text(c(-1,cx[Radian],1,cx[Radian],-cx[Radian],-cx[Radian]),c(0,cy[Radian],0,0,-cy[Radian],0), labels=c("a","b","c","d","e","f"),col=c(rgb(0,0,0),rgb(0,0,0),rgb(0,0,0),rgb(0,0,0),rgb(0,0,0)),cex=c(2,2,2,2,2,2))

#凡例
legend("bottomright", legend=c("sqrt(1-X^2)","-sqrt(1-X^2)"), lty=c(1,1), col=c(rgb(0,0,1),rgb(1,0,0)))

}
#アニメーション
library("animation")
Time_Code=rev(seq(1,59, length=30))
saveGIF({
for (i in Time_Code){
　CFD(i)
}
}, interval = 0.1, loop=TRUE, movie.name = "CFD01.gif")
```
<font color=green>x</font>の値が<font color=green>-1</font>から<font color=green>0</font>を経て<font color=green>1</font>に推移する**関数**<font color=green>y=sqrt(1-x^2)</font>の内容は**三角関数**(<font color=blue>Trigonometric Function</font>)的に**表現**(<font color=blue>Expression</font>)すると、**角度**<font color=green>θ</font>の<font color=green>πラジアン</font>(<font color=blue>180度</font>)から<font color=green>3/4πラジアン</font>(<font color=blue>270度</font>)あるいは<font color=green>-π/2ラジアン</font>(<font color=blue>-90度</font>)を経て<font color=green>2πラジアン</font>(<font color=blue>360度</font>)あるいは<font color=green>０ラジアン</font>(<font color=blue>0度</font>)に推移する変遷を扱った形となります。**頂点**<font color=green>e</font>および**頂点**<font color=green>f</font>の<font color=green>x</font>**座標値**が<font color=green>Cos(θ)</font>,**頂点**<font color=green>e</font>の<font color=green>y</font>**座標値**が<font color=green>Sin(θ)</font>に対応。
[【Rで球面幾何学】「円そのもの」の近似から派生した角度概念の起源](https://qiita.com/ochimusha01/items/80b70db93cbf2612bd18)
あれ? **複素共役**/**複素共軛**(<font color=blue>Complex Conjugate</font>）の実数部分の動きと同じではありませんか？
[複素共役 - Wikipedia](https://ja.wikipedia.org/wiki/%E8%A4%87%E7%B4%A0%E5%85%B1%E5%BD%B9)

#<font color=green>Y</font>の関数として<font color=green>X</font>を求めた場合の「<font color=purple>半円しか描けない</font>」
**平方根展開**時に<font color=green>0除算</font>が発生しないのは**第一象限**（<font color=blue>Y=>0かつX=>0</font>）と**第四象限**（<font color=blue>Y=<0かつX=>0</font>）となります。
![CFS90Sift01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/e7d3de2f-ac39-1445-a444-42778bdad85c.gif)

```R
#CFS90Sift=Circle Function Single 90Sift
CFS90Sift<-function(Radian){
cx<-seq(-1,1,length=60)
f0<-function(x) sqrt(1-x^2)
cy<-f0(cx)
plot(cy,cx,asp=1,type="l",main="X^2+Y^2=1",xlab="sqrt(1-Y^2)",ylab="Y")

#塗りつぶし（背景）
polygon(cy, #x
cx, #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=c(200,200,200)) 　#塗りつぶす色

#塗りつぶし（三角）
polygon(c(0,cy[Radian],0), #x
c(-1,cx[Radian],1), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(0,0,1)) 　#塗りつぶす色

#線追加（三角）
segments(cy[Radian],cx[Radian],0,cx[Radian],col=c(100,100,100))

#文字追加
text(c(0,cy[Radian],0,0),c(1,cx[Radian],-1,cx[Radian]), labels=c("a","b","c","d"),col=c(rgb(0,0,0),rgb(0,0,0),rgb(0,0,0),rgb(0,0,0)),cex=c(2,2,2,2))

}
#アニメーション
library("animation")
Time_Code=rev(seq(1,59, length=30))
saveGIF({
for (i in Time_Code){
　CFS90Sift(i)
}
}, interval = 0.1, movie.name = "CFS90Sift01.gif")
```
<font color=green>y</font>の値が<font color=green>1</font>から<font color=green>0</font>を経て<font color=green>-1</font>に推移する**関数**<font color=green>x=sqrt(1-y^2)</font>の内容は**三角関数**(<font color=blue>Trigonometric Function</font>)的に**表現**(<font color=blue>Expression</font>)すると、**角度**<font color=green>θ</font>の<font color=green>π/2ラジアン</font>(<font color=blue>90度</font>)から<font color=green>0ラジアン</font>(<font color=blue>0度</font>)を経て<font color=green>3/4πラジアン</font>(<font color=blue>270度</font>)あるいは<font color=green>-πラジアン</font>(<font color=blue>-90度</font>)に推移する変遷を扱った形となります。**頂点**<font color=green>b</font>の<font color=green>x</font>**座標値**が<font color=green>Cos(θ)</font>,**頂点**<font color=green>b</font>および**頂点**<font color=green>d</font>の<font color=green>y</font>**座標値**が<font color=green>Sin(θ)</font>に対応。
[【Rで球面幾何学】「円そのもの」の近似から派生した角度概念の起源](https://qiita.com/ochimusha01/items/80b70db93cbf2612bd18)
![CFD90Sift02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/dae51c2d-b2ce-515b-c55e-d8dec59a0760.gif)

```R
#CFD90Sift=Circle Function Double 90Sift
CFD90Sift<-function(Radian){
cx<-seq(-1,1,length=60)
f0<-function(x) sqrt(1-x^2)
cy<-f0(cx)
plot(cy,cx,asp=1,type="l",xlim=c(-1,1),ylim=c(-1,1),main="X^2+Y^2=1",xlab="sqrt(1-Y^2) &-sqrt(1-Y^2)",ylab="Y")

par(new=T)#上書き指定

plot(cy*-1,cx,asp=1,type="l",xlim=c(-1,1),ylim=c(-1,1),main="",xlab="",ylab="")

#塗りつぶし（上背景）
polygon(cy, #x
cx, #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=c(200,200,200)) 　#塗りつぶす色

#塗りつぶし（下背景）
polygon(-cy, #x
cx, #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=c(200,200,200)) 　#塗りつぶす色

#塗りつぶし（上三角）
polygon(c(0,cy[Radian],0), #x
c(-1,cx[Radian],1), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(0,0,1)) 　#塗りつぶす色

#塗りつぶし（下三角）
cx1<-rev(cx)
cy1<-rev(cy)*-1
polygon(c(0,cy1[Radian],0), #x
c(1,cx1[Radian],-1), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(1,0,0)) 　#塗りつぶす色

#線追加（三角）
segments(cy[Radian],cx[Radian],0,cx[Radian],col=rgb(0,0,1))
segments(cy1[Radian],cx1[Radian],0,cx1[Radian],col=rgb(1,0,0))

#文字追加
text(c(0,cy[Radian],0,0,-cy[Radian],0),c(1,cx[Radian],-1,cx[Radian],-cx[Radian],-cx[Radian]), labels=c("a","b","c","d","e","f"),col=c(rgb(0,0,0),rgb(0,0,0),rgb(0,0,0),rgb(0,0,0),rgb(0,0,0)),cex=c(2,2,2,2,2,2))
#凡例
legend("bottomright", legend=c("sqrt(1-Y^2)","-sqrt(1-Y^2)"), lty=c(1,1), col=c(rgb(0,0,1),rgb(1,0,0)))
}

#アニメーション
library("animation")
Time_Code=rev(seq(1,59, length=30))
saveGIF({
for (i in Time_Code){
　CFD90Sift(i)
}
}, interval = 0.1, movie.name = "CFD90Sift02.gif")
```
<font color=green>y</font>の値が<font color=green>-1</font>から<font color=green>0</font>を経て<font color=green>1</font>に推移する**関数**<font color=green>x=sqrt(1-y^2)</font>の内容は**三角関数**(<font color=blue>Trigonometric Function</font>)的に**表現**(<font color=blue>Expression</font>)すると、**角度**<font color=green>θ</font>の<font color=green>π/2ラジアン</font>(<font color=blue>90度</font>)から<font color=green>2πラジアン</font>(<font color=blue>360度</font>)あるいは<font color=green>０ラジアン</font>(<font color=blue>0度</font>)を経て<font color=green>3/4πラジアン</font>(<font color=blue>270度</font>)あるいは<font color=green>-π/2ラジアン</font>(<font color=blue>-90度</font>)に推移する変遷を扱った形となります。**頂点**<font color=green>e</font>および**頂点**<font color=green>f</font>の<font color=green>x</font>**座標値**が<font color=green>Cos(θ)</font>,**頂点**<font color=green>e</font>の<font color=green>y</font>**座標値**が<font color=green>Sin(θ)</font>に対応。
[【Rで球面幾何学】「円そのもの」の近似から派生した角度概念の起源](https://qiita.com/ochimusha01/items/80b70db93cbf2612bd18)
あれ? **複素共役**/**複素共軛**(<font color=blue>Complex Conjugate</font>）の虚数部分の動きと同じではありませんか？
[複素共役 - Wikipedia](https://ja.wikipedia.org/wiki/%E8%A4%87%E7%B4%A0%E5%85%B1%E5%BD%B9)

ちなみに**角**<font color=green>adb</font>と**角**<font color=green>cdb</font>が**直角**、すなわち<font color=green>π/2ラジアン</font>(<font color=blue>90度</font>)に保たれ続けるので、三角形の内角の和が<font color=green>πラジアン</font>(<font color=blue>180度</font>)となる性質から（<font color=blue>その残りである</font>）**角**<font color=green>dbc</font>=**角**<font color=green>dab</font>(<font color=blue>角度θに従って0ラジアン(0度)からπラジアン(180度)にかけて変遷</font>)と**角**<font color=green>bcd</font>=**角**<font color=green>dab</font>(<font color=blue>角度-θに従ってπラジアン(180度)から0ラジアン(0度)にかけて遷移</font>)の和もまた直角に保たれ続けます。**半径**<font color=green>R</font>の円に内接する**三角形**<font color=green>ABC</font>における**正弦定理**（<font color=blue>law of sines</font>）**線分**<font color=green>AB</font>/<font color=green>Sin</font>(<font color=blue>角BCA</font>)=**線分**<font color=green>BC</font>/<font color=green>Sin</font>(<font color=blue>角CAB</font>)=**線分**<font color=green>CA</font>/<font color=green>Sin</font>(<font color=blue>角ABC</font>)=<font color=green>2πR</font>の特殊例。

#合わせて「<font color=purple>3/4までは円が描ける</font>」世界

要するにこうしたアプローチによっては手が出せなかったのは、**第三象限**（<font color=blue>X=<0かつY=<0</font>）のみだったとも考えられる訳です。
![CFC001.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/9c314439-c60a-7804-c2ae-26d0f6382a23.gif)

```R
#CFC=Circle Function Closs
CFC<-function(Radian){
cx<-seq(-1,1,length=60)
f0<-function(x) sqrt(1-x^2)
cy<-f0(cx)
plot(cx,cy,asp=1,type="l",xlim=c(-1,1),ylim=c(-1,1),main="X^2+Y^2=1",xlab="sqrt(1-Y^2)",ylab="sqrt(1-X^2)")

par(new=T)#上書き指定

plot(cy,cx,asp=1,type="l",xlim=c(-1,1),ylim=c(-1,1),main="",xlab="",ylab="")

#塗りつぶし（X軸）
polygon(cx, #x
cy, #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=c(200,200,200)) 　#塗りつぶす色

#塗りつぶし（Y軸）
polygon(cy, #x
cx, #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=c(200,200,200)) 　#塗りつぶす色

#塗りつぶし（三角）
cx1<-rev(cx)
cy1<-rev(cy)
polygon(c(-1,cx[Radian],cy1[Radian],0,0,-1), #x
c(0,cy[Radian],cx1[Radian],-1,0,0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),　 　　　#塗りつぶす斜線の角度
col=rgb(0,1,0)) 　#塗りつぶす色

#線追加（三角）
segments(cx[Radian],cy[Radian],0,0,col=rgb(0,1,0))
segments(cy1[Radian],cx1[Radian],0,0,col=rgb(0,1,0))

#文字追加
text(c(-1,cx[Radian],cy1[Radian],0,0),c(0,cy[Radian],cx1[Radian],-1,0), labels=c("a","b","c","d","e"),col=c(rgb(0,0,0),rgb(0,0,0),rgb(0,0,0),rgb(0,0,0)),cex=c(2,2,2,2,2))

}
#アニメーション
library("animation")
Time_Code=rev(c(1:60))
saveGIF({
for (i in Time_Code){
　CFC(i)
}
}, interval = 0.1, movie.name = "CFC001.gif")
```
そして人類はこの壁を複素数の導入によって乗り越える事になるのです。
[【Rで球面幾何学】「世界で一番美しい公式」オイラーの等式の罠？](https://qiita.com/ochimusha01/items/7fa9d091f7ba9414dfc3)
![20190630062745.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/a43e3609-8af6-e2ea-b565-40282ae276f7.gif)
![20190701070403.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/63690749-6cd6-561c-4540-59eb1021d45d.gif)