离散对数算法

时间:2011-12-17 18:59:53

标签: algorithm

我经常看到离散对数是一个难题。但是,我不太明白这是怎么回事。在我看来,定期二进制搜索可以很好地用于此目的。例如,

binary_search(base, left, right, target) {
    if (pow(base, left) == target) 
        return left;
    if (pow(base, right) == target)
        return right;
    if (pow(base, (left + right) / 2) < target)
        return binary_search(base, (left + right) / 2, right, target);
    else
        return binary_search(base, left, (left + right) / 2, target);
}   

log(base, number) {
    left = 1;
    right = 2;
    while(pow(base, p) < number) {
        left = right;
        right *= 2;
    }
    return binary_search(base, left, right, number);
}

如果只是递增p直到pow(base, p)的天真实现是O(n),那么这个二进制搜索肯定是O(log(n)^ 2)。

或者我不明白这个算法是如何测量的?

编辑:我通常不会写二进制搜索,所以如果有一些简单的实现错误,请忽略它或在修复中编辑。

1 个答案:

答案 0 :(得分:10)

您的算法假设a&lt; b表示pow(base,a)&lt; pow(base,b)。

对于自然数这是正确的,但它不适用于有限的循环群(当'pow'以模数为模计算时)。