当前位置: 首页>>代码示例>>C#>>正文


C# Rational.Divide方法代码示例

本文整理汇总了C#中Rational.Divide方法的典型用法代码示例。如果您正苦于以下问题:C# Rational.Divide方法的具体用法?C# Rational.Divide怎么用?C# Rational.Divide使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Rational的用法示例。


在下文中一共展示了Rational.Divide方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: BroadhurstBbp

        private static BigDecimal BroadhurstBbp(int n, int p, int[] a, MathContext mc)
        {
            /* Explore the actual magnitude of the result first with a quick estimate.
                */
            double x = 0.0;
            for (int k = 1; k < 10; k++)
                x += a[(k - 1)%8]/System.Math.Pow(2d, p*(k + 1)/2d)/System.Math.Pow(k, n);

            /* Convert the relative precision and estimate of the result into an absolute precision.
                */
            double eps = PrecisionToError(x, mc.Precision);

            /* Divide this through the number of terms in the sum to account for error accumulation
                * The divisor 2^(p(k+1)/2) means that on the average each 8th term in k has shrunk by
                * relative to the 8th predecessor by 1/2^(4p).  1/2^(4pc) = 10^(-precision) with c the 8term
                * cycles yields c=log_2( 10^precision)/4p = 3.3*precision/4p  with k=8c
                */
            var kmax = (int) (6.6*mc.Precision/p);

            /* Now eps is the absolute error in each term */
            eps /= kmax;
            BigDecimal res = BigDecimal.Zero;
            for (int c = 0;; c++) {
                var r = new Rational();
                for (int k = 0; k < 8; k++) {
                    var tmp = new Rational(BigInteger.ValueOf(a[k]), (BigInteger.ValueOf((1 + 8*c + k))).Pow(n));
                    /* floor( (pk+p)/2)
                                */
                    int pk1h = p*(2 + 8*c + k)/2;
                    tmp = tmp.Divide(BigInteger.One.ShiftLeft(pk1h));
                    r = r.Add(tmp);
                }

                if (System.Math.Abs(r.ToDouble()) < eps)
                    break;
                var mcloc = new MathContext(1 + ErrorToPrecision(r.ToDouble(), eps));
                res = res.Add(r.ToBigDecimal(mcloc));
            }
            return res.Round(mc);
        }
开发者ID:tupunco,项目名称:deveel-math,代码行数:40,代码来源:BigMath.cs

示例2: Log

        public static BigDecimal Log(int n, MathContext mc)
        {
            /* the value is undefined if x is negative.
                */
            if (n <= 0)
                throw new ArithmeticException("Cannot take log of negative " + n);
            if (n == 1)
                return BigDecimal.Zero;
            if (n == 2) {
                if (mc.Precision < Log2.Precision)
                    return Log2.Round(mc);
                /* Broadhurst <a href="http://arxiv.org/abs/math/9803067">arXiv:math/9803067</a>
                                * Error propagation: the error in log(2) is twice the error in S(2,-5,...).
                                */
                int[] a = {2, -5, -2, -7, -2, -5, 2, -3};
                BigDecimal S = BroadhurstBbp(2, 1, a, new MathContext(1 + mc.Precision));
                S = S.Multiply(new BigDecimal(8));
                S = Sqrt(DivideRound(S, 3));
                return S.Round(mc);
            }
            if (n == 3) {
                /* summation of a series roughly proportional to (7/500)^k. Estimate count
                        * of terms to estimate the precision (drop the favorable additional
                        * 1/k here): 0.013^k <= 10^(-precision), so k*log10(0.013) <= -precision
                        * so k>= precision/1.87.
                        */
                var kmax = (int) (mc.Precision/1.87);
                var mcloc = new MathContext(mc.Precision + 1 + (int) (System.Math.Log10(kmax*0.693/1.098)));
                BigDecimal log3 = MultiplyRound(Log(2, mcloc), 19);

                /* log3 is roughly 1, so absolute and relative error are the same. The
                        * result will be divided by 12, so a conservative error is the one
                        * already found in mc
                        */
                double eps = PrecisionToError(1.098, mc.Precision)/kmax;
                var r = new Rational(7153, 524288);
                var pk = new Rational(7153, 524288);
                for (int k = 1;; k++) {
                    Rational tmp = pk.Divide(k);
                    if (tmp.ToDouble() < eps)
                        break;

                    /* how many digits of tmp do we need in the sum?
                                */
                    mcloc = new MathContext(ErrorToPrecision(tmp.ToDouble(), eps));
                    BigDecimal c = pk.Divide(k).ToBigDecimal(mcloc);
                    if (k%2 != 0)
                        log3 = log3.Add(c);
                    else
                        log3 = log3.Subtract(c);
                    pk = pk.Multiply(r);
                }
                log3 = DivideRound(log3, 12);
                return log3.Round(mc);
            }
            if (n == 5) {
                /* summation of a series roughly proportional to (7/160)^k. Estimate count
                        * of terms to estimate the precision (drop the favorable additional
                        * 1/k here): 0.046^k <= 10^(-precision), so k*log10(0.046) <= -precision
                        * so k>= precision/1.33.
                        */
                var kmax = (int) (mc.Precision/1.33);
                var mcloc = new MathContext(mc.Precision + 1 + (int) (System.Math.Log10(kmax*0.693/1.609)));
                BigDecimal log5 = MultiplyRound(Log(2, mcloc), 14);

                /* log5 is roughly 1.6, so absolute and relative error are the same. The
                        * result will be divided by 6, so a conservative error is the one
                        * already found in mc
                        */
                double eps = PrecisionToError(1.6, mc.Precision)/kmax;
                var r = new Rational(759, 16384);
                var pk = new Rational(759, 16384);
                for (int k = 1;; k++) {
                    Rational tmp = pk.Divide(k);
                    if (tmp.ToDouble() < eps)
                        break;

                    /* how many digits of tmp do we need in the sum?
                                */
                    mcloc = new MathContext(ErrorToPrecision(tmp.ToDouble(), eps));
                    BigDecimal c = pk.Divide(k).ToBigDecimal(mcloc);
                    log5 = log5.Subtract(c);
                    pk = pk.Multiply(r);
                }
                log5 = DivideRound(log5, 6);
                return log5.Round(mc);
            }
            if (n == 7) {
                /* summation of a series roughly proportional to (1/8)^k. Estimate count
                        * of terms to estimate the precision (drop the favorable additional
                        * 1/k here): 0.125^k <= 10^(-precision), so k*log10(0.125) <= -precision
                        * so k>= precision/0.903.
                        */
                var kmax = (int) (mc.Precision/0.903);
                var mcloc = new MathContext(mc.Precision + 1 + (int) (System.Math.Log10(kmax*3*0.693/1.098)));
                BigDecimal log7 = MultiplyRound(Log(2, mcloc), 3);

                /* log7 is roughly 1.9, so absolute and relative error are the same.
                        */
                double eps = PrecisionToError(1.9, mc.Precision)/kmax;
//.........这里部分代码省略.........
开发者ID:tupunco,项目名称:deveel-math,代码行数:101,代码来源:BigMath.cs

示例3: Zeta

        public static BigDecimal Zeta(int n, MathContext mc)
        {
            if (n <= 0)
                throw new NotSupportedException("Zeta at negative argument " + n + " not supported");
            if (n == 1)
                throw new ArithmeticException("Pole at zeta(1) ");

            if (n%2 == 0) {
                /* Even indices. Abramowitz-Stegun 23.2.16. Start with 2^(n-1)*B(n)/n!
                        */
                Rational b = Bernoulli.Default[n].Abs();
                b = b.Divide(Factorial.Default[n]);
                b = b.Multiply(BigInteger.One.ShiftLeft(n - 1));

                /* to be multiplied by pi^n. Absolute error in the result of pi^n is n times
                        * error in pi times pi^(n-1). Relative error is n*error(pi)/pi, requested by mc.
                        * Need one more digit in pi if n=10, two digits if n=100 etc, and add one extra digit.
                        */
                var mcpi = new MathContext(mc.Precision + (int) (System.Math.Log10(10.0*n)));
                BigDecimal piton = PiRound(mcpi).Pow(n, mc);
                return MultiplyRound(piton, b);
            }
            if (n == 3) {
                /* Broadhurst BBP <a href="http://arxiv.org/abs/math/9803067">arXiv:math/9803067</a>
                        * Error propagation: S31 is roughly 0.087, S33 roughly 0.131
                        */
                int[] a31 = {1, -7, -1, 10, -1, -7, 1, 0};
                int[] a33 = {1, 1, -1, -2, -1, 1, 1, 0};
                BigDecimal S31 = BroadhurstBbp(3, 1, a31, mc);
                BigDecimal S33 = BroadhurstBbp(3, 3, a33, mc);
                S31 = S31.Multiply(new BigDecimal(48));
                S33 = S33.Multiply(new BigDecimal(32));
                return S31.Add(S33).Divide(new BigDecimal(7), mc);
            }
            if (n == 5) {
                /* Broadhurst BBP <a href=http://arxiv.org/abs/math/9803067">arXiv:math/9803067</a>
                        * Error propagation: S51 is roughly -11.15, S53 roughly 22.165, S55 is roughly 0.031
                        * 9*2048*S51/6265 = -3.28. 7*2038*S53/61651= 5.07. 738*2048*S55/61651= 0.747.
                        * The result is of the order 1.03, so we add 2 digits to S51 and S52 and one digit to S55.
                        */
                int[] a51 = {31, -1614, -31, -6212, -31, -1614, 31, 74552};
                int[] a53 = {173, 284, -173, -457, -173, 284, 173, -111};
                int[] a55 = {1, 0, -1, -1, -1, 0, 1, 1};
                BigDecimal S51 = BroadhurstBbp(5, 1, a51, new MathContext(2 + mc.Precision));
                BigDecimal S53 = BroadhurstBbp(5, 3, a53, new MathContext(2 + mc.Precision));
                BigDecimal S55 = BroadhurstBbp(5, 5, a55, new MathContext(1 + mc.Precision));
                S51 = S51.Multiply(new BigDecimal(18432));
                S53 = S53.Multiply(new BigDecimal(14336));
                S55 = S55.Multiply(new BigDecimal(1511424));
                return S51.Add(S53).Subtract(S55).Divide(new BigDecimal(62651), mc);
            }
            /* Cohen et al Exp Math 1 (1) (1992) 25
                        */
            var betsum = new Rational();
            var bern = new Bernoulli();
            var fact = new Factorial();
            for (int npr = 0; npr <= (n + 1)/2; npr++) {
                Rational b = bern[2*npr].Multiply(bern[n + 1 - 2*npr]);
                b = b.Divide(fact[2*npr]).Divide(fact[n + 1 - 2*npr]);
                b = b.Multiply(1 - 2*npr);
                if (npr%2 == 0)
                    betsum = betsum.Add(b);
                else
                    betsum = betsum.Subtract(b);
            }
            betsum = betsum.Divide(n - 1);
            /* The first term, including the facor (2pi)^n, is essentially most
                        * of the result, near one. The second term below is roughly in the range 0.003 to 0.009.
                        * So the precision here is matching the precisionn requested by mc, and the precision
                        * requested for 2*pi is in absolute terms adjusted.
                        */
            var mcloc = new MathContext(2 + mc.Precision + (int) (System.Math.Log10(n)));
            BigDecimal ftrm = PiRound(mcloc).Multiply(new BigDecimal(2));
            ftrm = ftrm.Pow(n);
            ftrm = MultiplyRound(ftrm, betsum.ToBigDecimal(mcloc));
            var exps = new BigDecimal(0);

            /* the basic accuracy of the accumulated terms before multiplication with 2
                        */
            double eps = System.Math.Pow(10d, -mc.Precision);

            if (n%4 == 3) {
                /* since the argument n is at least 7 here, the drop
                                * of the terms is at rather constant pace at least 10^-3, for example
                                * 0.0018, 0.2e-7, 0.29e-11, 0.74e-15 etc for npr=1,2,3.... We want 2 times these terms
                                * fall below eps/10.
                                */
                int kmax = mc.Precision/3;
                eps /= kmax;
                /* need an error of eps for 2/(exp(2pi)-1) = 0.0037
                                * The absolute error is 4*exp(2pi)*err(pi)/(exp(2pi)-1)^2=0.0075*err(pi)
                                */
                BigDecimal exp2p = PiRound(new MathContext(3 + ErrorToPrecision(3.14, eps/0.0075)));
                exp2p = Exp(exp2p.Multiply(new BigDecimal(2)));
                BigDecimal c = exp2p.Subtract(BigDecimal.One);
                exps = DivideRound(1, c);
                for (int npr = 2; npr <= kmax; npr++) {
                    /* the error estimate above for npr=1 is the worst case of
                                        * the absolute error created by an error in 2pi. So we can
                                        * safely re-use the exp2p value computed above without
//.........这里部分代码省略.........
开发者ID:tupunco,项目名称:deveel-math,代码行数:101,代码来源:BigMath.cs


注:本文中的Rational.Divide方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。