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); }