Беззнаковое деление на 3 можно выполнить умножением на 0xAA ... AA + 1, сдвиг вправо n + 1 , где n - количество бит в умножителе и n - кратное 8 (или 4).
Чтобы минимизировать стоимость, для данного дивиденда требуется множитель n , где n = длина дивиденда, округленная до кратного 8. Я думаю, это то, что делает private exactDivideBy3()
. [Чтобы построить множитель для данного дивиденда, вы можете начать с 0xAA ... AA для самого большого дивиденда, с которым вам нужно справиться, затем сдвинуть вправо и / или в 1. Вы можете сохранить их в таблице.]
Конечно, вы можете округлить n до кратного 64, если предположите, что BigInteger запускает 64 бита за раз.