查找离散对数(暴力)

时间:2018-01-12 19:11:08

标签: algorithm time-complexity big-o logarithm

我试图理解以下算法的时间复杂度(Big-O),它找到x使得g^x = y (mod p)(即找到y的离散对数,基数为g模p )。

这是伪代码:

discreteLogarithm(y, g, p)
    y := y mod p
    a := g
    x := 1

    until a = y
        a := (a * g) mod p
        x++

    return x
end

我知道这种方法的时间复杂度是指数p 中的二进制数字 - 但这意味着什么呢?为什么它依赖于p?

我知道复杂性是由循环次数(until a = y)决定的,但p在哪里,这是关于二进制数字的?

1 个答案:

答案 0 :(得分:1)

运行时间取决于g mod p的order。最坏的情况是阶数(p-1)/ 2,即O(p)。因此运行时间是O(p)模乘。这里的关键是p有log p位,其中我使用'log'来表示基数2对数。由于p = 2 ^(log p) - 数学同一性 - 我们看到运行时间是p的位数的指数。为了更清楚,让我们使用b = log p来表示位数。最坏的情况是运行时间为O(2 ^ b)模乘。模数乘法需要O(b ^ 2)时间,因此完整运行时间为O(2 ^ b * b ^ 2)时间。 2 ^ b是主导词。

根据您的特定p和g,订单可能比p小得多。然而,分析数理论中的一些启发式算法表明,平均而言,它是阶数p。

编辑:如果您不熟悉群论中的“秩序”概念,这里有简要说明。如果你继续将g乘以自己的mod p,它最终会变为1.顺序是在发生之前的乘法次数。