@Override public IExpr pdf(IAST dist, IExpr k) { if (dist.isAST3()) { IExpr n = dist.arg1(); IExpr ns = dist.arg2(); IExpr nt = dist.arg3(); IExpr function = // [$ (Piecewise({{(Binomial(ns, #)*Binomial(-ns + nt, -# + n))/Binomial(nt, n), 0 <= # <= n && // n + ns - nt <= # <= n && 0 <= # <= ns && n + ns - nt <= # <= ns}}, 0)) & $] F.Function( F.Piecewise( F.List(F.List( F.Times(F.Binomial(ns, F.Slot1), F.Power(F.Binomial(nt, n), -1), F.Binomial(F.Plus(F.Negate(ns), nt), F.Plus(F.Negate(F.Slot1), n))), F.And(F.LessEqual(F.C0, F.Slot1, n), F.LessEqual(F.Plus(n, ns, F.Negate(nt)), F.Slot1, n), F.LessEqual(F.C0, F.Slot1, ns), F.LessEqual(F.Plus(n, ns, F.Negate(nt)), F.Slot1, ns)))), F.C0)); // $$; return callFunction(function, k); } return F.NIL; }
/** * <code>Cos(n*theta)</code> * * @param n * @param theta * @return */ private static IExpr expandCosTimes(IInteger n, IExpr theta) { int ni = n.toIntDefault(Integer.MIN_VALUE); if (ni > Integer.MIN_VALUE) { return F.sum(i -> Times(Times(Times(Power(CN1, Times(i, C1D2)), Binomial(n, i)), Power(Cos(theta), Plus(n, Times(CN1, i)))), Power(Sin(theta), i)), 0, ni, 2); } return F.NIL; }
/** * <code>Sin(n*theta)</code> * * @param n * @param theta * @return */ private static IExpr expandSinTimes(IInteger n, IExpr theta) { int ni = n.toIntDefault(Integer.MIN_VALUE); if (ni > Integer.MIN_VALUE) { return F.sum(i -> Times(Times(Times(Power(CN1, Times(Plus(i, CN1), C1D2)), Binomial(n, i)), Power(Cos(theta), Plus(n, Times(CN1, i)))), Power(Sin(theta), i)), 1, ni, 2); } return F.NIL; }
@Override public IExpr pdf(IAST dist, IExpr k) { if (dist.isAST2()) { IExpr n = dist.arg1(); IExpr m = dist.arg2(); // IExpr function = // [$ Piecewise({{(1 - m)^(-# + n)*m^#*Binomial(n, #), 0 <= # <= n}}, 0) & $] F.Function( F.Piecewise(F.List(F.List( F.Times(F.Power(F.Plus(F.C1, F.Negate(m)), F.Plus(F.Negate(F.Slot1), n)), F.Power(m, F.Slot1), F.Binomial(n, F.Slot1)), F.LessEqual(F.C0, F.Slot1, n))), F.C0)); // $$; return callFunction(function, k); } return F.NIL; }
@Override public IExpr evaluate(final IAST ast, EvalEngine engine) { Validate.checkRange(ast, 1); if (ast.isAST1()) { // (n) ==> 1 return F.C1; } if (ast.isAST2()) { return F.Binomial(F.Plus(ast.arg1(), ast.arg2()), ast.arg2()); } int position = ast.indexOf(x -> (!x.isInteger()) || ((IInteger) x).isNegative()); if (position < 0) { return multinomial(ast); } int argSize = ast.size() - 1; if (position == argSize && !ast.get(argSize).isNumber()) { // recurrence: Multinomial(n1, n2, n3,..., ni, k) => // Multinomial(n1+n2+n3+...+ni, k) * Multinomial(n1, n2, n3,..., ni) IAST reducedPlus = ast.removeFromEnd(argSize).apply(F.Plus); IAST reducedMultinomial = ast.removeFromEnd(argSize); return F.Times(F.Multinomial(reducedPlus, ast.get(argSize)), multinomial(reducedMultinomial)); } return F.NIL; }
ExpandAll(Plus(Times(Power(Plus(fromMinusOne, C1), Plus(p, C1)), Power(Plus(p, C1), CN1)), Sum( Times(Times(Times(Power(Plus(fromMinusOne, C1), Plus(Plus(p, Times(CN1, k)), C1)), Binomial(p, k)), BernoulliB(k)), Power(Plus(Plus(p, Times(CN1, k)), C1), CN1)), List(k, C1, p))))); } else { term2 = F.eval(ExpandAll(Plus(Times(Power(Plus(to, C1), Plus(p, C1)), Power(Plus(p, C1), CN1)), Sum(Times( Times(Times(Power(Plus(to, C1), Plus(Plus(p, Times(CN1, k)), C1)), Binomial(p, k)), BernoulliB(k)), Power(Plus(Plus(p, Times(CN1, k)), C1), CN1)), List(k, C1, p)))));
rest.addAll(timesAST, 2, timesAST.size()); if (result.isSin()) { return Sum(Times(Times(Times(Power(CN1, Times(Plus(F.$s("i"), Times(CN1, C1)), C1D2)), Binomial(iNum, $s("i"))), Power(Cos(rest), Plus(iNum, Times(CN1, $s("i"))))), Power(Sin(rest), $s("i"))), List($s("i"), C1, iNum, C2)); } else if (result.isCos()) { return Sum(Times(Times(Times(Power(CN1, Times(F.$s("i"), C1D2)), Binomial(iNum, $s("i"))), Power(Cos(rest), Plus( iNum, Times(CN1, $s("i"))))), Power(Sin(rest), $s("i"))), List($s("i"), C0, iNum, C2));
if (boole.isTrue()) { return F.Binomial(n, F.Subtract(n, k));
F.Plus(F.C1, F.Times(F.CN1, F.Factorial(ns), F.Factorial(F.Plus(F.Negate(ns), nt)), F.Power(F.Times(F.Binomial(nt, n), F.Factorial(F.Plus(F.CN1, n, F.Negate(F.Floor(F.Slot1)))), F.Factorial(F.Plus(F.CN1, ns, F.Negate(F.Floor(F.Slot1))))),