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