今年も師走になり、いかがバタバタとお過ごしでしょうか。(定型文)
年末ということで、今年のMONSTER DIVEのクリエイティブについて振り返らなくてもいいのか?という心の声?まわりからの声?も聞こえてくる気もするのですが、そこは初志貫徹ということで、少ないかもしれませんが、シリーズを期待してくれている人のために今年も「算数ドリル」シリーズをしましょう。
もう6年目5回目!
今回は二次方程式に関わる話なので、算数というより数学かもですがそこはご愛嬌ということで。
二次方程式を学ぶのは中学三年生ごろでしょうか。
そのころ「次の二次方程式を解きなさい。」で「解なし」という解答に誰も出会い、「解なし」って何だろう。「解なし」な式なんてあるのかと疑問に思ったと思います。
冒頭の画像の問題を実際に解くと下記のようになります。
「解」がある!
ここからは高校数学な気もしますが、復習すると「i」を虚数。「1+i」を複素数と呼んでいました。
この虚数、複素数は現実には存在しない数なので、中学では「解なし」となっていたというわけです。
何故「i」を用いるかというと、実数は「real number」なので、それにあわせて「imaginary number」ということですね。
前段が長くなりましたが、何故このような思い出話?をしたのかというと、
「プログラミングの世界で虚数はどう表すのだろう?」
とふと疑問に思い、簡単にですが身近なプログラムを例にご紹介してみます。
ありますよね。そういうどうでもいいことが気になることって。
デフォルトではないが、math.js ライブラリを使用することで可能。
new Complex(re: number, im: number)
デフォルトではないが、PearのMath_Complexパッケージ で可能。
Math_Complex( float $real , float $im )
昔は複素数が使えなく、FORTRAN(懐かしい!)から抜け出せない人がいたようだが、今(C99以降)は「標準ライブラリー complex.h」で使える模様。
#include <complex.h> float _Complex x = 1.0 + 1.0 * _Complex_I ;
こちらもデフォルトではないので、ApacheのComplexクラスで利用可能という話もありますが、自分で必要に応じて実装している人が多そう。
package org.apache.commons.math.complex; public Complex(double real, double imaginary){ ... }
complex型が標準で用意されている。素晴らしい!
# comp.real、comp.imag comp = 1 + j # comp = complex(re, im) comp = complex(1, 1)
※列挙したものより良いもの、「ここは!」、などあれば、ぜひツッコミしていただければです。
では実際に何に使うのでしょうか。
僕も今まで意識して使ったことはなかったのですが、オリジナルカオスやフラクタルの生成には必要でしょうし、実数部と虚数部にわかれることができるということは、1つの数で2つのベクトルが持てるということだと思うので、今までオブジェクトで管理していたものなどもすっきりスリムになったりと、使い道を考えるだけで楽しくなってきますね。
数字の世界が1次元から2次元へ広がったイメージ!?
一見複雑な処理や動きでも、実はこのような基本的な算数(数学)を使うと以外と簡単に制御できることも多いと思うので、ぜひ頭の体操がてらに使い道を考えてみるのも一興かと思います。
これぞ!という画期的な使い道が出てきたら僕にも教えてください。笑