Корень n-ной степени - поразрядный поиск



Необходимо найти корень степени n из числа, представимого с помощью длинной арифметики

Реализация алгоритма рассмотрена на классе binteger длинной арифметики.

Будем заполнять наше число по одной цифре от старших разрядов к младшим. Каждый раз будем ставить максимально возможную цифру, чтобы полученное число не превосходило исходное число.
Сложность O(N3 * log n) или O(N * M * log n), где N - количество цифр, а O(M) - сложность операции умножения.


Листинг C++
binteger sqrt_radix (binteger a, int n)
{
    binteger x;
    x.a = vsint ((a.a.sz - 1) / 2 + 1, 0);
    for (int i = x.a.sz - 1; i >= 0; -- i)
        for (x.a[i] = 9; x.a[i] > 0; -- x.a[i])
            if (cmp (a, power (x, n)) >= 0)
                break;
    erase_null (x.a);
    return x;
}

18:56
12.07.2010


По всем вопросам обращаться: rumterg@gmail.com