#include #include #include #include #include "helper.h" using namespace Poincare; QUIZ_CASE(poincare_complex_evaluate) { // Real assert_parsed_expression_evaluates_to("𝐒", "unreal", System, Radian, Real); assert_parsed_expression_evaluates_to("√(-1)", "unreal", System, Radian, Real); assert_parsed_expression_evaluates_to("√(-1)Γ—βˆš(-1)", "unreal", System, Radian, Real); assert_parsed_expression_evaluates_to("ln(-2)", "unreal", System, Radian, Real); assert_parsed_expression_evaluates_to("(-8)^(1/3)", "-2", System, Radian, Real); assert_parsed_expression_evaluates_to("8^(1/3)", "2", System, Radian, Real); assert_parsed_expression_evaluates_to("(-8)^(2/3)", "4", System, Radian, Real); assert_parsed_expression_evaluates_without_simplifying_to("root(-8,3)", "-2", Radian, Real); // Cartesian assert_parsed_expression_evaluates_to("𝐒", "𝐒", System, Radian, Cartesian); assert_parsed_expression_evaluates_to("√(-1)", "𝐒", System, Radian, Cartesian); assert_parsed_expression_evaluates_to("√(-1)Γ—βˆš(-1)", "-1", System, Radian, Cartesian); assert_parsed_expression_evaluates_to("ln(-2)", "6.9314718055995ᴇ-1+3.1415926535898×𝐒", System, Radian, Cartesian); assert_parsed_expression_evaluates_to("(-8)^(1/3)", "1+1.7320508075689×𝐒", System, Radian, Cartesian); assert_parsed_expression_evaluates_to("(-8)^(2/3)", "-2+3.464102×𝐒", System, Radian, Cartesian); assert_parsed_expression_evaluates_without_simplifying_to("root(-8,3)", "1+1.7320508075689×𝐒", Radian, Cartesian); // Polar assert_parsed_expression_evaluates_to("𝐒", "β„―^(1.570796×𝐒)", System, Radian, Polar); assert_parsed_expression_evaluates_to("√(-1)", "β„―^(1.5707963267949×𝐒)", System, Radian, Polar); assert_parsed_expression_evaluates_to("√(-1)Γ—βˆš(-1)", "β„―^(3.1415926535898×𝐒)", System, Radian, Polar); assert_parsed_expression_evaluates_to("(-8)^(1/3)", "2Γ—β„―^(1.0471975511966×𝐒)", System, Radian, Polar); assert_parsed_expression_evaluates_to("(-8)^(2/3)", "4Γ—β„―^(2.094395×𝐒)", System, Radian, Polar); assert_parsed_expression_evaluates_without_simplifying_to("root(-8,3)", "2Γ—β„―^(1.0471975511966×𝐒)", Radian, Polar); } QUIZ_CASE(poincare_complex_simplify) { // Real assert_parsed_expression_simplify_to("𝐒", "unreal", User, Radian, Real); assert_parsed_expression_simplify_to("√(-1)", "unreal", User, Radian, Real); assert_parsed_expression_simplify_to("√(-1)Γ—βˆš(-1)", "unreal", User, Radian, Real); assert_parsed_expression_simplify_to("ln(-2)", "ln(-2)", User, Radian, Real); assert_parsed_expression_simplify_to("(-8)^(2/3)", "4", User, Radian, Real); assert_parsed_expression_simplify_to("(-8)^(2/5)", "2Γ—root(2,5)", User, Radian, Real); assert_parsed_expression_simplify_to("(-8)^(1/5)", "-root(8,5)", User, Radian, Real); assert_parsed_expression_simplify_to("(-8)^(1/4)", "unreal", User, Radian, Real); assert_parsed_expression_simplify_to("(-8)^(1/3)", "-2", User, Radian, Real); // Cartesian assert_parsed_expression_simplify_to("-2.3ᴇ3", "-2300", User, Radian, Cartesian); assert_parsed_expression_simplify_to("3", "3", User, Radian, Cartesian); assert_parsed_expression_simplify_to("inf", "inf", User, Radian, Cartesian); assert_parsed_expression_simplify_to("1+2+𝐒", "3+𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("-(5+2×𝐒)", "-5-2×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("(5+2×𝐒)", "5+2×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("𝐒+𝐒", "2×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("-2+2×𝐒", "-2+2×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("(3+𝐒)-(2+4×𝐒)", "1-3×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("(2+3×𝐒)Γ—(4-2×𝐒)", "14+8×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("(3+𝐒)/2", "3/2+1/2×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("(3+𝐒)/(2+𝐒)", "7/5-1/5×𝐒", User, Radian, Cartesian); // The simplification of (3+𝐒)^(2+𝐒) in a Cartesian complex form generates to many nodes //assert_parsed_expression_simplify_to("(3+𝐒)^(2+𝐒)", "10Γ—cos((-4Γ—atan(3)+ln(2)+ln(5)+2Γ—Ο€)/2)Γ—β„―^((2Γ—atan(3)-Ο€)/2)+10Γ—sin((-4Γ—atan(3)+ln(2)+ln(5)+2Γ—Ο€)/2)Γ—β„―^((2Γ—atan(3)-Ο€)/2)×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("(3+𝐒)^(2+𝐒)", "(𝐒+3)^(𝐒+2)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("√(1+6𝐒)", "√(2Γ—βˆš(37)+2)/2+√(2Γ—βˆš(37)-2)/2×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("(1+𝐒)^2", "2×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("2×𝐒", "2×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("𝐒!", "𝐒!", User, Radian, Cartesian); assert_parsed_expression_simplify_to("3!", "6", User, Radian, Cartesian); assert_parsed_expression_simplify_to("x!", "x!", User, Radian, Cartesian); assert_parsed_expression_simplify_to("β„―", "β„―", User, Radian, Cartesian); assert_parsed_expression_simplify_to("Ο€", "Ο€", User, Radian, Cartesian); assert_parsed_expression_simplify_to("𝐒", "𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("abs(-3)", "3", User, Radian, Cartesian); assert_parsed_expression_simplify_to("abs(-3+𝐒)", "√(10)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("atan(2)", "atan(2)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("atan(2+𝐒)", "atan(2+𝐒)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("binomial(10, 4)", "210", User, Radian, Cartesian); assert_parsed_expression_simplify_to("ceil(-1.3)", "-1", User, Radian, Cartesian); assert_parsed_expression_simplify_to("arg(-2)", "Ο€", User, Radian, Cartesian); // TODO: confidence is not simplified yet //assert_parsed_expression_simplify_to("confidence(-2,-3)", "confidence(-2)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("conj(-2)", "-2", User, Radian, Cartesian); assert_parsed_expression_simplify_to("conj(-2+2×𝐒+𝐒)", "-2-3×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("cos(12)", "cos(12)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("cos(12+𝐒)", "cos(12+𝐒)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("diff(3Γ—x, x, 3)", "diff(3Γ—x,x,3)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("quo(34,x)", "quo(34,x)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("rem(5,3)", "2", User, Radian, Cartesian); assert_parsed_expression_simplify_to("floor(x)", "floor(x)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("frac(x)", "frac(x)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("gcd(x,y)", "gcd(x,y)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("im(1+𝐒)", "1", User, Radian, Cartesian); assert_parsed_expression_simplify_to("int(x^2, x, 1, 2)", "int(x^2,x,1,2)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("lcm(x,y)", "lcm(x,y)", User, Radian, Cartesian); // TODO: dim is not simplified yet //assert_parsed_expression_simplify_to("dim(x)", "dim(x)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("root(2,𝐒)", "cos(ln(2))-sin(ln(2))×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("root(2,𝐒+1)", "√(2)Γ—cos((90Γ—ln(2))/Ο€)-√(2)Γ—sin((90Γ—ln(2))/Ο€)×𝐒", User, Degree, Cartesian); assert_parsed_expression_simplify_to("root(2,𝐒+1)", "√(2)Γ—cos(ln(2)/2)-√(2)Γ—sin(ln(2)/2)×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("permute(10, 4)", "5040", User, Radian, Cartesian); // TODO: prediction is not simplified yet //assert_parsed_expression_simplify_to("prediction(-2,-3)", "prediction(-2)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("randint(2,4)", "randint(2,4)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("random()", "random()", User, Radian, Cartesian); assert_parsed_expression_simplify_to("re(x)", "x", User, Radian, Cartesian); assert_parsed_expression_simplify_to("round(x,y)", "round(x,y)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("sign(x)", "sign(x)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("sin(23)", "sin(23)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("sin(23+𝐒)", "sin(23+𝐒)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("√(1-𝐒)", "√(2Γ—βˆš(2)+2)/2-√(2Γ—βˆš(2)-2)/2×𝐒", User, Radian, Cartesian); assert_parsed_expression_simplify_to("tan(23)", "tan(23)", User, Radian, Cartesian); assert_parsed_expression_simplify_to("tan(23+𝐒)", "tan(23+𝐒)", User, Radian, Cartesian); // User defined variable assert_parsed_expression_simplify_to("a", "a", User, Radian, Cartesian); // a = 2+i assert_simplify("2+𝐒→a"); assert_parsed_expression_simplify_to("a", "2+𝐒", User, Radian, Cartesian); // Clean the storage for other tests Ion::Storage::sharedStorage()->recordNamed("a.exp").destroy(); // User defined function assert_parsed_expression_simplify_to("f(3)", "f(3)", User, Radian, Cartesian); // f : x β†’ x+1 assert_simplify("x+1+𝐒→f(x)"); assert_parsed_expression_simplify_to("f(3)", "4+𝐒", User, Radian, Cartesian); // Clean the storage for other tests Ion::Storage::sharedStorage()->recordNamed("f.func").destroy(); // Polar assert_parsed_expression_simplify_to("-2.3ᴇ3", "2300Γ—β„―^(π×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("3", "3", User, Radian, Polar); assert_parsed_expression_simplify_to("inf", "inf", User, Radian, Polar); assert_parsed_expression_simplify_to("1+2+𝐒", "√(10)Γ—β„―^((-2Γ—atan(3)+Ο€)/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("1+2+𝐒", "√(10)Γ—β„―^((-π×atan(3)+90Γ—Ο€)/180×𝐒)", User, Degree, Polar); assert_parsed_expression_simplify_to("-(5+2×𝐒)", "√(29)Γ—β„―^((-2Γ—atan(5/2)-Ο€)/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("(5+2×𝐒)", "√(29)Γ—β„―^((-2Γ—atan(5/2)+Ο€)/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("𝐒+𝐒", "2Γ—β„―^(Ο€/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("𝐒+𝐒", "2Γ—β„―^(Ο€/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("-2+2×𝐒", "2Γ—βˆš(2)Γ—β„―^((3Γ—Ο€)/4×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("(3+𝐒)-(2+4×𝐒)", "√(10)Γ—β„―^((2Γ—atan(1/3)-Ο€)/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("(2+3×𝐒)Γ—(4-2×𝐒)", "2Γ—βˆš(65)Γ—β„―^((-2Γ—atan(7/4)+Ο€)/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("(3+𝐒)/2", "√(10)/2Γ—β„―^((-2Γ—atan(3)+Ο€)/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("(3+𝐒)/(2+𝐒)", "√(2)Γ—β„―^((2Γ—atan(7)-Ο€)/2×𝐒)", User, Radian, Polar); // TODO: simplify atan(tan(x)) = xΒ±kΓ—pi? //assert_parsed_expression_simplify_to("(3+𝐒)^(2+𝐒)", "10Γ—β„―^((2Γ—atan(3)-Ο€)/2)Γ—β„―^((-4Γ—atan(3)+ln(2)+ln(5)+2Γ—Ο€)/2×𝐒)", User, Radian, Polar); // The simplification of (3+𝐒)^(2+𝐒) in a Polar complex form generates to many nodes //assert_parsed_expression_simplify_to("(3+𝐒)^(2+𝐒)", "10Γ—β„―^((2Γ—atan(3)-Ο€)/2)Γ—β„―^((atan(tan((-4Γ—atan(3)+ln(2)+ln(5)+2Γ—Ο€)/2))+Ο€)×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("(3+𝐒)^(2+𝐒)", "(𝐒+3)^(𝐒+2)", User, Radian, Polar); assert_parsed_expression_simplify_to("(1+𝐒)^2", "2Γ—β„―^(Ο€/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("2×𝐒", "2Γ—β„―^(Ο€/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("3!", "6", User, Radian, Polar); assert_parsed_expression_simplify_to("x!", "x!", User, Radian, Polar); assert_parsed_expression_simplify_to("β„―", "β„―", User, Radian, Polar); assert_parsed_expression_simplify_to("Ο€", "Ο€", User, Radian, Polar); assert_parsed_expression_simplify_to("𝐒", "β„―^(Ο€/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("abs(-3)", "3", User, Radian, Polar); assert_parsed_expression_simplify_to("abs(-3+𝐒)", "√(10)", User, Radian, Polar); assert_parsed_expression_simplify_to("conj(2Γ—β„―^(𝐒×π/2))", "2Γ—β„―^(-Ο€/2×𝐒)", User, Radian, Polar); assert_parsed_expression_simplify_to("-2Γ—β„―^(𝐒×π/2)", "2Γ—β„―^(-Ο€/2×𝐒)", User, Radian, Polar); // User defined variable assert_parsed_expression_simplify_to("a", "√(a^2)Γ—β„―^((-π×sign(a)+Ο€)/2×𝐒)", User, Radian, Polar); // a = 2 + 𝐒 assert_simplify("2+𝐒→a"); assert_parsed_expression_simplify_to("a", "√(5)Γ—β„―^((-2Γ—atan(2)+Ο€)/2×𝐒)", User, Radian, Polar); // Clean the storage for other tests Ion::Storage::sharedStorage()->recordNamed("a.exp").destroy(); // User defined function assert_parsed_expression_simplify_to("f(3)", "√(f(3)^2)Γ—β„―^((-π×sign(f(3))+Ο€)/2×𝐒)", User, Radian, Polar); // f: x β†’ x+1 assert_simplify("x+1+𝐒→f(x)"); assert_parsed_expression_simplify_to("f(3)", "√(17)Γ—β„―^((-2Γ—atan(4)+Ο€)/2×𝐒)", User, Radian, Polar); // Clean the storage for other tests Ion::Storage::sharedStorage()->recordNamed("f.func").destroy(); }