【RからPythonへ】ガウス平面上の単位円(Unit Circle)/単位円筒(Unit Cylinder)表示からの再出発

数年前、つまり<font color=green>2010年代後半</font>「**まだ**<font color=purple>R</font>**なんて使ってるの？　**<font color=purple>R</font>**が許されるのは**<font color=green>2010年代前半</font>**までだよね。今はもう**<font color=purple>Python</font>**の時代だよ!!**」と煽られた事がありました。
[キモーイガールズ (きもーいがーるず)とは【ピクシブ百科事典】](https://dic.pixiv.net/a/%E3%82%AD%E3%83%A2%E3%83%BC%E3%82%A4%E3%82%AC%E3%83%BC%E3%83%AB%E3%82%BA)

その時は**ティンダロスの猟犬**(<font color=blue>The Hounds of Tindalos</font>)**問題**こと**オイラーの公式**（<font color=blue>Eulerian Formula</font>）<font color=purple>e^Θi=cos(Θ)+sin(Θ)i</font>の自明的な拡張である<font color=purple>Cos(θ)+Cos(θ-π/NoS)i</font>(<font color=blue>NoS=Number of Sides</font>)を示して「**大事なのは扱ってる中身だ**」と宣言して何とか乗り切ったのですが…
[【無限遠点を巡る数理】「ティンダロスの猟犬(The Hounds of Tindalos)問題」を世に解き放つ。](https://qiita.com/ochimusha01/items/8cc7b71d7299cb4d26fc)
![image.gif](https://camo.qiitausercontent.com/e49e7e91f2ed668b15895c311497622a5642fc28/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3539373737322f36396336633339332d313032632d306235392d303739662d6435383739383636656332622e676966)

流石に<font color=green>2020年代</font>ともなるとねぇ…コンピューターの世界における進歩はまさに非常なまでに**日進月歩**な訳です。ついていけなくなるとたちまち**老害**扱いという…

#<font color=purple>Python</font>における等差数列表現(<font color=blue>Arithmetic Sequence Explession</font>)
[Pythonで等差数列を作る方法【初心者向け】](https://techacademy.jp/magazine/19093)
[Pythonにおけるrepeat()の利用方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/24809)

```python
import math as m
import numpy as np
a=range(0,10,1)
print(a)
b=np.arange(0,10,1)
print(b)
print(m.pi)
c=np.linspace(-m.pi,m.pi,61,endpoint = True)
print(c)
d=np.linspace(-m.pi,m.pi,61,endpoint = False)
print(d)
e=np.repeat(1,61)
print(e)

range(0, 10)
[0 1 2 3 4 5 6 7 8 9]
3.141592653589793
[-3.14159265 -3.0368729  -2.93215314 -2.82743339 -2.72271363 -2.61799388
 -2.51327412 -2.40855437 -2.30383461 -2.19911486 -2.0943951  -1.98967535
 -1.88495559 -1.78023584 -1.67551608 -1.57079633 -1.46607657 -1.36135682
 -1.25663706 -1.15191731 -1.04719755 -0.9424778  -0.83775804 -0.73303829
 -0.62831853 -0.52359878 -0.41887902 -0.31415927 -0.20943951 -0.10471976
  0.          0.10471976  0.20943951  0.31415927  0.41887902  0.52359878
  0.62831853  0.73303829  0.83775804  0.9424778   1.04719755  1.15191731
  1.25663706  1.36135682  1.46607657  1.57079633  1.67551608  1.78023584
  1.88495559  1.98967535  2.0943951   2.19911486  2.30383461  2.40855437
  2.51327412  2.61799388  2.72271363  2.82743339  2.93215314  3.0368729
  3.14159265]
[-3.14159265 -3.03858962 -2.93558658 -2.83258354 -2.7295805  -2.62657746
 -2.52357443 -2.42057139 -2.31756835 -2.21456531 -2.11156228 -2.00855924
 -1.9055562  -1.80255316 -1.69955012 -1.59654709 -1.49354405 -1.39054101
 -1.28753797 -1.18453493 -1.0815319  -0.97852886 -0.87552582 -0.77252278
 -0.66951975 -0.56651671 -0.46351367 -0.36051063 -0.25750759 -0.15450456
 -0.05150152  0.05150152  0.15450456  0.25750759  0.36051063  0.46351367
  0.56651671  0.66951975  0.77252278  0.87552582  0.97852886  1.0815319
  1.18453493  1.28753797  1.39054101  1.49354405  1.59654709  1.69955012
  1.80255316  1.9055562   2.00855924  2.11156228  2.21456531  2.31756835
  2.42057139  2.52357443  2.62657746  2.7295805   2.83258354  2.93558658
  3.03858962]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
```
#<font color=purple>Python</font>における複素数表現(<font color=blue>Complex Explession</font>)
[Python, complex型で複素数を扱う（絶対値、偏角、極座標変換など）](https://note.nkmk.me/python-complex/)
[cmath --- 複素数のための数学関数](https://docs.python.org/ja/3/library/cmath.html)

```python
import math as m
import cmath as c
print(m.e)
print(m.log(2))
print(c.exp(1))
print(c.log(2))

2.718281828459045
0.6931471805599453
(2.718281828459045+0j)
(0.6931471805599453+0j)
```
**ガウス平面**(<font color=blue>Gaussian Plane</font>)=**複素平面**(<font color=blue>Complex Plane</font>)上の**単位円**(<font color=blue>Unit circle</font>)
[Pythonで複素数扱うときに役立ちそうなことをまとめてみる](https://qiita.com/gyu-don/items/6da7556d46128327bc19)

<font color=purple>R</font>と異なり、ここから<font color=purple>for</font>**構文**導入が必須となる？
[Pythonのfor文によるループ処理（range, enumerate, zipなど）](https://note.nkmk.me/python-for-usage/)
[Pythonの配列の基礎をご紹介！](https://techplay.jp/column/462)
[数値の配列(リスト)を要素ごとに加算/減算/乗算/除算するには(ベクトル演算)]()

検証の為に**比較演算子**にも手を出しました。
[比較演算子の使い方](https://www.javadrive.jp/python/if/index4.html)

```python
import math as m
import cmath as c
import numpy as np

#絶対値と偏角リストから単位円を生成する。
#以下はエラーとなる。(まさかの1個ずつしか処理出来ないだと？)
a=np.linspace(-m.pi,m.pi,61,endpoint = True)
b=np.repeat(1,61)
print(c.rect(a,b))

TypeError: only size-1 arrays can be converted to Python scalars

#一応試してみた(当然そんな関数はない)。
print(np.rect(a,b))

AttributeError: module 'numpy' has no attribute 'rect'

#こうしないといけないって事?
ab=[]
for num in range(len(a)):
    ab.append(c.rect(a[num],b[num]))

print(len(ab))
print(ab)

61
[(-1.6974097548329732-2.643559064081456j), (-1.6408294296718742-2.555440428612074j), (-1.5842491045107752-2.4673217931426925j), (-1.527668779349676-2.3792031576733104j), (-1.4710884541885767-2.2910845222039287j), (-1.4145081290274777-2.202965886734547j), (-1.3579278038663787-2.114847251265165j), (-1.3013474787052797-2.026728615795783j), (-1.2447671535441804-1.9386099803264012j), (-1.1881868283830812-1.8504913448570193j), (-1.1316065032219824-1.7623727093876376j), (-1.0750261780608832-1.6742540739182556j), (-1.018445852899784-1.5861354384488737j), (-0.9618655277386848-1.4980168029794918j), (-0.9052852025775858-1.40989816751011j), (-0.8487048774164866-1.321779532040728j), (-0.7921245522553876-1.2336608965713463j), (-0.7355442270942885-1.1455422611019643j), (-0.6789639019331893-1.0574236256325824j), (-0.6223835767720902-0.9693049901632006j), (-0.5658032516109912-0.8811863546938188j), (-0.509222926449892-0.7930677192244369j), (-0.452642601288793-0.7049490837550552j), (-0.39606227612769385-0.6168304482856732j), (-0.33948195096659467-0.5287118128162912j), (-0.2829016258054957-0.4405931773469096j), (-0.2263213006443965-0.3524745418775276j), (-0.16974097548329733-0.2643559064081456j), (-0.11316065032219838-0.17623727093876398j), (-0.05658032516109919-0.08811863546938199j), 0j, (0.05658032516109895+0.08811863546938162j), (0.11316065032219813+0.17623727093876362j), (0.16974097548329733+0.2643559064081456j), (0.22632130064439626+0.35247454187752725j), (0.28290162580549544+0.4405931773469092j), (0.33948195096659467+0.5287118128162912j), (0.3960622761276936+0.6168304482856728j), (0.4526426012887928+0.7049490837550548j), (0.509222926449892+0.7930677192244369j), (0.5658032516109909+0.8811863546938185j), (0.6223835767720899+0.9693049901632j), (0.6789639019331893+1.0574236256325824j), (0.7355442270942882+1.145542261101964j), (0.7921245522553872+1.2336608965713456j), (0.8487048774164866+1.321779532040728j), (0.9052852025775856+1.4098981675101097j), (0.9618655277386845+1.4980168029794914j), (1.018445852899784+1.5861354384488737j), (1.075026178060883+1.6742540739182552j), (1.1316065032219818+1.762372709387637j), (1.1881868283830812+1.8504913448570193j), (1.2447671535441802+1.938609980326401j), (1.3013474787052792+2.0267286157957827j), (1.3579278038663787+2.114847251265165j), (1.4145081290274775+2.2029658867345465j), (1.4710884541885765+2.291084522203928j), (1.527668779349676+2.3792031576733104j), (1.584249104510775+2.467321793142692j), (1.6408294296718737+2.5554404286120738j), (1.6974097548329732+2.643559064081456j)]

#今度はオイラーの公式Cos(θ)+Sin(θ)i式で合成
#やはり同じエラーが出る。
complex(m.cos(a),m.sin(a))

TypeError: only length-1 arrays can be converted to Python scalars

#これもこうしないといけないって事？
ao=[]
for num in range(len(a)):
    ao.append(complex(m.cos(a[num]),m.sin(a[num])))

print(len(ao))
print(ao)

61
[(-1-1.2246467991473532e-16j), (-0.9945218953682733-0.10452846326765373j), (-0.9781476007338057-0.2079116908177593j), (-0.9510565162951535-0.3090169943749475j), (-0.9135454576426008-0.40673664307580043j), (-0.8660254037844387-0.49999999999999994j), (-0.8090169943749473-0.5877852522924732j), (-0.7431448254773944-0.669130606358858j), (-0.6691306063588582-0.7431448254773942j), (-0.587785252292473-0.8090169943749475j), (-0.5000000000000001-0.8660254037844386j), (-0.40673664307580026-0.9135454576426009j), (-0.30901699437494734-0.9510565162951536j), (-0.20791169081775934-0.9781476007338057j), (-0.10452846326765355-0.9945218953682733j), (6.123233995736766e-17-1j), (0.10452846326765344-0.9945218953682733j), (0.20791169081775923-0.9781476007338057j), (0.30901699437494745-0.9510565162951535j), (0.40673664307580015-0.9135454576426009j), (0.49999999999999994-0.8660254037844387j), (0.5877852522924732-0.8090169943749473j), (0.669130606358858-0.7431448254773944j), (0.7431448254773941-0.6691306063588583j), (0.8090169943749475-0.5877852522924731j), (0.8660254037844385-0.5000000000000002j), (0.9135454576426009-0.4067366430758003j), (0.9510565162951535-0.3090169943749474j), (0.9781476007338056-0.20791169081775962j), (0.9945218953682733-0.10452846326765361j), (1+0j), (0.9945218953682734+0.10452846326765318j), (0.9781476007338057+0.20791169081775918j), (0.9510565162951535+0.3090169943749474j), (0.913545457642601+0.40673664307579993j), (0.8660254037844387+0.49999999999999983j), (0.8090169943749475+0.5877852522924731j), (0.7431448254773945+0.669130606358858j), (0.6691306063588583+0.743144825477394j), (0.5877852522924732+0.8090169943749473j), (0.5000000000000003+0.8660254037844385j), (0.40673664307580076+0.9135454576426006j), (0.30901699437494745+0.9510565162951535j), (0.20791169081775968+0.9781476007338056j), (0.10452846326765411+0.9945218953682733j), (6.123233995736766e-17+1j), (-0.10452846326765312+0.9945218953682734j), (-0.2079116908177587+0.9781476007338058j), (-0.30901699437494734+0.9510565162951536j), (-0.4067366430757999+0.9135454576426011j), (-0.4999999999999994+0.866025403784439j), (-0.587785252292473+0.8090169943749475j), (-0.6691306063588579+0.7431448254773945j), (-0.7431448254773938+0.6691306063588587j), (-0.8090169943749473+0.5877852522924732j), (-0.8660254037844385+0.5000000000000003j), (-0.9135454576426006+0.4067366430758008j), (-0.9510565162951535+0.3090169943749475j), (-0.9781476007338056+0.20791169081775973j), (-0.9945218953682733+0.10452846326765418j), (-1+1.2246467991473532e-16j)]
#表示だけでなく内容も違う？
print(bool(ab==ao))

False
#ちなみにRみたいにベクトルの四則演算を実現したければnumpy.array()一択。
#しかし上掲のリスト処理がnumpy.array()には出来ない。
#つまり「変数の切り替え」が必要？

c=np.array(ab)
d=np.array(ao)

print(c+d)
print(c-d)
print(c*d)
print(c/d)

#計算結果省略。組み込みのリスト形式では+しか通らない。
```
これが**全部最初からベクトル処理**の<font color=purple>R</font>と**ライブラリ追加**で追い上げた<font color=purple>Python</font>の違い？…つまり偉いのは<font color=purple>Python</font>というより<font color=purple>Numpy</font>で、しかもその追いあげ方も**演算効率優先**(<font color=blue>リスト操作の柔軟性が高く付くのはLISP時代からの問題点</font>)という…
[NumPy - Wikipedia](https://ja.wikipedia.org/wiki/NumPy)
[NumPyの歴史とPythonの並行処理(PyDataTokyo Conference)](https://hackmd.io/@Wtrk5ko6QZ-mFx2yqIHgAg/HyZSnWujX?type=view)

><font color=green>1994年</font>に**Python1.0**
><font color=green>1990年代</font>に**PIL**や**NumPy**の前身(<font color=blue>Numeric</font>) ←**GitHub**などない暗黒時代
>
><font color=green>2001年</font>くらいに**Enthought**（<font color=blue>Anacondaと同種のプロダクト</font>）：数値計算のコミュニティで盛り上がり
>
>現在使われているものは<font color=green>2010年</font>までには出揃っている（<font color=blue>pandas, scikit-learn</font>）
>
><font color=green>2010年代前半</font>に**Anaconda**
>
>なぜ**Python**が使われるようになったのか？
①**NumPy**が早い時期に誕生しエコシステムを形成
②**Python**も**NumPy**を呼び出す前提で開発
③**C拡張ライブラリ**の作りやすさ
>
><font color=green>2010年以降</font>の**機械学習ブーム**もあって**Python**の人気が上昇
**StackOverflow**の記事数<font color=green>10%</font>を占めるように（<font color=blue>JSを抜いた</font>）
**python.jp**もアクセス数<font color=green>3倍</font>

「**現実は常に正解である**(<font color=blue>by 立川談志</font>)」?　まぁネイピアが「**常用対数表**(<font color=blue>Common Log Table</font>)」作成を思い立ってからこのかた、コンピューター言語は何よりもまず演算の為にあり続けてきた訳で「<font color=red>開発効率も演算効率も高いのは絶対正義</font>」なのは否定出来ないんですよね。
[「よく覚えとけ。現実は正解なんだ。」立川談志49歳のことばが身にしみる](https://ji-sedai.jp/editor/blog/49.html)
[【数理考古学】常用対数表(Table of Common Logarithms)を使った計算](https://qiita.com/ochimusha01/items/b7ce3c7d86ab39263c68)

#<font color=purple>Python</font>におけるグラフ表現

[Pythonでデータをプロットしてグラフを描く方法【初心者向け】](https://techacademy.jp/magazine/19316)

<font color=purple>R</font>の場合と異なり、そのまま**複素数リスト**を渡しても**虚数部**が切り捨てられてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/5bb7e408-8652-775a-7264-7512bd2f0d69.png)

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

c0=np.linspace(-m.pi,m.pi,61,endpoint = True)
ao=[]
for num in range(len(c0)):
    ao.append(complex(m.cos(c0[num]),m.sin(c0[num])))
plt.plot(ao);

#エラー表示
ComplexWarning: Casting complex values to real discards the imaginary part
return array(a, dtype, copy=False, order=order)
```
**実数部**と**虚数部**を切り離してx</font>**値**/y</font>**値**として渡してやると…今度は**アスペクト比の調整段階**で問題が生じました。しかしまぁこれまでの投稿で散々使い倒してきた<font color=purple>R</font>の<font color=purple>plot</font>**関数**の利用範囲に大分追いついてきた感じがします。
[set_aspect() を用いて等軸の正方形のプロットを作成する](https://www.delftstack.com/ja/howto/matplotlib/how-to-make-a-square-plot-with-equal-axes-in-matplotlib/)
[matplotlibのstyleを変える](https://qiita.com/eriksoon/items/b93030ba4dc686ecfbba)
[Fill 塗りつぶし](http://hydro.iis.u-tokyo.ac.jp/~akira/page/Python/contents/plot/graph/fill.html)
[matplotlib で指定可能な色の名前と一覧](https://pythondatascience.plavox.info/matplotlib/%E8%89%B2%E3%81%AE%E5%90%8D%E5%89%8D)
[Matplotlib で水平線と垂直線をプロットする方法](https://www.delftstack.com/ja/howto/matplotlib/how-to-plot-horizontal-and-vertical-line-in-matplotlib/)
[【Python@matplotlib】matplotlib にて横、縦の補助線を描く方法について](https://qiita.com/ringCurrent/items/833d3afba22a755729fc)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/0782510e-20a4-43c9-29f5-2b29f78d2f94.png)

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

#単位円データ作成
c0=np.linspace(-m.pi,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()

plt.plot(s1.real,s1.imag,color="blue", label="Unit Circle")
plt.ylim([-1.1,1.1])
plt.xlim([-1.1,1.1])
plt.title("Unit Circle")
plt.xlabel("Real")
plt.ylabel("Imaginal")
plt.fill(s1.real, s1.imag,color="gainsboro")

ax = fig.add_subplot(111)
ax.set_aspect('equal', adjustable='box')
ax.legend(loc='upper right')

#補助線
plt.axvline(0, 0, 1,color="red")
plt.axhline(0, 0, 1,color="red")

plt.show()

#エラー表示
MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.
  ax = fig.add_subplot(111)
```
それでは今度は**単位円**(<font color=blue>Unit Circle</font>)の概念を**単位円筒**(<font color=blue>Unit Cylinder</font>)のに拡張してみましょう。そう、実は以前からこの処理内容が<font color=red>シームレスに連続していく感じ</font>は羨ましかった!!
[Pythonで3D散布図を作成する方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/29976)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/22b09b83-2a72-6302-fb64-9335647e839d.png)

```python
import math as m
import cmath as c
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#単位円データ作成
c0=np.linspace(-m.pi,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)
z0=np.linspace(-1,1,61,endpoint = True)

#グラフ表示
plt.style.use('default')

fig = plt.figure()
ax = Axes3D(fig)

ax.plot(s1.real,s1.imag,z0,color="blue")
ax.set_ylim([-1.1,1.1])
ax.set_xlim([-1.1,1.1])
ax.set_zlim([-1.1,1.1])
ax.set_title("Unit Circle")
ax.set_xlabel("Real")
ax.set_ylabel("Imaginal")
ax.set_zlabel("Cycle")
```
これもどうやら<font color=purple>Python</font>が偉いというより<font color=purple>matplotlib</font>が偉いという話になってくる様です。しかし、とにかく常に**現実は正解**という…
[matplotlib - Wikipedia](https://ja.wikipedia.org/wiki/Matplotlib)

ついでに上掲の**ティンダロスの猟犬**で用いた「<font color=green>スポーク表示</font>」。どうやら<font color=purple>R</font>の<font color=purple>plot</font>**関数**とは異なり<font color=purple>matplotlib</font>には<font color=purple>segments</font>**関数**の概念がなく「<font color=green>2点間plt.plot</font>(<font color=blue>ax.plot</font>)」で間に合わせる模様。
[Python: matplotlibで"任意の線"を引く](https://dr-kayai.hatenablog.com/entry/2014/02/03/143003)
[Adding an arbitrary line to a matplotlib plot in ipython notebook
](https://stackoverflow.com/questions/12864294/adding-an-arbitrary-line-to-a-matplotlib-plot-in-ipython-notebook)

**2次元**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/ec4732e5-ffae-9bce-7770-14de4448f5c6.png)

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

#単位円データ作成
c0=np.linspace(-m.pi,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()

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([-1.1,1.1])
plt.xlim([-1.1,1.1])
plt.title("Unit Circle")
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="red")
plt.axhline(0, 0, 1,color="red")

plt.show()
```
**3次元**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/58f079d9-4c12-4184-1db0-c6b1c2b2bc71.png)

```python
import math as m
import cmath as c
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#単位円データ作成
c0=np.linspace(-m.pi,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)
z0=np.linspace(-1,1,61,endpoint = True)

#グラフ表示
plt.style.use('default')

fig = plt.figure()
ax = Axes3D(fig)

#スポーク描画
ax.plot([0,0],[0,0],[-1,1],color="red",lw=1)
ax.plot([0,-1],[0,0],[-1,-1],color="red",lw=1)
ax.plot([0,-1],[0,0],[1,1],color="red",lw=1)
for num in range(len(s1)):
    ax.plot([0,s1[num].real],[0,s1[num].imag],[z0[num],z0[num]],color="gray",lw=0.5);

ax.plot(s1.real,s1.imag,z0,color="blue")
ax.set_ylim([-1.1,1.1])
ax.set_xlim([-1.1,1.1])
ax.set_zlim([-1.1,1.1])
ax.set_title("Unit Cylinder")
ax.set_xlabel("Real")
ax.set_ylabel("Imaginal")
ax.set_zlabel("Cycle")
```
**単位円筒**(<font color=blue>Unit Cylinder</font>)とは要するに複素関数における**分枝切断**(<font color=blue>Branch Cut</font>)の**構成単位**だった訳ですね。これを連続させると、いわゆる**リーマン面**(<font color=blue>Riemann Surface</font>)になる訳です。
[【無限遠点を巡る数理】等差数列と等比数列②基底関数概念の導入](https://qiita.com/ochimusha01/items/df8c006439794da89684)
[複素解析での分岐点とは](https://mathrelish.com/mathematics/branch-point-in-complex-analysis)

>**複素解析**の歴史の中で日本が関わってくるのは<font color=green>20世紀</font>に入ってからである．
>例えば日本語で書かれた最初の複素関数論のテキストは**吉川實夫**による『**函数論**』で，
><font color=green>1913年</font>(<font color=blue>大正二年</font>)のことである．テキストでは複素関数は**複函数**と訳されていた．
>
>このように訳語の問題が表れる．訳語は単純な思い違いが末代まで残ったり，細かな違いを反映させた語が選ばれても，時代の流れでより簡便な言い回しに喰われることもある．度が過ぎるとカタカナ表記という万能な手段が講じられてしまう．
>
>**複素解析**で一二を争う特殊な訳語は「**截線**」という訳語ではないだろうか．
>
>**分岐**や**葉**は<font color=purple>branch</font>や<font color=purple>leaf</font>なので，すんなり翻訳された感があるが，<font color=purple>branch cut</font>は**分岐截線**となった．今では単に<font color=purple>切断</font>とよぶことも多い．もしくは<font color=purple>ブランチカット</font>と表記することもある．どちらにしても「**截線**」と訳すのはちょっと凝っているわけである．
>
>「**截**(<font color=blue>セツ</font>)」という漢字は難しい漢字である．「**載**」「**裁**」と似ているし，「**截線**」を「<font color=purple>せっせん</font>」として漢字変換してくれなくても仕方がないほどである．この漢字の訓読みは「**截る**(<font color=blue>きる</font>)」「**截つ**(<font color=blue>たつ</font>)」で刃物で重なりのあるものや長いものをずばりと切る様をいうものである．**斬釘截鉄** (<font color=blue>ざんていせってつ</font>) という四字熟語もあるが，これからとにかく切ればいいというわけではなく，**重要な箇所を切る**という意味もあり，**遮る**といった意味も持っている．
>
>**多価関数**はまるで複素平面が何枚も折り重なったようなところを定義域とするようなものになっている．これら**複素平面** (<font color=blue>葉</font>) が共有する部分で切るという様が**截ち切る**ようになっているので，**截線**というわけである．
また**複素平面**のどこを切ってもよいわけでもなく，**分岐点**を**端点**に持つように切らねばならず，その意味でも**截線**という訳語の意図が込められているのではとも感じられる．
>
>ところで「**截線**」は今の**分岐截線**の他に，曲線の二点以上と交点を持つ直線である**割線**(<font color=blue>secant</font>)の訳語としても用いられることがある．何れにしても今ではもう多くの人々が忘れた用語なのかもしれない．

次いで塗り潰しに挑戦したものの、とりあえず挫折。どうやら<font color=purple>Poly3DCollection</font>(<font color=blue>四角ポリゴン (patch) の集合</font>)の概念習得が必要な模様。
[mplot3d.Axes3D – 3次元グラフの概要](http://taustation.com/mplot3d-axes3d-overview/)
[matplotlib - plot_surface で 3D グラフを描画する方法](https://pynote.hatenablog.com/entry/matplotlib-surface-plot)
[[matplotlib 3D] 11. 3Dグラフ上に円、線、面などの図形を表示(pathpatch3d)](https://sabopy.com/py/matplotlib_3d_11/)

ついでに条件文の構文についても触れる展開に。
[Pythonのif文による条件分岐の書き方](https://note.nkmk.me/python-if-elif-else/)
[Pythonの三項演算子（条件演算子）でif文を一行で書く](https://note.nkmk.me/python-if-conditional-expressions/)

#<font color=purple>Python</font>におけるアニメーション表現
何と最終的には<font color=purple>R</font>では実現困難な**3Dアニメーション**にまで到達してしまいました。そう、以前の投稿を見れば分かりますが<font color=purple>R+OpenGL</font>の組み合わせだと**3次元立体**は**回転させる**事しか出来なかったのですね(<font color=blue>方法はあったのかもしれないが、そこまで到達出来なかった</font>)。

[matplotlib でアニメーションを作る](https://qiita.com/yubais/items/c95ba9ff1b23dd33fde2)
[とほほのPython入門 - 関数](http://www.tohoho-web.com/python/function.html)
[matplotlibでアニメーション](https://qiita.com/chez_sugi/items/93ff2efad50f16bc8c37)
[matplotlib.animationで動くグラフに挑戦！](https://www.sejuku.net/blog/61007)
[matplotlibでimagemagickを使わずにアニメGIFを保存する](https://qiita.com/skotaro/items/430e03b61cc6f069d263)

**二次元**
![output02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/cb2ac52e-653b-22f9-fb39-6e8e7040ef16.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(-m.pi,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([-1.1,1.1])
    plt.xlim([-1.1,1.1])
    plt.title("Unit Circle")
    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="red")
    plt.axhline(0, 0, 1,color="red")
    #移動線描画
    plt.plot([0,s1[n].real],[0,s1[n].imag],color="green",lw=1)

ani = animation.FuncAnimation(fig, unit_circle, interval=50,frames=len(s1))
ani.save("desktop/output02.gif", writer="pillow")
```
**三次元**
![output06.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/b1025f6b-11e5-267b-5b42-213b18ba67d5.gif)

```python
%matplotlib nbagg
import math as m
import cmath as c
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#単位円データ作成
c0=np.linspace(-m.pi,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)
z0=np.linspace(-1,1,61,endpoint = True)

#グラフ表示
plt.style.use('default')
fig = plt.figure()
ax = Axes3D(fig)

#関数定義
def unit_cylinder(n):
    plt.cla()
    #スポーク線描画
    ax.plot([0,0],[0,0],[-1,1],color="red",lw=1)
    ax.plot([0,-1],[0,0],[-1,-1],color="red",lw=1)
    ax.plot([0,-1],[0,0],[1,1],color="red",lw=1)
    for num in range(len(s1)):
        ax.plot([0,s1[num].real],[0,s1[num].imag],[z0[num],z0[num]],color="gray",lw=0.5);    
    ax.plot(s1.real,s1.imag,z0,color="blue")
    ax.set_ylim([-1.1,1.1])
    ax.set_xlim([-1.1,1.1])
    ax.set_zlim([-1.1,1.1])
    ax.set_title("Unit Cylinder")
    ax.set_xlabel("Real")
    ax.set_ylabel("Imaginal")
    ax.set_zlabel("Cycle")
    #動線描画
    ax.plot([0,s1[n].real],[0,s1[n].imag],[z0[n],z0[n]],color="green",lw=1);

ani = animation.FuncAnimation(fig, unit_cylinder, interval=50,frames=len(s1))
ani.save("desktop/output06.gif", writer="pillow")
```
こうして、これまでの投稿内容の<font color=purple>Python</font>への移植の目処が立ち始めた辺りで、以下続報…