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


9

У мене є проект, де мені потрібно використовувати квадратичні поля Конкретно числа форми з .a+b3a,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)

2

I'm guessing you want exact rational arithmetic for everything, as floating point errors could make 1/z not in Q[3] even if z is. For that, you might want to have a look at the SymPy package; if you don't use their rational data type directly, it could serve as inspiration for your own hand-rolled version. You could then build your quadratic field type on top of whatever rational number type you choose.

No matter how you represent the elements of your field, you can overload operators in Python using "magic methods". See also this SO post on creating your own numeric type in Python.

I don't think there would be that much more work coding a representation of an element of a quadratic field either as a 2 x 2 matrix of rational numbers or as a pair of rational numbers, since the arithmetic operations aren't that complicated. However, I suspect the second approach will be faster.


1
It may be interesting to compare the practical performance of numpy-accelerated matrix ops with those of user-defined data types. Not sure about what the winner would be.
ccorn

Yes that's true, numpy does have a lot of Cython + hand-coded optimizations on the C side to make things faster. You'd have to redo some of that yourself to achieve the same effect. Nonetheless, functionality should come first and later one can worry about speed.
Daniel Shapero
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.