C#の複素数クラスは便利

# C#での複素数クラス
　単純な複素数クラスなら自分で実装できるが、算術関数も実装するとなると、大変そうであるので、ライブラリ等を利用したい。
java標準にはないので、Processing標準からは手段がない？
pythonモードで複素数を扱ことが可能であり、過去の記事を貼っておく。

https://qiita.com/hextomino/items/fde8b85701c64ae0a0ac

2024/04/14追記：いいライブラリがあったので、記事にしたものを貼っておく。

https://qiita.com/hextomino/items/47a5a4207df0522df770

# 複素数の計算

二乗してみます。

```math
i^2=-1
```

```cs
using System.Numerics;
Complex c = new Complex(0, 1);
Console.WriteLine(Complex.Multiply(c, c));
```

```
<-1; 0>
```
しかし、powを使うとコンピュータの精度問題により、僅かな誤差が生じる。
精度は、double相当の約16桁?

```cs
using System.Numerics;
Complex c = new Complex(0, 1);
Console.WriteLine(Complex.Pow(c, 2));
```

```
<-1; 1.2246467991473532E-16>
```

次に、sqrt命令

```math
\sqrt{i}=\frac{1}{\sqrt{2}}+\frac{1}{\sqrt{2}}i
```

```cs
using System.Numerics;
Complex c = new Complex(0, 1);
Console.WriteLine(Complex.Sqrt(c));
```

```
<0.7071067811865476; 0.7071067811865475>
```

指数部に実数0.5を使う。

```cs
using System.Numerics;
Complex c = new Complex(0, 1);
Console.WriteLine(Complex.Pow(c, 0.5));
```

```
<0.7071067811865476; 0.7071067811865475>
```

まったく同じ値となった。sqrtは内部でpowに置き換えられてるのかな？

これで、マンデルブロ集合の指数部を2以外に変更する時のコードがシンプルに書けるはず。

さて、虚数の虚数乗は？

```math
i^i=e^{-\pi/2}=\frac{1}{\sqrt{e^\pi}}=0.20787957\cdots
```

```cs
using System.Numerics;
Complex c = new Complex(0, 1);
Console.WriteLine(Complex.Pow(c, c));
```

```
<0.20787957635076193; 0>
```
完璧である

# 計算速度は遅い
便利であるが、期待してはいけない。
ちょっとなら使えるが、ゴリゴリ計算するのには向いてない。

```cs
using System.Numerics;

for (double y = -1.25d; y <= 1.25d; y += 2.5d/24.0d)
{
    for (double x = -2.0d; x <= 0.5d; x += 2.5d/64.0d)
    {
        Complex z = new Complex(0, 0);
        Complex c = new Complex(x, y);
        for (int n = 0; n < 256; n++)
        {
            z = Complex.Pow(z, 2);
            z = Complex.Add(z, c);

            if (z.Magnitude > 2)
            {
                Console.Write(".");
                break;
            }
            if (n == 255)
            {
                Console.Write("*");
            }
        }
    }
    Console.WriteLine("");
}
```

```
.................................................................
.................................................................
.................................................................
.................................................................
................................................*................
..............................................*****..............
..........................................*.*********.*..........
.......................................*********************.....
...................................*************************.....
..................................****************************...
......................********...*****************************...
....................************.****************************....
......*........*******************************************.......
....................************.****************************....
......................********...*****************************...
..................................****************************...
...................................*************************.....
.......................................*********************.....
..........................................*.*********.*..........
..............................................*****..............
................................................*................
.................................................................
.................................................................
.................................................................
.................................................................
```

漸化式が、z^2+cではなくて、z^2.2+cにしたいとかなら、簡潔に書ける。

```
................................................................
................................................................
................................................................
......................................................*.........
.............................................*.*.....***........
.........................*******.........***************........
.....................*************...**********************.....
........................*************************************...
........................*.************************************..
................................******************************..
.............................*********************************..
............................*******************************.....
.............................*********************************..
................................******************************..
........................*.************************************..
........................*************************************...
.....................*************...**********************.....
.........................*******.........***************........
.............................................*.*.....***........
......................................................*.........
................................................................
................................................................
................................................................
```

https://ja.wolframalpha.com/input?i=%E3%83%9E%E3%83%AB%E3%83%81%E3%83%96%E3%83%AD%E9%9B%86%E5%90%88%EF%BC%8C+d%3D2.2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/a8260fcf-f904-c79e-2652-0b2abd88ede0.png)

z^z+cはどうだろう？

```
............**********************************************......
..........************************************************......
.........**************************************************.....
.......****************************************************.....
......******************************************************....
.....*******************************.***********************....
....********************************.************************...
.....********************************************************...
......**********.....*************.**************************...
.......*************....***********************************.....
.........*************************************************......
...........***********.**..*****************************........
..............******.*******************************............
...........***********.**..*****************************........
.........*************************************************......
.......*************....***********************************.....
......**********.....*************.**************************...
.....********************************************************...
....********************************.************************...
.....*******************************.***********************....
......******************************************************....
.......****************************************************.....
.........**************************************************.....
..........************************************************......
```


# やりたいことのメモ
マンデルブロの中身の着色
より多い桁数の楽な扱い方法

# その他

マイクロソフトのページ

https://learn.microsoft.com/ja-jp/dotnet/api/system.numerics.complex.pow?view=net-7.0

```cs
Complex value = new Complex(12, -6);
for (int power = -1; power <= 10; power++)
  Console.WriteLine("{0} ^ {1,2} = {2:N2}", value, power, Complex.Pow(value, power));
```

この意味が、理解しにくかったのでメモ。
まず、""の中、
{0}はvalue
{1,2}はpower
{2:N2}はComplex.Pow(value, power)
が入る。

{1,2}の「,2」は「２桁表示の右寄せ」という意味。
{1,-3}の場合「3桁表示の左寄せ」になる。
※昔のように、スペースを挿入する技は必要はない。
{2:N2}の「:N2」は小数点以下2桁で表示という意味。
以上は、string.Formatメソッドに準拠している。


# main関数なくても良くなった

Visual Studio 2022のバージョンでは、main関数書かなくても動くギミックが実装された。気づかずに、書いてたけど、気づかないほど、自然な良い機能であるといえる。
※時期が違うかもしれない。macなので、表記がなくてよくわからない。

# i^i^i^i^i^i= ?
（顔文字ではない）
Google検索ボックスで虚数扱えるので、興味本位に計算した。

```math
i^{i^i}=0.947158998+0.32076445i
```
```math
i^{i^{i^i}}=0.0500922361+0.602116527i
```
```math
i^{i^{i^{i^i}}}=0.387166181+0.0305270816i
```
```math
i^{i^{i^{i^{i^i}}}}=0.782275682+0.544606558i
```
0.142561823 + 0.400466525 i
0.519786396 + 0.118384196 i
0.568588617 + 0.605078407 i
0.242365247 + 0.301150592 i
10回目まで計算してみた。
複素数の積は、複素平面上の回転を表すが、冪乗は何を表すのだろうか？・・・回転のようですね。
極限は、
0.438283 + 0.3605924 i
とのこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/8c084070-76cc-0ba8-2adc-92faaa75f748.png)

# 参考
最近のCPUはfloatよりもdoubleが速いらしい。マジか。

https://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html

iのi乗

https://ja.wikipedia.org/wiki/I%E3%81%AEi%E4%B9%97

ランベルトのW関数

https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%99%E3%83%AB%E3%83%88%E3%81%AEW%E9%96%A2%E6%95%B0

マンデルブロ集合

https://en.wikipedia.org/wiki/Mandelbrot_set

マンデルブロ集合×反復関数系

https://note.com/108hassium/n/n96ebc5def594