internal override Symbol PreEval(Symbol x) { if (!x.IsInteger() || x.Smaller(Symbol.ZERO)) { throw new SymbolicException("Argument to factorial must be a positive integer, is " + x); } Algebraic r = Symbol.ONE; while (Symbol.ONE.Smaller(x)) { r = r * x; x = ( Symbol )(x - Symbol.ONE); } return(( Symbol )r); }
internal virtual Algebraic fzexakt(Symbol x) { if (x < Symbol.ZERO) { var r = fzexakt(( Symbol )(-x)); if (r != null) { return(r.Conj()); } return(r); } if (x.IsInteger()) { if (x.ToInt() % 2 == 0) { return(Symbol.ONE); } else { return(Symbol.MINUS); } } var qs = x + new Complex(0.5); if ((( Symbol )qs).IsInteger()) { if ((( Symbol )qs).ToInt() % 2 == 0) { return(Symbol.IMINUS); } else { return(Symbol.IONE); } } qs = x * new Complex(4); if ((( Symbol )qs).IsInteger()) { var sq2 = FunctionVariable.Create("sqrt", new Complex(0.5)); switch ((( Symbol )qs).ToInt() % 8) { case 1: return((Symbol.ONE + Symbol.IONE) / Symbol.SQRT2); case 3: return((Symbol.MINUS + Symbol.IONE) / Symbol.SQRT2); case 5: return((Symbol.MINUS + Symbol.IMINUS) / Symbol.SQRT2); case 7: return((Symbol.ONE + Symbol.IMINUS) / Symbol.SQRT2); } } qs = x * new Complex(6); if ((( Symbol )qs).IsInteger()) { switch ((( Symbol )qs).ToInt() % 12) { case 1: return((Symbol.SQRT3 + Symbol.IONE) / Symbol.TWO); case 2: return((Symbol.ONE + Symbol.SQRT3) * Symbol.IONE / Symbol.TWO); case 4: return((Symbol.SQRT3 * Symbol.IONE + Symbol.MINUS) / Symbol.TWO); case 5: return((Symbol.IONE - Symbol.SQRT3) / Symbol.TWO); case 7: return((Symbol.IMINUS - Symbol.SQRT3) / Symbol.TWO); case 8: return((Symbol.SQRT3 * Symbol.IMINUS - Symbol.ONE) / Symbol.TWO); case 10: return((Symbol.SQRT3 * Symbol.IMINUS + Symbol.ONE) / Symbol.TWO); case 11: return((Symbol.IMINUS + Symbol.SQRT3) / Symbol.TWO); } } return(null); }