星田さんの記事へのコメント。
排便したらすごく頭がスッキリしたのでプログラミング学習再開じゃい!
便秘だったのか・・・・・・。
それはさておき。
複素数とか言われてもw。
ええと、いや、この場合の複素数(議題としては複素平面)は難しくないです。
とは言っても、例えば高校数学で、これって昔は無かったんですよね。
複素平面、ってのは高校数学の学習指導要領で登場したり消えたり、って忙しい部所なんですよね。出たり入ったりしてる。出たり入ったり。エロい(謎。
期間的には過去、1997年~2005年の間に高校生だった子がまずは学んでます。
そして直近だと2015年~に復活してます。今の高校数学では複素平面を扱っている。
とは言っても全く簡単。
要は、基本的には、二次元座標は(x, y)と言う数のペアで書き表されてますが、これを単一の値、x + yi(iは虚数単位)で書き表そう、ってだけで、別段大した話じゃあないんです。
虚数単位iはi^2 = -1になりますが、それすらも忘れてて構わない。
Racket/Scheme、及びANSI Common Lispは複素数もそのまま扱えます。恐らく、最初に複素数が実装されたプログラミング言語の一つでしょう。
例えば通常の二次元平面は先に書いた通り座標は(x, y)で指定する。デカルト平面(Cartesian coordinate system※1)、ってヤツですね。
例えばRacket/Schemeで二次元ベクタへのアクセサを定義すると、
(define (bref v x y)
(vector-ref (vector-ref v x) y))
みたいなカタチになる。
> (define b #(#(1 2 3) #(4 5 6) #(7 8 9)))
> b'#(#(1 2 3) #(4 5 6) #(7 8 9))> (bref b 1 2)
6
>
一方、複素平面的なアイディアだと次のように一引数でアクセサが定義可能です。
(define (bref v z)
(vector-ref (vector-ref v (real-part z)) (imag-part z)))
例えば次のようにして使う。
> (define b #(#(1 2 3) #(4 5 6) #(7 8 9)))
> b
'#(#(1 2 3) #(4 5 6) #(7 8 9))
> (bref b 1+2i)
6
>
Racket/Schemeで複素数はそのままx+yiみたいにして記述します(※2)。
関数real-partは複素数の実数部を、imag-partは複素数の虚数部を取り出します(※3)。
このように、複素数の活用は、単に二次元平面座標の表し方の「もう一つの方法」として捉えるだけで良いのです。
一次元だけど縦に積んでいく事で二次元をマッピング出来る!
これ、実はC言語的方法論、なんです(笑)。
C言語では「配列の配列」は作れるんだけど、「二次元配列」は作れない。この二つは似て非なるものです。
そして、「配列の配列」は扱いが面倒臭い。結果、一次元の基礎的な配列を「多次元配列と見立てて」プログラムする、と言うのがCでは良く行われてる模様です。
※1: この英名「Cartesian coordinate system」ってのはピンと来ないが、名字、Descartes(デカルト)の後半、cartesが由来である。
「デカルトの〜」は大体Cartesianと言う形容詞が用いられる。
※2: ANSI Common Lispでは#C(x y)みたいにして記述する。