class BlackFormulaRepository {

  public static double impliedVolatilityFromNormalApproximated(
      final double forward,
      final double strike,
      final double timeToExpiry,
      final double normalVolatility) {
    ArgChecker.isTrue(strike > 0, "strike must be strictly positive");
    ArgChecker.isTrue(forward > 0, "strike must be strictly positive");
    // initial guess
    double guess = impliedVolatilityFromNormalApproximated2(forward, strike, timeToExpiry, normalVolatility);
    // Newton-Raphson method
    final Function<Double, Double> func = new Function<Double, Double>() {
      @Override
      public Double apply(Double volatility) {
        return NormalFormulaRepository
            .impliedVolatilityFromBlackApproximated(forward, strike, timeToExpiry, volatility) - normalVolatility;
      }
    };
    return ROOT_FINDER.getRoot(func, guess);
  }

  private  BlackFormulaRepository();

}