private double abs(double real, double imag) { double temp; if (real < 0) { real = -real; } if (imag < 0) { imag = -imag; } if (imag > real) { temp = real; real = imag; imag = temp; } if ((real + imag) == real) { return(real); } temp = imag / real; temp = real * Math.Sqrt(1.0 + temp * temp); return(temp); }
internal virtual int cfs(double x) { if (x < 0) { return(cfs(-x)); } int a0 = ( int )Math.floor(x); if (x == ( double )a0) { return(a0); } int a1 = ( int )Math.floor(1.0 / (x - a0)); int z = a0 * a1 + 1; if (Math.abs(( double )z / ( double )a1 - x) < 1.0e-6) { return(z); } return(0); }
internal override Symbol PreEval(Symbol x) { Complex z = x.ToComplex(); if (z.Im == 0.0) { return(new Complex(Math.tan(z.Re))); } return(( Symbol )evalx(trigrule, z)); }
internal override Symbol PreEval(Symbol x) { var z = x.ToComplex(); if (z.Re < 0 || z.Im != 0.0) { return(new Complex(Math.log(z.Re * z.Re + z.Im * z.Im) / 2, Math.atan2(z.Im, z.Re))); } return(new Complex(Math.log(z.Re))); }
internal override Symbol PreEval(Symbol x) { var z = x.ToComplex(); var r = Math.exp(z.Re); if (z.Im != 0.0) { return(new Complex(r * Math.cos(z.Im), r * Math.sin(z.Im))); } return(new Complex(r)); }
public override int Eval(Stack st) { int narg = GetNarg(st); Algebraic x = GetAlgebraic(st); if (x.IsScalar() && !x.IsConstant()) { throw new SymbolicException("Unknown variable dimension: " + x); } Matrix m = new Matrix(x); st.Push(new Complex(( double )Math.max(m.Cols(), m.Rows()))); return(0); }
internal static long kleinsterTeiler(long X, long start) { long stop = ( long )Math.ceil(Math.Sqrt(( double )X)); if (start > stop) { return(X); } long b = start / 30L; b *= 30L; long m = start % 30L; int i = 0; while (m > mod[i]) { i++; } while (start <= stop) { if (Session.Proc.CheckInterrupt()) { return(-1L); } if (X % start == 0) { return(start); } i++; if (i >= mod.Length) { i = 0; b += 30L; start = b; } start += moddif[i]; } return(X); }
internal override Algebraic SymEval(Algebraic x, Algebraic y) { if (y is Complex && !y.IsComplex() && x is Complex && !x.IsComplex()) { return(new Complex(Math.atan2((( Complex )y).Re, (( Complex )x).Re))); } if (Symbol.ZERO != x) { return(FunctionVariable.Create("atan", y / x) + FunctionVariable.Create("sign", y) * (Symbol.ONE - FunctionVariable.Create("sign", x)) * Symbol.PI / Symbol.TWO); } else { return((FunctionVariable.Create("sign", y) * Symbol.PI) / Symbol.TWO); } }
internal static void dft(double[] re, double[] im, double[] outRe, double[] outIm) { int N = re.Length; for (int k = 0; k < N; k++) { outRe[k] = outIm[k] = 0.0; for (int n = 0; n < N; n++) { var ang = -2.0 * Math.PI * k * n / N; var eim = Math.sin(ang); var ere = Math.cos(ang); outRe[k] += re[n] * ere - im[n] * eim; outIm[k] += re[n] * eim + im[n] * ere; } } }
public override double Norm() { double r; if (Math.abs(Re) > Math.abs(Im)) { r = Im / Re; r = Math.abs(Re) * Math.Sqrt(1 + r * r); } else if (Im != 0) { r = Re / Im; r = Math.abs(Im) * Math.Sqrt(1 + r * r); } else { r = 0.0; } return(r); }
public override int Eval(Stack st) { int narg = GetNarg(st); var x = GetVector(st); x = ( Vector )(new ExpandConstants()).SymEval(x); var re = (( Vector )x.RealPart()).Double; var im = (( Vector )x.ImagPart()).Double; int n = re.Length; var power = Math.log(n) / Math.log(2.0); if (power != Math.round(power)) { var outRe = new double[n]; var outIm = new double[n]; dft(re, im, outRe, outIm); re = outRe; im = outIm; } else { ifft_1d(re, im, -1); } var a = new Number[n]; for (int i = 0; i < n; i++) { a[i] = new Number(re[i], im[i]); } st.Push(new Vector(a)); return(0); }
internal override Algebraic SymEval(Algebraic x) { if (x is Rational) { var xr = ( Rational )x; if (xr.den.Var is FunctionVariable && (( FunctionVariable )xr.den.Var).Name.Equals("exp") && (( FunctionVariable )xr.den.Var).Var.IsComplex()) { var fv = ( FunctionVariable )xr.den.Var; int maxdeg = Math.max(Poly.Degree(xr.nom, fv), Poly.Degree(xr.den, fv)); if (maxdeg % 2 == 0) { return(divExponential(xr.nom, fv, maxdeg / 2) / divExponential(xr.den, fv, maxdeg / 2)); } else { var fv2 = new FunctionVariable("exp", (( FunctionVariable )xr.den.Var).Var / Symbol.TWO, (( FunctionVariable )xr.den.Var).Body); Algebraic ex = new Polynomial(fv2, new Algebraic[] { Symbol.ZERO, Symbol.ZERO, Symbol.ONE }); var xr1 = xr.nom.Value(xr.den.Var, ex) / xr.den.Value(xr.den.Var, ex); return(SymEval(xr1)); } } } if (x is Polynomial && (( Polynomial )x).Var is FunctionVariable) { var xp = ( Polynomial )x; Algebraic xf = null; var fvar = ( FunctionVariable )xp.Var; if (fvar.Name.Equals("exp")) { var re = fvar.Var.RealPart(); var im = fvar.Var.ImagPart(); if (im != Symbol.ZERO) { bool _minus = minus(im); if (_minus) { im = -im; } var a = FunctionVariable.Create("exp", re); var b = FunctionVariable.Create("cos", im); var c = FunctionVariable.Create("sin", im) * Symbol.IONE; xf = a * (_minus ? b - c : b + c); } } if (fvar.Name.Equals("log")) { var arg = fvar.Var; Algebraic factor = Symbol.ONE, sum = Symbol.ZERO; if (arg is Polynomial && (( Polynomial )arg).Degree() == 1 && (( Polynomial )arg).Var is FunctionVariable && (( Polynomial )arg)[0].Equals(Symbol.ZERO) && (( FunctionVariable )(( Polynomial )arg).Var).Name.Equals("sqrt")) { sum = FunctionVariable.Create("log", (( Polynomial )arg)[1]); factor = new Complex(0.5); arg = (( FunctionVariable )(( Polynomial )arg).Var).Var; xf = FunctionVariable.Create("log", arg); } try { var re = arg.RealPart(); var im = arg.ImagPart(); if (im != Symbol.ZERO) { bool min_im = minus(im); if (min_im) { im = -im; } var a1 = new SqrtExpand().SymEval(arg * arg.Conj()); var a = FunctionVariable.Create("log", a1) / Symbol.TWO; var b1 = SymEval(re / im); var b = FunctionVariable.Create("atan", b1) * Symbol.IONE; xf = min_im ? a + b : a - b; var pi2 = Symbol.PI * Symbol.IONE / Symbol.TWO; xf = min_im ? xf - pi2 : xf + pi2; } } catch (SymbolicException) { } if (xf != null) { xf = xf * factor + sum; } } if (xf == null) { return(x.Map(this)); } Algebraic r = Symbol.ZERO; for (int i = xp.Coeffs.Length - 1; i > 0; i--) { r = (r + SymEval(xp[i])) * xf; } if (xp.Coeffs.Length > 0) { r = r + SymEval(xp[0]); } return(r); } return(x.Map(this)); }
public override bool IsInteger() { return(Im == 0.0 && Math.round(Re) == Re); }
internal override Symbol PreEval(Symbol x) { return(new Complex(Math.logGamma(x.ToComplex().Re))); }
public virtual string ToString(double x) { if (x < 0.0) { return("-" + ToString(-x)); } if (x == 0.0) { return("0"); } int exp = nsign - 1; while (x < mantisse_min) { exp--; x *= dbase; } while (x >= mantisse_min) { exp++; x /= dbase; } long xl = ( long )Math.round(x); string r = ""; int nc = nsign; while (xl != 0L) { nc--; int _digit = digit(xl % ibase); if (!(r.Equals("") && _digit == '0')) { r = ( char )_digit + r; } xl = xl / ibase; } exp -= nc; if (exp > nsign - 1 || exp < -1) { if (r.Length == 1) { r = r + "0"; } return(sub(r, 0, 1) + "." + sub(r, 1, r.Length) + "E" + exp); } if (exp == -1) { return("0." + r); } else { return(sub(r, 0, exp + 1) + (r.Length > exp + 1 ? "." + sub(r, exp + 1, r.Length) : "")); } }
public virtual Complex Arg() { return(new Complex(Math.atan2(Im, Re))); }
internal static void ifft_1d(double[] re, double[] im, int sign) { double u_r, u_i, w_r, w_i, t_r, t_i; int ln, nv2, k, l, le, le1, j, ip, i, n; n = re.Length; ln = ( int )(Math.log(( double )n) / Math.log(2) + 0.5); nv2 = n / 2; j = 1; for (i = 1; i < n; i++) { if (i < j) { t_r = re[i - 1]; t_i = im[i - 1]; re[i - 1] = re[j - 1]; im[i - 1] = im[j - 1]; re[j - 1] = t_r; im[j - 1] = t_i; } k = nv2; while (k < j) { j = j - k; k = k / 2; } j = j + k; } for (l = 1; l <= ln; l++) { le = ( int )(Math.exp(( double )l * Math.log(2)) + 0.5); le1 = le / 2; u_r = 1.0; u_i = 0.0; w_r = Math.cos(Math.PI / ( double )le1); w_i = sign * Math.sin(Math.PI / ( double )le1); for (j = 1; j <= le1; j++) { for (i = j; i <= n; i += le) { ip = i + le1; t_r = re[ip - 1] * u_r - u_i * im[ip - 1]; t_i = im[ip - 1] * u_r + u_i * re[ip - 1]; re[ip - 1] = re[i - 1] - t_r; im[ip - 1] = im[i - 1] - t_i; re[i - 1] = re[i - 1] + t_r; im[i - 1] = im[i - 1] + t_i; } t_r = u_r * w_r - w_i * u_i; u_i = w_r * u_i + w_i * u_r; u_r = t_r; } } if (sign > 0) { for (i = 0; i < n; i++) { re[i] /= n; im[i] /= n; } } }
public override int Eval(Stack st) { int narg = GetNarg(st); if (narg != 4) { throw new ParseException("Usage: ROMBERG (exp,var,ll,ul)"); } var exp = GetAlgebraic(st); var v = GetVariable(st); var ll = GetAlgebraic(st); var ul = GetAlgebraic(st); LambdaAlgebraic xc = new ExpandConstants(); exp = xc.SymEval(exp); ll = xc.SymEval(ll); ul = xc.SymEval(ul); if (!(ll is Symbol) || !(ul is Symbol)) { throw new ParseException("Usage: ROMBERG (exp,var,ll,ul)"); } var rombergtol = 1.0e-4; int rombergit = 11; var a1 = Session.Proc.Store.GetNum("rombergit"); if (a1 != null) { rombergit = a1.ToInt(); } a1 = Session.Proc.Store.GetNum("rombergtol"); if (a1 != null) { rombergtol = a1.ToComplex().Re; } var a = (( Symbol )ll).ToComplex().Re; var b = (( Symbol )ul).ToComplex().Re; var I = Matrix.CreateRectangularArray <double>(rombergit, rombergit); int i = 0, n = 1; var t = trapez(exp, v, n, a, b); if (!(t is Symbol)) { throw new ParseException("Expression must evaluate to number"); } I[0][0] = (( Symbol )t).ToComplex().Re; double epsa = 1.1 * rombergtol; while (epsa > rombergtol && i < rombergit - 1) { i++; n *= 2; t = trapez(exp, v, n, a, b); I[0][i] = (( Symbol )t).ToComplex().Re; double f = 1.0; for (int k = 1; k <= i; k++) { f *= 4; I[k][i] = I[k - 1][i] + (I[k - 1][i] - I[k - 1][i - 1]) / (f - 1.0); } epsa = Math.abs((I[i][i] - I[i - 1][i - 1]) / I[i][i]); } st.Push(new Complex(I[i][i])); return(0); }
protected internal static Symbol readNumber(StringBuilder s) { int kmax = 0; while (kmax < s.Length && oneof(s[kmax], "0123456789.eE+-")) { kmax++; } var sub = s.ToString().Substring(0, kmax); var cultureInfo = new CultureInfo("") { NumberFormat = { NumberDecimalSeparator = "." } }; for (int k = kmax; k > 0; k--) { try { var ts = sub.Substring(0, k); var x = double.Parse(ts, cultureInfo); if (ts.EndsWith(".", StringComparison.Ordinal) && s.Length > k && (s[k] == '^' || s[k] == '/')) { continue; } bool imag = false; if (s.Length > k && (s[k] == 'i' || s[k] == 'j')) { imag = true; k++; } s.Remove(0, k); if (Math.abs(x) > 1e15) { try { var bi = new BigInteger(ts, 10); return(imag ? ( Symbol )(new Number(bi) * Symbol.IONE) : new Number(bi)); } catch (Exception) { } } return(imag ? new Complex(0, x) : new Complex(x)); } catch (Exception) { } } throw new ParseException("Internal Error."); }