public LeisenReimer(StochasticProcess1D process, double end, int steps, double strike) : base(process, end, (steps % 2 != 0 ? steps : steps + 1)) { Utils.QL_REQUIRE(strike > 0.0, () => "strike must be positive"); int oddSteps = (steps % 2 != 0 ? steps : steps + 1); double variance = process.variance(0.0, x0_, end); double ermqdt = Math.Exp(driftPerStep_ + 0.5 * variance / oddSteps); double d2 = (Math.Log(x0_ / strike) + driftPerStep_ * oddSteps) / Math.Sqrt(variance); pu_ = Utils.PeizerPrattMethod2Inversion(d2, oddSteps); pd_ = 1.0 - pu_; double pdash = Utils.PeizerPrattMethod2Inversion(d2 + Math.Sqrt(variance), oddSteps); up_ = ermqdt * pdash / pu_; down_ = (ermqdt - pu_ * up_) / (1.0 - pu_); }