Mewakili angka Eisenstein tanpa pelampung

9

Saya punya proyek di mana saya perlu menggunakan bidang kuadrat Khususnya angka dari bentuk dengansebuah,bQ.a+b3a,bQ

Misalnya di sini adalah bilangan prima dalam bilangan bulat Eisenstein :

Saya tidak ingin menggunakan bijak. Saya ingin menulis tipe data saya sendiri untuk dimasukkan numpy. PARI akan bermanfaat - tetapi tidak kompatibel dengan Python.

  • Tambahan untuk objek-objek ini cukup jelas
    (a1+b13)+(a2+b23)=(a1+a2)+(b1+b2)3
  • Perkalian sedikit lebih rumit, tetapi kita dapat kode keras itu juga
    (a1+b13)×(a2+b23)=(a1a23b1b2)+(a1b2+a2b1)3
  • Tipe data saya juga perlu mengakomodasi pembagian. Untuk kesederhanaan mari kita ambil kebalikan:
    1a+b3=ab3a2+3b2

Apakah ada cara alami berbasis matriks untuk mengkodekan operasi ini, mirip dengan bagaimana dapat ditulis dalam hal 2 × 2 matriks?C2×2

(abba)

Mungkin saya hanya akan melakukan hard-code operasi sebagai tiga kali lipat dengan tiga operasi yang diuraikan di atas. Ada ide?

John Mangual
sumber

Jawaban:

10

a+b3

(a3bba)
(a13b1b1a1)(a23b2b2a2)=(a1a23b1b23(a1b2+b1a2)a1b2+b1a2a1a23b1b2)

a2+3b2

Anda telah mempertimbangkan menggunakan tiga kali lipat , yang saya anggap Anda akan menggunakan bilangan bulat dan penyebut umum. Pendekatan itu mungkin berguna dalam representasi matriks juga.

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
sumber
2

1/zQ[3]z

Tidak peduli bagaimana Anda mewakili elemen bidang Anda, Anda bisa membebani operator di Python menggunakan "metode ajaib". Lihat juga posting SO ini tentang cara membuat tipe numerik Anda sendiri dengan Python.

Saya tidak berpikir akan ada lebih banyak pekerjaan yang mengkode representasi elemen lapangan kuadrat baik sebagai matriks 2 x 2 bilangan rasional atau sebagai pasangan bilangan rasional, karena operasi aritmatika tidak begitu rumit. Namun, saya menduga pendekatan kedua akan lebih cepat.

Daniel Shapero
sumber
1
Mungkin menarik untuk membandingkan kinerja praktis dari numpyops matriks -dilengkapi dengan tipe data yang ditentukan pengguna. Tidak yakin tentang pemenangnya.
ccorn
Ya itu benar, numpy memang memiliki banyak optimasi kode tangan Cython + di sisi C untuk membuat segalanya lebih cepat. Anda harus mengulang beberapa dari itu sendiri untuk mencapai efek yang sama. Meskipun demikian, fungsionalitas harus didahulukan dan kemudian orang dapat khawatir tentang kecepatan.
Daniel Shapero