【问题标题】:Time Complexity for finding Discrete Logarithm (brute-force)寻找离散对数的时间复杂度(蛮力)
【发布时间】:2018-01-12 19:11:07
【问题描述】:

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

这是伪代码:

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 是从哪里来的,这与二进制数字有关吗?

【问题讨论】:

  • 对于正确的 g 值,a 将以狂野模式运行从 1 到 p-1 的所有值。因此,如果您尝试 y 的所有可能值,迭代次数将采用从 1 到 p-1 的所有可能值。平均而言,p/2。

标签: algorithm time-complexity big-o logarithm


【解决方案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。顺序是发生之前的乘数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2013-03-29
    • 1970-01-01
    • 2015-11-17
    • 2018-12-05
    相关资源
    最近更新 更多