Re: Деление длинных чисел методом Ньютона

From
Nick Kovaliov ()
To
Илья Кантор
Date
2002-10-30T11:25:29Z
Area
RU.ALGORITHMS
From: "Nick Kovaliov" <Nick@urm.ru>

    ИК> Как организовать вычисление A/B,
    ИК> если работаешь с неотрицательными
    ИК> числами без десятичной точки ?
Догадываюсь, что длинными целыми :)

В смысле как организовывать ?
Основных способа два -
один столбиком, другой методом Ньютона.

Второй не пробовал, но его (имхо) проще сделать эффективным
на языках высокого уровня, если быстро работает умножение.

    ИК> Сначала, вроде, нужно найти обратное к B методом Ньютона.
    ИК> С какой точностью это нужно делать, если длина A=n, Длина B=m ?

Допустим, в вычислении обратного ты ошибся на один битик (мдалший).
Тогда, умножая на ещё сколько-то битовое число (n-битовое),
ты рискуешь в худшем случае усилить ошибку на n бит.
То есть точность должна быть n + m, ну и +1, так, на всякий случай :)
Ежели ты можешь ошибиться только на полбита (округлённое значение),
то точности достаточно n/2 + m + 1.

    ИК> Сам метод Ньютона делает итерации R <- R+(1-BR)*R.
    ИК> С какой точностью выполнять каждую операцию ?
А вот с этим сложнее ...
(Я так догадываюсь, представление чисел типа FixedPoint ?)
Тут нужно прикидывать, сколько максимум бит в R+(1-BR)*R.
В роли "1" выступает длинное целое 2^(какое-то n).
Получается или довольно много бит, или как-то делать floating point ...
Но с floating point вычисления не такие простые ...
И погрешность учесть сложнее ...

А в Кнуте ещё описана не квадратическая, а кубическая итерация ...

Имхо слишком много накладных расходов,
которыя я лично не знаю, как избежать,
и поэтому проще просто столбиком :)

До встречи, всего наилучшего !


--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)