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



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

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

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


Листинг C++
bool greate1 (binteger & right, binteger & left)
{
    binteger c = right - left;
    return c.a.sz > 1 || (c.a.sz == 1 && c.a[0] > 1);
}
void div2 (binteger & x)
{
    int buffer = 0;
    for (int i = x.a.sz - 1; i >= 0; -- i)
    {
        x.a[i] += buffer * 10;
        buffer = x.a[i] % 2;
        x.a[i] /= 2;
    }
    erase_null (x.a);
}
binteger sqrt_bin (binteger a, int n)
{
    binteger left = binteger (0);
    binteger right = binteger (a);
    
    while (cmp (right, left) >= 0 && greate1 (right, left))
    {
        binteger mid = right + left;
        div2 (mid);
        
        binteger A = power (mid, n);
        int cmpAa = cmp (A, a);
        if (cmpAa == 0)
            return mid;
        else
            if (cmpAa > 0)
                right = mid;
            else
                left = mid;
    }
    
    return left;
}

18:53
12.07.2010


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