示例#1
0
文件: Numeric.cs 项目: tspring/ioke
        /** Return this raised to an integer power.
         * Implemented by repeated squaring and multiplication.
         * If y < 0, returns div_inv of the result. */
        public virtual Numeric power(IntNum y)
        {
            if (y.isNegative())
            {
                return(power(IntNum.neg(y)).div_inv());
            }
            Numeric pow2 = this;
            Numeric r    = null;

            for (;;)  // for (i = 0;  ; i++)
            {
                // pow2 == x**(2**i)
                // prod = x**(sum(j=0..i-1, (y>>j)&1))
                if (y.isOdd())
                {
                    r = r == null ? pow2 : r.mul(pow2);       // r *= pow2
                }
                y = IntNum.shift(y, -1);
                if (y.isZero())
                {
                    break;
                }
                // pow2 *= pow2;
                pow2 = pow2.mul(pow2);
            }
            return(r == null?mul_ident() : r);
        }