我试图理解以下算法的时间复杂度(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在哪里,这是关于二进制数字的?
答案 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.顺序是在发生之前的乘法次数。