Complex Number Library for LoveJIT
Posted: Sun Feb 10, 2013 3:27 am
I made a complex number library for LuaJIT, and it happened to cause no errors in LoveJIT, so I'm sharing it here. I'm thinking about making a complex grapher soon.
Using complex numbers with this is very easy.
Defining a complex number:
Yes, that's it! LuaJIT comes with the syntax for complex numbers, but absolutely no metatables are attached.
So, in the LuaJIT command line:
print(1i)
>0+1i
print(1+1i)
> error, attempt to add 'number' and 'complex'
Enter my Complex Number Library! Simply drop the script in, require it, and use the functions contained in the cmath table. They work exactly the same as the the regular math table, but can handle complex arguments. They will return complex values at appropriate times such as cmath.sqrt(-1) cmath.asin(1.5), etc. They still manage to work just the same for regular numbers though!
> 0.90929742682568-0i <--0i means no imaginary component
> 0.90929742682568
> 498.58326915132-228.18002012795i
> Error: number expected, got cdata
Functions and constants available in cmath:
Constants
-e=2.718281828459
-i=sqrt(-1)
-pi
Complex creation and extraction functions
-complex(re,im) creates a complex number from real and imaginary components.
-re(z) real part of z
-im(z) imaginary part of z
-arg(z) argument of z
-abs(z) absolute value of z
-sqrt(z) = z^0.5
-pow(x,y) = x^y
-exp(z) = e^z
-ln(z) = e^? = z
-log(x,y) = ln(y)/ln(x)
Trig functions
-sin
-cos
-tan
-sinh
-cosh
-tanh
-asin
-acos
-atan
-atan2
-asinh
-acosh
-atanh
Miscellaneous functions
-polar(z) returns r,phi = cmath.abs(z),cmath.arg(z)
-rect(r,phi) returns a complex number from polar = r*e^(i*phi)
-diff(z) = re(z)^2-im(z)^2
-zeta(z[,accuracy=1e4]) riemann zeta function
-lintegrate(f,H,[L=0,n=sensible for H])
-cx(string) creates a complex number from a string (e.g. "1.1-i" -> 1.1+-1i)
-cx(re,im) = complex(re,im)
Explore a bit! Try these:
-If i is sqrt(-1),what's sqrt(-i)?
-What's i^i?
-Can it calculate Euler's identity?
Using complex numbers with this is very easy.
Defining a complex number:
Code: Select all
local complexnum=1+2i
So, in the LuaJIT command line:
print(1i)
>0+1i
print(1+1i)
> error, attempt to add 'number' and 'complex'
Enter my Complex Number Library! Simply drop the script in, require it, and use the functions contained in the cmath table. They work exactly the same as the the regular math table, but can handle complex arguments. They will return complex values at appropriate times such as cmath.sqrt(-1) cmath.asin(1.5), etc. They still manage to work just the same for regular numbers though!
Code: Select all
require'Complex'
print(cmath.sin(2))
print(math.sin(2))
print(cmath.sin(2+7i))
print(math.sin(2+7i))
> 0.90929742682568
> 498.58326915132-228.18002012795i
> Error: number expected, got cdata
Functions and constants available in cmath:
Constants
-e=2.718281828459
-i=sqrt(-1)
-pi
Complex creation and extraction functions
-complex(re,im) creates a complex number from real and imaginary components.
-re(z) real part of z
-im(z) imaginary part of z
-arg(z) argument of z
-abs(z) absolute value of z
-sqrt(z) = z^0.5
-pow(x,y) = x^y
-exp(z) = e^z
-ln(z) = e^? = z
-log(x,y) = ln(y)/ln(x)
Trig functions
-sin
-cos
-tan
-sinh
-cosh
-tanh
-asin
-acos
-atan
-atan2
-asinh
-acosh
-atanh
Miscellaneous functions
-polar(z) returns r,phi = cmath.abs(z),cmath.arg(z)
-rect(r,phi) returns a complex number from polar = r*e^(i*phi)
-diff(z) = re(z)^2-im(z)^2
-zeta(z[,accuracy=1e4]) riemann zeta function
-lintegrate(f,H,[L=0,n=sensible for H])
-cx(string) creates a complex number from a string (e.g. "1.1-i" -> 1.1+-1i)
-cx(re,im) = complex(re,im)
Explore a bit! Try these:
-If i is sqrt(-1),what's sqrt(-i)?
-What's i^i?
-Can it calculate Euler's identity?