equationSolver4 = (aq, bq, cq, dq, eq) => {
var aq2 = aq;
var bq2 = bq;
var perfect = 0;
var perfectbiquadratic = 0;
if (cq*cq - 4*aq*eq == 0 && cq > 0) {
perfectbiquadratic = 1;
}
bq /= aq;
cq /= aq;
dq /= aq;
eq /= aq;
aq = 1;
var f2 = cq - (3*bq*bq / 8);
var g2 = dq + (bq*bq*bq/8) - (bq*cq/2);
var h2 = eq - (3*bq*bq*bq*bq/256) + (bq*bq*(cq/16)) - (bq*dq/4);
var a = 1;
var b = f2/2;
var c = (f2*f2 - (4*h2)) / 16;
var d = -1*((g2*g2)/64);
if (b == 0 && c == 0 && d == 0) {
perfect = 1;
}
var f = (((3*c) / a) - ((b*b) / (a*a))) / 3;
var g = (((2*b*b*b) / (a*a*a)) - ((9*b*c) / (a*a)) + ((27*d) / a)) / 27;
var h = eval(((g*g)/4) + ((f*f*f)/27));
var z = 1/3;
var i;
var j;
var k;
var l;
var m;
var n;
var p;
var xoneterm;
var xtwoterm;
var xthreeterm;
var alreadydone;
var alreadydone2 = 0;
var ipart = 0;
var p = 0;
var q = 0;
var r = 0;
var s = 0;
if (h <= 0) {
var exec = 2;
i = Math.sqrt(((g*g) / 4) - h);
j = Math.pow(i,z);
k = Math.acos(-1 * (g / (2*i)));
l = -1*j;
m = Math.cos(k / 3);
n = Math.sqrt(3) * Math.sin(k / 3);
p = (b / (3*a)) * -1;
xoneterm = (2*j) * Math.cos(k/3) - (b / (3*a));
xtwoterm = l * (m + n) + p;
xthreeterm = l * (m - n) + p;
}
if (h > 0) {
var exec = 1;
var R = (-1*(g / 2)) + Math.sqrt(h);
if (R < 0) {
var S = -1*(Math.pow((-1*R),z));
} else {
var S = Math.pow(R,z);
}
var T = (-1*(g / 2)) - Math.sqrt(h);
if (T < 0) {
var U = -1*(Math.pow((-1*T),z));
} else {
var U = Math.pow(T,z);
}
xoneterm = (S + U) - (b / (3*a));
xtwoterm = (-1*(S+U)/2) - (b / (3*a));
var ipart = ((S-U) * Math.sqrt(3)) / 2;
xthreeterm = xtwoterm;
}
if (f == 0 && g == 0 && h == 0) {
if ((d/a) < 0 ) {
xoneterm = (Math.pow((-1*(d/a)),z));
xtwoterm = xoneterm;
xthreeterm = xoneterm;
} else {
xoneterm = -1*(Math.pow((d/a),z));
xtwoterm = xoneterm;
xthreeterm = xoneterm;
}
}
if (ipart == 0 && xoneterm.toFixed(10) == 0) {
var alreadydone2 = 1;
var p2 = Math.sqrt(xtwoterm);
var q = Math.sqrt(xthreeterm);
var r = -g2 / (8*p2*q);
var s = bq2/(4*aq2);
}
if (ipart == 0 && xtwoterm.toFixed(10) == 0 && alreadydone2 == 0 && alreadydone2 != 1) {
var alreadydone2 = 2;
var p2 = Math.sqrt(xoneterm);
var q = Math.sqrt(xthreeterm);
var r = -g2 / (8*p2*q);
var s = bq2/(4*aq2);
}
if (ipart == 0 && xthreeterm.toFixed(10) == 0 && alreadydone2 == 0 && alreadydone2 != 1 && alreadydone2 != 2) {
var alreadydone2 = 3;
var p2 = Math.sqrt(xoneterm);
var q = Math.sqrt(xtwoterm);
var r = -g2 / (8*p2*q);
var s = bq2/(4*aq2);
}
if (alreadydone2 == 0 && ipart == 0) {
if (xthreeterm.toFixed(10) < 0) {
var alreadydone2 = 4;
var p2 = Math.sqrt(xoneterm);
var q = Math.sqrt(xtwoterm);
var r = -g2 / (8*p2*q);
var s = bq2/(4*aq2);
} else {
var alreadydone2 = 5;
var p2 = Math.sqrt(xoneterm.toFixed(10));
var q = Math.sqrt(xthreeterm.toFixed(10));
var r = -g2 / (8*p2*q);
var s = bq2/(4*aq2);
}
}
if (ipart != 0) {
var p2 = isquareroot(xtwoterm,ipart,0);
var p2ipart = isquareroot(xtwoterm,ipart,1);
var q = isquareroot(xthreeterm,-ipart,0);
var qipart = isquareroot(xthreeterm,-ipart,1);
var mult = calcmult(p2,p2ipart,q,qipart,0);
var r = -g2/(8*mult);
var s = bq2/(4*aq2);
}
if (ipart == 0 && xtwoterm.toFixed(10) < 0 && xthreeterm.toFixed(10) < 0) {
xtwoterm /= -1
xthreeterm /= -1
var p2 = 0;
var q = 0;
var p2ipart = Math.sqrt(xtwoterm);
var qipart = Math.sqrt(xthreeterm);
var mult = calcmult(p2,p2ipart,q,qipart,0);
var r = -g2/(8*mult);
var s = bq2/(4*aq2);
var ipart = 1;
}
if (xoneterm.toFixed(10) > 0 && xtwoterm.toFixed(10) < 0 && xthreeterm.toFixed(10) == 0 && ipart == 0) {
xtwoterm /= -1;
var p2 = Math.sqrt(xoneterm);
var q = 0;
var p2ipart = 0;
var qipart = Math.sqrt(xtwoterm);
var mult = calcmult(p2,p2ipart,q,qipart,0);
var mult2 = calcmult(p2,p2ipart,q,qipart,1);
var r = -g2/(8*mult);
if (mult2 != 0) {
var ripart = g2/(8*mult2);
var r = 0;
}
var s = bq2/(4*aq2);
var ipart = 1;
}
if (xtwoterm.toFixed(10) == 0 && xthreeterm.toFixed(10) == 0 && ipart == 0) {
var p2 = Math.sqrt(xoneterm);
var q = 0;
var r = 0;
var s = bq2/(4*aq2);
}
if (ipart == 0) {
var x1 = eval((p2 + q + r - s).toFixed(10));
var x2 = eval((p2 - q - r - s).toFixed(10));
var x3 = eval((-p2 + q - r - s).toFixed(10));
var x4 = eval((-p2 - q + r - s).toFixed(10));
var x1i = 0;
var x2i = 0;
var x3i = 0;
var x4i = 0;
}
if (perfect == 1) {
var x1 = -bq/4;
var x2 = -bq/4;
var x3 = -bq/4;
var x4 = -bq/4;
var x1i = 0;
var x2i = 0;
var x3i = 0;
var x4i = 0;
}
if (ipart == 0 && xtwoterm.toFixed(10) < 0 && xthreeterm.toFixed(10) < 0) {
xtwoterm /= -1;
xthreeterm /= -1;
var p2 = 0;
var q = 0;
var p2ipart = Math.sqrt(xtwoterm);
var qipart = Math.sqrt(xthreeterm);
var mult = calcmult(p2,p2ipart,q,qipart,0);
var r = -g2/(8*mult);
var s = bq2/(4*aq2);
var ipart = 1;
}
if (xoneterm.toFixed(10) > 0 && xtwoterm.toFixed(10) < 0 && xthreeterm.toFixed(10) == 0 && ipart == 0) {
xtwoterm /= -1
var p2 = Math.sqrt(xoneterm);
var q = 0;
var p2ipart = 0;
var qipart = Math.sqrt(xtwoterm);
var mult = calcmult(p2,p2ipart,q,qipart,0);
var mult2 = calcmult(p2,p2ipart,q,qipart,1);
var r = -g2/(8*mult);
if (mult2 != 0) {
var ripart = g2/(8*mult2);
var r = 0;
}
var s = bq2/(4*aq2);
var ipart = 1;
}
if (xtwoterm.toFixed(10) == 0 && xthreeterm.toFixed(10) == 0 && ipart == 0) {
var p2 = Math.sqrt(xoneterm);
var q = 0;
var r = 0;
var s = bq2/(4*aq2);
}
if (ipart != 0) {
var x1 = eval((p2 + q + r - s).toFixed(10));
var x2 = eval((p2 - q - r - s).toFixed(10));
var x3 = eval((-p2 + q - r - s).toFixed(10));
var x4 = eval((-p2 - q + r - s).toFixed(10));
var x1i = eval((p2ipart + qipart).toFixed(10));
var x2i = eval((p2ipart - qipart).toFixed(10));
var x3i = eval((-p2ipart + qipart).toFixed(10));
var x4i = eval((-p2ipart - qipart).toFixed(10));
}
if (perfectbiquadratic == 1) {
var x1 = 0;
var x2 = 0;
var x3 = 0;
var x4 = 0;
var x1i = eval(Math.sqrt(cq/2).toFixed(10));
var x2i = eval(Math.sqrt(cq/2).toFixed(10));
var x3i = -eval(Math.sqrt(cq/2).toFixed(10));
var x4i = -eval(Math.sqrt(cq/2).toFixed(10));
}
return ({'x1' : x1 + ' ' + x1i,
'x2' : x2 + ' ' + x2i,
'x3' : x3 + ' ' + x3i,
'x4' : x4 + ' ' + x4i})
};