この記事はアドカレに参加しています。
luaで複素数ライブラリを使う
みなさん、複素数すきですか?
すきなわけねぇよなぁあ
そんなこんなで、複素数を使わなければならないときがあります。
ところが、luaには複素数の演算をサポートしたものがありません。
そこで、外部ライブラリを使うなどの手段で複素数の計算を行います。
方法は4つあるので、順番に紹介していきます。
1. lua-complex
英語な言語をしゃべる人が作ったライブラリです。
ダウンロードとかはこちらから↓
lua-complex
こっちもたぶん同じもの↓
complex.lua
さて、肝心な使いかたですが、まずはrequireします。
require("complex")
この時点でエラーが出る時は、complex.luaがrequireできる場所にないとか、そもそもcomplex.luaをダウンロードしてないとか、そんなかんじです。
次に、複素数の宣言は、
local x1 = 3 + 4 * math.i
とします。math.iと掛け算しているほうが虚部です。
複素数同士の計算は、普通にx1*x2とかx1*10とかでいいみたいです。便利ですね。
で、気になるのがsinとかabsとかですが、これはmath.sinとかmath.absでできるみたいです。
local x1 = 3 + 4 * math.i
local s = math.sin(x1)--複素数の場合は複素数の計算をする
local d = math.sin(1)--実数の場合は実数の計算をする
便利ですね。
こんなに便利なライブラリですが、注意すべきことがあります。
それは、グローバル変数がいろいろと変更されるということです。
mathとか、typeとかいろいろいじられてます。少し残念ですね。
僕の環境ではdebug_printが上手くいかなかったので、場合によっては不都合が生じるかもしれないです。
2. complex.lua
こんどは、ジャパニーズな方が作った外部ライブラリです。
ダウンロードはこちらから↓
complex.lua
こちらもrequireして使います。
詳しい説明はダウンロード先で詳しく日本語で説明されているので、そちらを参照してください。やっぱり母国語だと安心しますね←英語弱者
特徴として挙げるなら、複素数の宣言を
local z = complex.new(3, 4)
とする、とかですかね。
あと、こちらもグローバル変数が使用されているので、注意が必要です。変数被りとか考えたくないですね。
3. c++から引っ張ってくる
この方法はdllを作る必要があるので少しめんどうです。
詳しい実装方法は、以下の二つの記事にあります。
AviUtlでC++のクラスや構造体を使う
LuaユーザーデータにC++クラスを載せるのは注意
c/c++とかの理解も必要だと思うので、少し大変だと思います。
4. 自分で実装する
1と2で紹介したライブラリはluaで書かれています。そこで、コードを覗いてみました。
基本的に複素数の値はテーブルで保持されています。
local s1 = 3 --実部
local s2 = 4 --虚部
local c = {r = s1, i = s2}
あとは、複素数同士の演算をする関数を定義するだけです。
数式とかも適当に調べれば出てくるので、自作ライブラリを作るのもありかもしれないですね。
複素数の指数関数・対数関数・べき関数
複素数の三角関数
最後に
いつかフラクタルとかもやってみたいですね。