Представление чисел Эйзенштейна без поплавков

9

У меня есть проект , где нужно использовать квадратные поля В частности число видаa+b3 с a,bQ,

Например, вот простые числа в числах Эйзенштейна :

Я не хочу использовать шалфей. Я хотел бы написать свой собственный тип данных для включения numpy. PARI был бы полезен - но он не совместим с Python.

  • Дополнение к этим объектам довольно понятно
    (a1+b13)+(a2+b23)=(a1+a2)+(b1+b2)3
  • Умножение немного деликатнее, но мы также можем жестко его кодировать
    (a1+b13)×(a2+b23)=(a1a23b1b2)+(a1b2+a2b1)3
  • Мой тип данных также должен учитывать разделение. Для простоты возьмем ответ:
    1a+b3=ab3a2+3b2

Существует ли естественный матричный способ кодирования этих операций, подобный тому, как C может быть написано с точки зрения 2×2 Матрицы?

(abba)

Может быть, я просто жестко закодирую операции как тройки с тремя операциями, описанными выше. Любые идеи?

Джон Мангуаль
источник

Ответы:

10

За a+b3 Вы можете использовать представление

(a3bba)
Дополнение работает очевидно. Для умножения вы можете проверить
(a13b1b1a1)(a23b2b2a2)=(a1a23b1b23(a1b2+b1a2)a1b2+b1a2a1a23b1b2)
что сохраняет представление, таким образом, мы имеем гомоморфизм кольца.

Взятие определителя матрицы дает (квадрат) норму a2+3b2таким образом, обратные соотношения соответствуют обратным матрицам, как и ожидалось.

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

Обновление : общий метод для матричных представлений использует сопутствующую матрицу . Например, предположим, что вы хотите представлятьa+bω вместо того, где ω=exp(2πi3)таким образом ω2+ω+1=0, Сопутствующая матрицаω является (0111)и это ведет себя во всех связанных с ним операциях вызова, таких как ωсам. Конечно,1 может быть представлен как (1001); поэтому матричное представлениеa+bω является

(abbab)
Вы можете проверить, что это кольцевой гомоморфизм. Кроме того, это легко увидеть. Для умножения соответствующие формулы теперь
(a1+b1ω)(a2+b2ω)=(a1a2b1b2)+(a1b2+b1a2b1b2)ω(a1b1b1a1b1)(a2b2b2a2b2)=(a1a2b1b2(a1b2+b1a2b1b2)a1b2+b1a2b1b2a1a2a1b2b1a2)
ccorn
источник
2

Я предполагаю, что вы хотите точную рациональную арифметику для всего, поскольку ошибки с плавающей запятой могут сделать 1/z не в Q[3] даже если zявляется. Для этого вы можете взглянуть на пакет SymPy ; если вы не используете их рациональный тип данных напрямую, это может послужить источником вдохновения для вашей собственной версии. Затем вы можете построить свой тип квадратичного поля поверх любого рационального числового типа, который вы выберете.

Независимо от того, как вы представляете элементы своего поля, вы можете перегружать операторы в Python, используя «магические методы». Смотрите также этот пост о создании собственного числового типа в Python.

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

Даниэль Шаперо
источник
1
Может быть интересно сравнить практическую производительность операций с numpyускоренной матрицей с пользовательскими типами данных. Не уверен, что победитель будет.
ccorn
Да, это правда, Numpy действительно имеет много оптимизаций, написанных вручную на языке C, для ускорения. Вам придется переделать часть этого самостоятельно, чтобы добиться того же эффекта. Тем не менее, функциональность должна быть на первом месте, а потом можно беспокоиться о скорости.
Даниэль Шаперо