Подтвердить что ты не робот

Какой хороший метод для вычисления гауссовских целых чисел?

У меня уже есть первичная факторизация (для целых чисел), но теперь я хочу реализовать ее для гауссовских целых чисел, но как мне это сделать? спасибо!

4b9b3361

Ответ 1

Это оказалось немного многословным, но я надеюсь, что он полностью ответит на ваш вопрос...

A Гауссовское целое число является комплексным числом формы

G = a + bi

где я 2= -1, а a и b - целые числа.

Гауссовы целые образуют единую область факторизации. Некоторые из них действуют как единицы (например, 1, -1, i и -i), некоторые как (например, 1 + i) и остальной составной, который может быть разложен как произведение простых чисел и единиц, которые являются уникальными, кроме порядка факторов и наличия набора единиц, продукт 1.

норма такого числа G определяется как целое число: norm (G) = a 2 + b 2.

Можно показать, что норма является мультипликативным свойством, то есть:

норма (I * J) = норма (I) * норма (J)

Итак, если вы хотите определить гауссовское целое число G, вы можете воспользоваться тем, что любое гауссовское целое I, которое делит G должен удовлетворять тому, что норма (I) делит норму (G), и вы знаете, как найти факторы нормы (G).

Простые числа гауссовских целых чисел делятся на три категории:

1 +/- i, с нормой 2,

a +/- bi, с основной нормой a 2 + b 2, конгруэнтной 1 mod 4,

a, где a является простым конгруэнтом 3 mod 4, с нормой a 2


Теперь, чтобы превратить это в алгоритм... если вы хотите определить гауссовское целое число G, вы можете найти ее норму N, а затем умножить ее на простые целые числа. затем мы прокладываем себе путь по этому списку, отрывая простые факторы p от N, которые соответствуют для простого гауссовского коэффициента q нашего исходного числа G.

Существует всего три случая, и два из них тривиальны.

Если p = 2, пусть q = (1 + i). (Обратите внимание, что q = (1-i) будет работать одинаково хорошо, поскольку они отличаются только единичным коэффициентом.)

Если p = 3 mod 4, q = p. Но норма q p 2, поэтому мы можем ударить другой фактор p из списка остальных факторов нормы (G).

Дело p = 1 mod 4 - это единственное, с чем сложно справиться. Это эквивалентно задаче выражения p как суммы двух квадратов: если p = a 2 + b 2, то a + bi и a-biсильные > образуют сопряженную пару гауссовых простых чисел с нормой p, и один из них будет тем фактором, который мы ищем.

Но с небольшой теорией чисел это оказывается не слишком сложным. Рассмотрим целые числа mod p. Предположим, что мы можем найти целое число k такое что k 2= -1 mod p. Тогда k 2 +1 = 0 mod p, что эквивалентно говоря, что p делит k 2 +1 на целые числа (и, следовательно, также Гауссовские целые числа). В гауссовских целых числах k 2 +1 факторы в (к + I) (к-я). p делит продукт, но не делит его фактор. Поэтому p имеет нетривиальный GCD с каждым из факторы (k + i) и (k-i), а GCD или его сопряженный фактор, который мы ищем!

Но как найти такое целое число k? Пусть n - некоторое целое число между 2 и p-1 включительно. Вычислить n (p-1)/2 mod p - это значение будет либо 1 или -1. Если -1, тогда k = n (p-1)/4, попробуйте другой n. Почти половина возможных значений n даст нам квадратный корень из -1 mod p, поэтому для определения значения k не потребуется много догадок работы.

Чтобы найти гауссовские простые числа с нормой p, просто используйте алгоритм Евклида (слегка модифицированный для работы с гауссовскими целыми числами) для вычисления GCD (p, k + i). Это дает один пробный делитель. Если он равномерно делит Гауссовское целое, которое мы пытаемся вычислить (остаток = 0), мы закончили. В противном случае его сопряжение является искомым фактором.

Эвклидный алгоритм GCD для гауссовских целых чисел почти идентичен что для нормальных целых чисел. Каждая итерация состоит из пробного подразделения с остатком. Если мы ищем gcd (a, b),

q = floor (a/b), остаток = a - q * b, и если остаток не равен нулю мы возвращаем gcd (b, остаток).

В целых числах, если мы получим дробь как частное, округлите ее до нуля.
В гауссовских целых числах, если действительная или мнимая части частного являются дробями, они округляются до ближайшего целого числа. Кроме того, алгоритмы идентичны.

Итак, алгоритм факторизации гауссовского целого G выглядит примерно так: это:

Вычислить норма (G), затем коэффициент (G) в простые числа p 1, p 2... p n.

For each remaining factor p:
   if p=2, u = (1 + i).   
      strike p from the list of remaining primes.
   else if p mod 4 = 3, q = p, and strike 2 copies of p from the list of primes.
   else find k such that k^2 = -1 mod p, then u = gcd(p, k+i)
       if G/u has remainder 0, q = u
       else q = conjugate(u)
       strike p from the list of remaining primes.
   Add q to the list of Gaussian factors.
   Replace G with G/q.
endfor

В конце этой процедуры G - единица с нормой 1. Но это не обязательно 1 - это может быть -1, i или -i, и в этом случае добавить G в список факторов, чтобы вывести знаки, когда вы умножаете все факторы на посмотрите, соответствует ли продукт исходному значению G.


Здесь приведен пример: коэффициент G = 361 - 1767i по гауссовским целым. норма (G) = 3252610 = 2 * 5 * 17 * 19 * 19 * 53

Учитывая 2, мы попробуем q = (1 + i) и найдем G/q = -703 - 1064i с остатком 0.

G <= G/q = -703 - 1064i

Учитывая 5, мы видим, что оно сравнимо с 1 mod 4. Нам нужно найти хороший k. Попытка n = 2, n (p-1)/2 mod p= 2 2 mod p= 4. 4 согласуется с -1 mod 5. Успех! k = 2 1= 2. u = gcd (5, 2 + i), который работает 2 + i. G/u = -494 - 285i, с остатком 0, поэтому мы находим q = 2 + i.

G <= G/q = -494 - 285i

Учитывая 17, он также согласуется с 1 mod 4, поэтому нам нужно найти другое k mod 17. Попытка n = 2, 2 8= 1 mod 17, ничего хорошего. Вместо этого попробуйте n = 3. 3 8= 16 mod 17 = -1 mod 17. Успех! Итак, k = 3 4= 13 mod 17. gcd (17, 13 + i) = u = 4-i, G/u = -99 -96i с остатком -2. Не хорошо, поэтому попробуйте сопряжение (u) = 4 + i. G/u = -133 - 38i с остатком 0. Другой фактор!

G <= G/(4 + i) = -133 - 38i

Учитывая 19, он сравним с 3 mod 4. Итак, наш следующий фактор 19, и мы удаляем вторую копию 19 из списка.

G <= G/19 = -7 - 2i

Учитывая 53, он сравним с 1 mod 4. Снова с k процессом... Попытка n = 2, 2 26= 52 mod 53 = -1 mod 53. Тогда k = 2 13 mod 53 = 30. gcd (53,30 + i) = u = -7 - 2i. Это идентично G, поэтому окончательный quotient G/(- 7-2i) = 1, и нет факторов -1, i или -i, чтобы волноваться о.

Найдены факторы (1 + i) (2 + i) (4 + i) (19 + 0i) (- 7-2i). И если вы умножаете это (как упражнение для читателя...), вот и продукт 361-1767i, который является номером, с которого мы начали.

Не теория чисел сладка?

Ответ 2

Используйте плавающую точку для реальных и мнимых компонентов, если вы хотите получить полную одиночную целую точность, и определите gsub, gmul и специальное деление gdivr с закругленными коэффициентами, а не на пол. Это потому, что метод факторизации Полларда rho требует gcd по алгоритму Евклида, с слегка измененным gmodulo:

gmodulo((x,y),(x',y'))=gsub((x,y),gmul((x',y'),gdivr((x,y),(x',y'))))

Поллард ро

def poly((a,b),(x,y))=gmodulo(gsub(gmul((a,b),(a,b)),(1,0)),(x,y))

input (x,y),(a,b) % (x,y) is the Gaussian number to be factorized
(c,d)<-(a,b)
do 
   (a,b)=poly((a,b),(x,y))
   (c,d)=poly(poly((c,d),(x,y)),(x,y))
   (e,f)=ggcd((x,y),gsub((a,b),(c,d)))
   if (e,f)=(x,y) then return (x,y) % failure, try other (a,b)
until e^2+f^2>1
return (e,f)

Нормальное начальное значение равно a = 1, b = 0.

Я использовал этот метод, запрограммированный в Forth в моем блоге http://forthmath.blogspot.se

Для обеспечения безопасности используйте округленные значения во всех вычислениях при использовании плавающих точек для целых чисел.