Пример #1
0
        private static UBigInt 完全除算_3(UBigInt u)
        {
            var inverse_3 = 2863311531;
            var q_digits  = new UInt32[0];

            while (u >= 0x100000000)
            {
                // u の桁が 2 ワード以上残っている場合
                var u0 = u & 0xffffffffU;
                var q0 = ((UBigInt)u0 * inverse_3) & 0xffffffffU;
                u        = u.USubtruct((UBigInt)q0 * 3U);
                q_digits = q_digits.Append(q0).ToArray();
                if ((u & 0xffffffff) != 0)
                {
                    throw new ApplicationException();
                }
                u >>= 32;
            }
            if (u % 3 != 0)
            {
                throw new ApplicationException();
            }
            q_digits = q_digits.Append((UInt32)u / 3).ToArray();
            var q = UBigInt.Zero;

            for (var index = q_digits.Length - 1; index >= 0; --index)
            {
                q = (q << 32) | q_digits[index];
            }

            return(q);
        }