/// <summary>
        /// Black Scholes European Call and Put Option.
        /// </summary>
        /// <param name="sigma"></param>
        /// <param name="t"></param>
        /// <param name="k"></param>
        /// <param name="q"></param>
        /// <param name="s0"></param>
        /// <param name="r"></param>
        /// <returns></returns>
        private static Vector BlackSholes(double sigma, double t, double k, double q, double s0, double r)
        {
            // Compute d1 in BS model.
            double d1 = (Math.Log(s0 / k) + (r + 0.5 * sigma * sigma) * t) / (sigma * Math.Sqrt(t));

            // Compute d2 in BS model.
            double d2 = d1 - (sigma * Math.Sqrt(t));

            Fairmat.Statistics.Normal nom = new Fairmat.Statistics.Normal(0, 1);

            // The cumulative normal distribution functions for calls
            double ncd1 = nom.Cdf(d1);
            double ncd2 = nom.Cdf(d2);

            // The cumulative normal distribution functions for puts
            double npd1   = nom.Cdf(-d1);
            double npd2   = nom.Cdf(-d2);
            Vector bs_var = (Vector) new double[] { 0, 0 };

            // Calculate the cbls.
            bs_var[0] = s0 * ncd1 - k * Math.Exp(-r * t) * ncd2;

            // Calculate the pbls.
            bs_var[1] = k * Math.Exp(-r * t) * npd2 - s0 * npd1;
            return(bs_var);
        }
        /// <summary>
        /// Black Scholes European Call and Put Option.
        /// </summary>
        /// <param name="sigma"></param>
        /// <param name="t"></param>
        /// <param name="k"></param>
        /// <param name="q"></param>
        /// <param name="s0"></param>
        /// <param name="r"></param>
        /// <returns></returns>
        private static Vector BlackSholes(double sigma, double t, double k, double q, double s0, double r)
        {
            // Compute d1 in BS model.
            double d1 = (Math.Log(s0 / k) + (r + 0.5 * sigma * sigma) * t) / (sigma * Math.Sqrt(t));

            // Compute d2 in BS model.
            double d2 = d1 - (sigma * Math.Sqrt(t));
            Fairmat.Statistics.Normal nom = new Fairmat.Statistics.Normal(0, 1);

            // The cumulative normal distribution functions for calls
            double ncd1 = nom.Cdf(d1);
            double ncd2 = nom.Cdf(d2);

            // The cumulative normal distribution functions for puts
            double npd1 = nom.Cdf(-d1);
            double npd2 = nom.Cdf(-d2);
            Vector bs_var = (Vector)new double[] { 0, 0 };

            // Calculate the cbls.
            bs_var[0] = s0 * ncd1 - k * Math.Exp(-r * t) * ncd2;

            // Calculate the pbls.
            bs_var[1] = k * Math.Exp(-r * t) * npd2 - s0 * npd1;
            return bs_var;
        }