Запутался в Миллере-Рабине - PullRequest
19 голосов
/ 17 сентября 2010

В качестве упражнения для себя я применяю тест Миллера-Рабина.(Работает через SICP).Я понимаю маленькую теорему Ферма и смог успешно ее реализовать.В испытании Миллера-Рабина меня запутали, это бизнес "1 mod n".Разве 1 ​​mod n (n - случайное целое число) не всегда 1?Таким образом, я запутался в том, что «нетривиальный квадратный корень из 1 по модулю n» может быть, так как, на мой взгляд, «1 mod n» всегда равен 1 при работе с целыми значениями.Чего мне не хватает?

Ответы [ 3 ]

26 голосов
/ 17 сентября 2010

1 совпадает с 9 модом 8, поэтому 3 является нетривиальным квадратным корнем из 1 мод 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 является (n элементом) [b]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 и ([17]9)^2 = [1]9

9 голосов
/ 27 июля 2014

Я полагаю, что недоразумение исходит из определения, которое книга дает о нетривиальном корне:

«нетривиальный квадратный корень из 1 по модулю n», то есть число, не равное 1 илиn - 1 , чей квадрат равен 1 по модулю n

Где, я полагаю, следует сказать:

, чей квадрат равен конгруэнтный до 1 по модулю n

9 голосов
/ 17 сентября 2010

Именно поэтому формулировка была для нетривиального квадратного корня из 1. 1 - это тривиальный квадратный корень из 1, для любого модуля n.

17 - нетривиальный квадратный корень из 1, мод 144Таким образом, 17 ^ 2 = 289, что соответствует 1 модулю 144. Если n простое, то 1 и n-1 - это два квадратных корня из 1, и они являются единственными двумя такими корнями.Однако для составного n обычно есть несколько квадратных корней.При n = 144 корни квадратные составляют {1,17,55,71,73,89,127,143}.

...