class cmath extends emath
{
static function Complex(x:Number, y:Number):Array
{
return new Array(x, y);
}
static function add(a:Array, b:Array):Array
{
return new Array(a[0] + b[0], a[1] + b[1]);
}
static function min(a:Array, b:Array):Array
{
return new Array(a[0] - b[0], a[1] - b[1]);
}
static function mul(a:Array, b:Array):Array
{
return new Array(a[0] * b[0] - a[1] * b[1], a[0] * b[1] + a[1] * b[0]);
}
static function conj(a:Array):Array
{
return new Array(a[0], -a[1]);
}
static function abs(a:Array):Array
{
return new Array(Math.abs(a[0]), Math.abs(a[1]));
}
static function neg(a:Array):Array
{
return new Array(-a[0], -a[1]);
}
static function arg(a:Array):Number
{
return atan2(a[1], a[0]);
}
static function mod(a:Array, b:Boolean):Number
{
var d:Number = a[0] * a[0] + a[1] * a[1];
if (b)
{
return d;
}
return Math.sqrt(d);
}
static function div(a:Array, b:Array):Array
{
var d:Number = mod(b, true);
return new Array((a[0] * b[0] + a[1] * b[1]) / d, (a[0] * b[1] - a[1] * b[0]) / d);
}
static function sqrt(a:Array):Array
{
var r:Number = Math.sqrt(mod(a));
var t:Number = arg(a) / 2;
return new Array(r * Math.cos(t), r * Math.sin(t));
}
static function exp(a:Array):Array
{
var b:Number = Math.exp(a[0]);
return new Array(b * Math.cos(a[1]), b * Math.sin(a[1]));
}
static function log(a:Array):Array
{
return new Array(Math.log(mod(a)), arg(a));
}
static function xlog(a:Array, x:Array):Array
{
return div(log(a), log(x));
}
static function pow(a:Array, b:Array):Array
{
var r:Number = mod(a);
var t:Number = arg(a);
var x:Number = Math.pow(r, b[0]) * Math.exp(-b[1] * t);
var y:Number = b[0] * t + b[1] * Math.log(r);
return new Array(x * Math.cos(y), x * Math.sin(y));
}
//
static function sin(a:Array):Array
{
return new Array(emath.cosh(a[1]) * Math.sin(a[0]), emath.sinh(a[1]) * Math.cos(a[0]));
}
static function cos(a:Array):Array
{
return new Array(emath.cosh(a[1]) * Math.cos(a[0]), -emath.sinh(a[1]) * Math.sin(a[0]));
}
static function tan(a:Array):Array
{
return div(sin(a), cos(a));
}
//
static function sec(a:Array):Array
{
return div(new Array(1, 0), cos(a));
}
static function csc(a:Array):Array
{
return div(new Array(1, 0), sin(a));
}
static function cot(a:Array):Array
{
return div(cos(a), sin(a));
}
//
static function asin(a:Array):Array
{
return mul(new Array(0, -1), log(add(mul(new Array(0, 1), a), sqrt(min(new Array(1, 0), mul(a, a))))));
}
static function acos(a:Array):Array
{
return add(new Array(0.5 * PI, 0), mul(new Array(0, 1), log(add(mul(new Array(0, 1), a), sqrt(min(new Array(1, 0), mul(a, a)))))));
}
static function atan(a:Array):Array
{
return mul(new Array(0, 0.5), log(div(min(new Array(0, 1), a), add(new Array(0, 1), a))));
}
//
static function asec(a:Array):Array
{
return acos(div(new Array(1, 0), a));
}
static function acsc(a:Array):Array
{
return asin(div(new Array(1, 0), a));
}
static function acot(a:Array):Array
{
if (a[0] == 0 && a[1] == 0)
{
return new Array(emath.acot(0), 0);
}
return atan(div(new Array(1, 0), a));
}
//
static function sinh(a:Array):Array
{
var b:Array = min(exp(a), exp(new Array(-a[0], -a[1])));
return new Array(b[0] / 2, b[1] / 2);
}
static function cosh(a:Array):Array
{
var b:Array = add(exp(a), exp(new Array(-a[0], -a[1])));
return new Array(b[0] / 2, b[1] / 2);
}
static function tanh(a:Array):Array
{
return div(sinh(a), cosh(a));
}
//
static function sech(a:Array):Array
{
return div(new Array(1, 0), cosh(a));
}
static function csch(a:Array):Array
{
return div(new Array(1, 0), sinh(a));
}
static function coth(a:Array):Array
{
var b:Array = exp(a);
var c:Array = exp(new Array(-a[0], -a[1]));
return div(add(b, c), min(b, c));
}
//
static function asinh(a:Array):Array
{
return log(add(a, sqrt(add(new Array(1, 0), mul(a, a)))));
}
static function acosh(a:Array):Array
{
return log(add(a, sqrt(min(mul(a, a), new Array(1, 0)))));
}
static function atanh(a:Array):Array
{
var b:Array = log(div(new Array(1 + a[0], a[1]), new Array(1 - a[0], a[1])));
return new Array(b[0] / 2, b[1] / 2);
}
//
static function asech(a:Array):Array
{
return acosh(div(new Array(1, 0), a));
}
static function acsch(a:Array):Array
{
return asinh(div(new Array(1, 0), a));
}
static function acoth(a:Array):Array
{
return atanh(div(new Array(1, 0), a));
}
//
static function round(a:Array):Array
{
return new Array(Math.round(a[0]), Math.round(a[1]));
}
static function floor(a:Array):Array
{
return new Array(Math.floor(a[0]), Math.floor(a[1]));
}
static function ceil(a:Array):Array
{
return new Array(Math.ceil(a[0]), Math.ceil(a[1]));
}
//
private static var gamms:Array = new Array(inf, 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001599, 6227020793, 87178291129, 1307674367233, 20922789878933, 355687427980145);
static function Gamma(a:Array, b:Boolean):Array
{
if (a[1] == 0 && gamms[a[0]] != undefined)
{
return new Array(gamms[a[0]], 0);
}
if (a[1] == 0 && isInt(a[0]) && a[0] <= 0)
{
return new Array(inf, 0);
}
var c:Array = div(new Array(PI2, 0), a);
var d:Array = div(a, new Array(E, 0));
var e:Array = mul(a, sinh(div(new Array(1, 0), a)));
//
if (a[1] == 0 && isInt(a[0]))
{
e = pow(mul(d, e), a);
e = mul(sqrt(c), e);
return new Array(Math.round(e[0]), 0);
}
if (b)
{
e = add(e, div(new Array(1, 0), mul(new Array(810, 0), pow(a, new Array(6, 0)))));
}
e = pow(mul(d, e), a);
return mul(sqrt(c), e);
}
static function Fact(a:Array, b:Boolean):Array
{
return Gamma(new Array(1 + a[0], a[1]), b);
}
//
static function C(r:Array, k:Array):Array
{
var b:Array = div(Fact(r), mul(Fact(k), Fact(min(r, k))));
if (b[0] == inf || b[0] == ninf || isNaN(b[0]) || b[1] == inf || b[1] == ninf || isNaN(b[1]))
{
return new Array(0, 0);
}
return b;
}
static function Fib(n:Array):Array
{
return div(min(pow(new Array(emath.Phi, 0), n), pow(new Array(-emath.Phi, 0), new Array(-n[0], -n[1]))), new Array(emath.SQRT5, 0));
}
}
emath:
Min and Max take 'n' number of arguments, either numbers, or arrays of numbers, or both:
emath.Min(4,1,[2,4]); is acceptable
im running out of chars again:
cmath:
a complex number in my class is defined as [x,y] in an array
for both, Gamma and Factorial are approximations , 0 chars remaining lmao :D