public virtual Algebraic ratsubst(Algebraic expr) { if (gcd.Equals(Symbol.ZERO)) { return(expr); } if (!expr.Depends(vr)) { return(expr); } if (expr is Rational) { return(ratsubst((( Rational )expr).nom) / ratsubst((( Rational )expr).den)); } if (expr is Polynomial && (( Polynomial )expr).Var is FunctionVariable) { var pex = ( Polynomial )expr; var vex = ( FunctionVariable )pex.Var; if (vex.Name.Equals("exp") && vex.Var is Polynomial && (( Polynomial )vex.Var).Var.Equals(vr) && (( Polynomial )vex.Var).Degree() == 1 && (( Polynomial )vex.Var)[0].Equals(Symbol.ZERO)) { int degree = pex.Degree(); var a = new Algebraic[degree + 1]; for (var n = 0; n <= degree; n++) { var cf = pex[n]; if (cf.Depends(vr)) { throw new SymbolicException("Rationalize failed: 2"); } a[n] = cf; } return(new Polynomial(t, a)); } } throw new SymbolicException("Could not rationalize " + expr); }
public SubstExp(Variable vr, Algebraic expr) { this.vr = vr; var list = new ArrayList(); (new GetExpVars2(list)).SymEval(expr); gcd = Exponential.exp_gcd(list, vr); if (gcd.Equals(Symbol.ZERO)) { t = vr; } }