@Override public IExpr evaluate(final IAST ast, EvalEngine engine) { Validate.checkSize(ast, 3); IExpr arg1 = ast.arg1(); IExpr arg2 = ast.arg2(); int dim1 = arg1.isVector(); int dim2 = arg2.isVector(); if (dim1 > (-1) && dim2 > (-1)) { return ArcCos(Divide(Dot(arg1, arg2), Times(Norm(arg1), Norm(arg2)))); } return F.NIL; }
@Override public IExpr evaluate(final IAST ast, EvalEngine engine) { Validate.checkSize(ast, 3); IExpr n = ast.arg1(); IExpr z = ast.arg2(); if (engine.isNumericMode() && n.isNumber() && z.isNumber()) { // (n, z) => Cos(n*ArcCos(z)) return F.Cos(F.Times(n, F.ArcCos(z))); } int degree = n.toIntDefault(Integer.MIN_VALUE); if (degree != Integer.MIN_VALUE) { if (degree < 0) { degree *= -1; } return PolynomialsUtils.createChebyshevPolynomial(degree, ast.arg2()); } if (n.isNumEqualRational(F.C1D2) || n.isNumEqualRational(F.CN1D2)) { // (1/2, z) => Cos(ArcCos(z)/2) // (-1/2, z) => Cos(ArcCos(z)/2) return F.Cos(F.Times(F.C1D2, F.ArcCos(z))); } if (z.isZero()) { // Cos(Pi*n*(1/2)) return F.Cos(F.Times(F.C1D2, F.Pi, n)); } return F.NIL; }
@Override public IExpr evaluate(final IAST ast, EvalEngine engine) { Validate.checkSize(ast, 2); int dim = ast.arg1().isVector(); if (dim > 0) { IAST list = (IAST) ast.arg1(); if (dim == 2) { IExpr x = list.arg1(); IExpr y = list.arg2(); return F.List(F.Sqrt(F.Plus(F.Sqr(x), F.Sqr(y))), F.ArcTan(x, y)); } else if (dim == 3) { IExpr x = list.arg1(); IExpr y = list.arg2(); IExpr z = list.arg3(); IAST sqrtExpr = F.Sqrt(F.Plus(F.Sqr(x), F.Sqr(y), F.Sqr(z))); return F.List(sqrtExpr, F.ArcCos(F.Divide(x, sqrtExpr)), F.ArcTan(y, z)); } } else if (ast.arg1().isList()) { IAST list = (IAST) ast.arg1(); return list.mapThread(F.ListAlloc(list.size()), ast, 1); } return F.NIL; }
ORDERLESS_MATCHER.defineHashRule(ArcSin(x_), ArcCos(x_), F.CPiHalf);
F.Sin(F.Times(F.Plus(F.C1, n), F.ArcCos(z))));