Как очистить x от накипи на n/d, когда x * n переполняется?

Моя проблема ограничена целыми числами без знака длиной 256 бит.

У меня есть ценность x, и мне нужно очистить его от накипи в соотношении n / d, где n < d.

Конечно, простое решение x * n / d, но проблема в том, что x * n может переливаться.

Я ищу любую арифметическую уловку, которая может помочь достичь максимально точного результата.

Разделив каждый из n а также d от gcd(n, d) перед расчетом x * n / d не гарантирует успеха.

Есть ли какой-либо процесс (итеративный или другой), который я могу использовать для решения этой проблемы?

Обратите внимание, что я готов выбрать неточное решение, но мне нужно уметь оценить ошибку.

1 ответ

ПРИМЕЧАНИЕ: Использование целочисленного деления вместо нормального деления. Предположим,

x = ad + b
n = cd + e

Затем найдите a,b,c,e следующим образом:

a = x/d
b = x%d
c = n/d
e = n%d

Затем,

nx/d = acd + ae + bc + be/d

РАСЧЕТ be/d

1. Represent e in binary form
2. Find b/d, 2b/d, 4b/d, 8b/d, ... 256b/d and their remainders
3. Find be/d = b*binary terms + their remainders

Пример:

e = 101 in binary = 4+1
be/d = (b/d + 4b/d) + (b%d + 4b%d)/d

ДИАГНОСТИКИ b/d, 2b/d, ... 256b/d

quotient(2*ib/d) = 2*quotient(ib /d) + (2*remainder(ib /d))/d
remainder(2*ib/d) = (2*remainder(ib/d))%d

Выполняется за O(количество бит)

Другие вопросы по тегам