見出し画像

Excelで極座標プロット

3Blue1BrownJapanで2年前に公開された動画がこちら。

何度も見直していますが、素晴らしいですね!
本家の動画はもっといろいろ面白そうなのがあるのですが、いかんせん英語能力が皆無なので、日本版の中の方の翻訳待ちです。がんばってください!


Excelで極座標プロット

Excelに極座標プロットはありませんので、xy座標に変換して散布図で描いてみます。

$$
(r,\theta) \to (r*cos\theta, r*sin\theta)
$$

ということですね。
まずは自然数をプロットしてみます。

=REDUCE(
    {"x", "y"},
    SEQUENCE(A1),
    LAMBDA(a, s, VSTACK(a, HSTACK(s * COS(s), s * SIN(s))))
)

A1セルに「10000」と入れて散布図にプロットしたのがこちら。

自然数(1万)

綺麗な螺旋を描いています。
この螺旋は44の剰余類ですね。

素数の螺旋

続いて、素数だけ抜き出してみましょう。

=LET(
    _max, A1,
    _primes, LET(
        _1_, "基本素数 base prime",
        _bp, {2; 3; 5; 7},
        _2_, "内部再帰関数 F:自分自身",
        _F, LAMBDA(F, n,
            LET(
                _1_, "√n以下の素数で試し割りすれば良いので√nを算出",
                _sq, SQRT(n),
                _2_, "試し割用素数列 test prime",
                _3_, "_sqが11より小さければ_bpから値を返す。大きければ再帰して値を求める",
                _tp, IF(_sq < 11, FILTER(_bp, _bp <= _sq), F(F, _sq)),
                _4_, "_tpの最後の値を取得 Terminate test prime",
                _ttp, @TAKE(_tp, -1),
                _5_, "_ttp+1~nの数字を_tpで試し割して、割り切れない数字だけ残す",
                _re, REDUCE(
                    SEQUENCE(n - _ttp, , _ttp + 1),
                    _tp,
                    LAMBDA(a, s, TOCOL(IF(MOD(a, s), a, NA()), 2))
                ),
                _6_, "_tpと_reを結合",
                VSTACK(_tp, _re)
            )
        ),
        _3_, "実行",
        _F(_F, _max)
    ),
    REDUCE(
        {"x", "y"},
        _primes,
        LAMBDA(a, s, VSTACK(a, HSTACK(s * COS(s), s * SIN(s))))
    )
)

実行結果がこちら

素数プロット(1万)

歯抜けになりましたね。
もっと増やしてみます。

素数プロット(10万)

直線の構造が見えてきました。
これが710の剰余類ですね。
中心部には螺旋の隙間も見えますね。

素数プロット(100万)

Excelだとこの辺が限界ですが、それでも構造が見えてきて面白いですね。
この直線に近い曲線は280本あるそうです。暇な方は数えてみてください。

双子素数中心数の螺旋

次に双子素数に挟まれた数(Twin Prime Center)を表示してみましょう。
これ、chatGPTさんによると、日本語でのメジャーな表記が無いようです。
「双子素数中心数」だと長いので、たんに「中心数」と呼ぶことにします。

=LET(
    _max, A1,
    _1_, "_max以下の素数列を生成",
    _primes, LET(
        _1_, "基本素数 base prime",
        _bp, {2; 3; 5; 7},
        _2_, "内部再帰関数 F:自分自身",
        _F, LAMBDA(F, n,
            LET(
                _1_, "√n以下の素数で試し割りすれば良いので√nを算出",
                _sq, SQRT(n),
                _2_, "試し割用素数列 test prime",
                _3_, "_sqが11より小さければ_bpから値を返す。大きければ再帰して値を求める",
                _tp, IF(_sq < 11, FILTER(_bp, _bp <= _sq), F(F, _sq)),
                _4_, "_tpの最後の値を取得 Terminate test prime",
                _ttp, @TAKE(_tp, -1),
                _5_, "_ttp+1~nの数字を_tpで試し割して、割り切れない数字だけ残す",
                _re, REDUCE(
                    SEQUENCE(n - _ttp, , _ttp + 1),
                    _tp,
                    LAMBDA(a, s, TOCOL(IF(MOD(a, s), a, NA()), 2))
                ),
                _6_, "_tpと_reを結合",
                VSTACK(_tp, _re)
            )
        ),
        _3_, "実行",
        _F(_F, _max)
    ),
    _2_, "6nの数列のうち、前後が素数である数だけ抜き出し。Twin Prime Centers",
    _tpcenters, LET(
        _r, SEQUENCE(_max / 6, , 6, 6),
        _z, FILTER(
            _r,
            ISNUMBER(XMATCH(_r - 1, _primes, FALSE)) *
                ISNUMBER(XMATCH(_r + 1, _primes, FALSE))
        ),
        _z
    ),
    _3_, "xy座標生成",
    REDUCE(
        {"x", "y"},
        _tpcenters,
        LAMBDA(a, s, VSTACK(a, HSTACK(s * COS(s), s * SIN(s))))
    )
)

まずは1万。

中心数(1万)

スカスカですね。
続いて10万。

中心数(10万)

構造らしいものは見えません。
しいて言えば、宇宙の大規模構造?
続いて100万。

中心数(100万)

素数と同じく直線状の構造(710の剰余類)が見えます。しかし、それ以外は見当たりませんね。
中心部分はなんだかロールシャッハテストみたいですね^^;
あなたには何が見えたでしょうか?

勉強結果

いつものごとく備忘録として勉強結果を挙げておきます。

何か見えた!って方はコメント欄で教えてください。

いいなと思ったら応援しよう!

この記事が参加している募集