【问题标题】:Confused on Miller-Rabin对米勒拉宾感到困惑
【发布时间】:2011-04-13 14:24:26
【问题描述】:

作为我自己的练习,我正在实施 Miller-Rabin 测试。 (通过 SICP 工作)。我理解费马的小定理,并且能够成功地实现它。我在 Miller-Rabin 测试中被绊倒的部分是这个“1 mod n”业务。 1 mod n(n是一些随机整数)不是总是1吗?所以我对“1 模 n 的非平凡平方根”可能是什么感到困惑,因为在我看来,“1 mod n”在处理整数值时始终为 1。我错过了什么?

【问题讨论】:

  • 这个问题是题外话,因为它不是一个编程问题

标签: algorithm primes sicp prime-factoring primality-test


【解决方案1】:

1 等于 9 mod 8 所以 3 是 1 mod 8 的非平凡平方根。

您使用的不是单个数字,而是等价集。 [m]n 是所有数字 x集合,因此 xm mod n 一致。任何与这个集合的任何元素平方的东西都是mn 的平方根。

给定任何n,我们有一组以n为模的整数,我们可以写成Zn。这是(一组)[1]n[2]n、...、[n]n。每个整数都位于这些集合中的一个且只有一个。我们可以通过[a]n + [b]n = [a + b]n 在这个集合上定义加法和乘法,同样地也可以用于乘法。所以[1]n 的平方根是[b]n 的(n 个元素),这样[b*b]n = [1]n

不过在实践中,我们可以将m[m]n 混为一谈,并且通常选择[m]n 的唯一元素m',这样0 <= m' < n 作为我们的“代表”元素:这是我们通常认为的作为m mod n。但重要的是要记住,正如数学家所说,我们正在“滥用符号”。

这里有一些(非惯用的)python 代码,因为我没有方案解释器 ATM:

>>> def roots_of_unity(n):
...      roots = []
...      for i in range(n):
...          if i**2 % n == 1:
...               roots.append(i)
...      return roots
... 
>>> roots_of_unity(4)
[1, 3]
>>> roots_of_unity(8)
[1, 3, 5, 7]
>>> roots_of_unity(9)
[1, 8]

因此,特别是(查看最后一个示例),17 是单位模 9 的根。实际上,17^2 = 289 和 289 % 9 = 1。回到我们之前的符号 [8]9 = [17]9([17]9)^2 = [1]9

【讨论】:

    【解决方案2】:

    我认为误解来自于书中对非平凡根的定义:

    “1 模 n 的非平凡平方根”,即不等于 1 或 n - 1 其平方等于 1 模 n

    我认为应该说的地方:

    其平方全等到 1 模 n

    【讨论】:

    • 我和 OP 有同样的困惑,这个澄清让一切变得不同。接受的答案很好,但 this 答案解决了混淆的根源。
    • 现在是 2020 年 9 月,我也被措辞弄糊涂了。像我这种数学不多的人,能不能也写成“其平方模n等于1”?
    【解决方案3】:

    这就是为什么措辞是 1 的非平凡平方根的原因。对于任何模数 n,1 都是 1 的平凡平方根。

    17 是 1 的非平凡平方根,模 144。因此 17^2 = 289,等于 1 模 144。如果 n 是素数,则 1 和 n-1 是 1 的两个平方根,并且它们是仅有的两个这样的根。然而,对于复合 n,通常有多个平方根。当 n = 144 时,平方根为 {1,17,55,71,73,89,127,143}。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 2011-12-02
      • 2018-11-05
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      相关资源
      最近更新 更多