作为我自己的练习,我正在实施Miller-Rabin测试。 (通过SICP工作)。我理解费马的小定理并且能够成功地实现它。我在米勒 - 拉宾测试中被绊倒的部分是这个“1 mod n”业务。是不是1 mod n(n是一些随机整数)总是1?所以我很困惑“1模数n的非平方根”可能是什么,因为在我看来“1 mod n”在处理整数值时总是1。我错过了什么?
答案 0 :(得分:26)
1与9 mod 8一致,因此3是1 mod 8的非平凡平方根。
您正在使用的不是单个数字,而是等价集。 [m]n
是所有数字x
的集,因此x
与m
mod n
一致。任何与该集合的任何元素相关的东西都是m
模n
的平方根。
给定任何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'
的唯一元素[m]n
,以便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
和{ {1}}
答案 1 :(得分:9)
这就是为什么措辞是针对NONTRIVIAL平方根为1. 1是一个平凡的平方根1,对于任何模数n。
17是一个非平凡的平方根1,mod 144.因此17 ^ 2 = 289,这与1 mod 144一致。如果n是素数,则1和n-1是1的两个平方根,他们是这样的根源。然而,对于复合物n,通常存在多个平方根。当n = 144时,平方根为{1,17,55,71,73,89,127,143}。
答案 2 :(得分:9)
我认为这种误解来自于该书给出的关于非平凡根源的定义:
“1模数n的非平凡平方根”,即不等于1或n - 1 的数字,其平方等于1模n
我认为它应该说:
其正方形全等为1模n