package jmathlib.toolbox.general; import jmathlib.core.tokens.numbertokens.DoubleNumberToken; import jmathlib.core.tokens.Token; import jmathlib.core.tokens.OperandToken; import jmathlib.core.functions.ExternalFunction; import jmathlib.core.interpreter.GlobalValues; /**External function to calculate the number of combinations when k objects are taken from a set of k*/ public class combinations extends ExternalFunction { /**calculate the number of combinations @param operand[0] = The the number of objects taken @param operand[1] = The total number of objects @return the number of combinations */ public OperandToken evaluate(Token[] operands, GlobalValues globals) { OperandToken result = new DoubleNumberToken(0); if (getNArgIn(operands)!= 2) throwMathLibException("combinations: number of arguments != 2"); if (!(operands[0] instanceof DoubleNumberToken) && !(operands[1] instanceof DoubleNumberToken) ) throwMathLibException("combinations: arguments must be numbers"); //comb(x y) = y!/(x! * (y-x)!) DoubleNumberToken objects = ((DoubleNumberToken)operands[0]); DoubleNumberToken total = ((DoubleNumberToken)operands[1]); //result = x! result = objects.factorial(); //temp = y-x OperandToken temp = ((OperandToken)total.clone()); temp = temp.subtract(objects); //temp = (y-x)! temp = temp.factorial(); //result = x! * (y-x)! result = result.multiply(temp); //result = y! / (x! * (y-x)!) temp = total.factorial(); result = temp.divide(result); return result; } } /* @GROUP general @SYNTAX answer = combinations(items, total) @DOC Returns the number of combinations when taking count items from a set of total items. @EXAMPLES combinations(3,5) = 10 combinations(3,6) = 20 @NOTES @SEE permutations */