Şamandırasız Eisenstein sayılarını temsil etme


9

Ben ikinci dereceden alanları kullanmanız gereken bir proje var Özellikle ile formun sayıları .a+b3a,bQ

Örneğin, Eisenstein tamsayılarındaki asal sayılar şunlardır :

Adaçayı kullanmak istemiyorum. Dahil etmek için kendi veri türümü yazmak istiyorum numpy. PARI faydalı olacaktır - ancak Python ile uyumlu değildir.

  • Bu nesneler için oldukça açıktır
    (a1+b13)+(a2+b23)=(a1+a2)+(b1+b2)3
  • Çarpma biraz daha hassastır, ancak onu da zor bir şekilde kodlayabiliriz
    (a1+b13)×(a2+b23)=(a1a23b1b2)+(a1b2+a2b1)3
  • Veri tipimin de bölünmeyi barındırması gerekiyor. Basit olması için karşılıklı:
    1a+b3=ab3a2+3b2

nin matris cinsinden nasıl yazılabileceğine benzer şekilde, bu işlemleri kodlamanın doğal bir matris tabanlı yolu var mı?C2×2

(abba)

Belki de yukarıda belirtilen üç işlemle işlemleri üçlü olarak kodlayacağım. Herhangi bir fikir?

Yanıtlar:


10

For Eğer gösterimi kullanabilir Toplama besbelli çalışır. Çarpma için , temsili korur, böylece bir halka homomorfizması vardır.a+b3

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

Matrisin determinantını almak (kare) normu , böylece karşılıklılıklar beklendiği gibi ters matrislere karşılık gelir.a2+3b2

Zaten tamsayı ve ortak payda kullanacağınızı varsaydığım üçlüyü kullanmayı zaten düşündünüz . Bu yaklaşım matris gösterimlerinde de yararlı olabilir.

Güncelleme : Matris gösterimleri için genel bir yöntem eşlik eden matrisi kullanır . Örneğin, yerine temsil etmek istediğinizi varsayalım , böylece . Tamamlayıcı matrisi isimli , ve tüm ilgili halka gibi işlemler bu davranır kendisi. Tabii ki, olarak temsil edilebilir ; Bu nedenle bir matris biçimi olan a+bωω=exp(2πi3)ω2+ω+1=0ω(0111)ω1(1001)a+bω

(abbab)
Bunun bir halka homomorfizması olduğunu doğrulamak isteyebilirsiniz. Ayrıca, bunu görmek kolaydır. Çarpma için, karşılık gelen formüller artık
(a1+b1ω)(a2+b2ω)=(a1a2b1b2)+(a1b2+b1a2b1b2)ω(a1b1b1a1b1)(a2b2b2a2b2)=(a1a2b1b2(a1b2+b1a2b1b2)a1b2+b1a2b1b2a1a2a1b2b1a2)

2

Kayan nokta hataları yapabiliriz gibi ben her şey için kesin rasyonel aritmetik istiyorum tahmin ediyorum değil bile olduğunu. Bunun için SymPy paketine bir göz atmak isteyebilirsiniz ; eğer rasyonel veri türlerini doğrudan kullanmazsanız, kendi elinizdeki sürümünüz için ilham kaynağı olabilir. Daha sonra ikinci dereceden alan türünüzü, seçtiğiniz rasyonel sayı türünün üzerine inşa edebilirsiniz.1/zQ[3]z

Alanınızın unsurlarını nasıl temsil ederseniz edin, "sihirli yöntemler" kullanarak Python'daki operatörleri aşırı yükleyebilirsiniz. Ayrıca Python'da kendi sayısal türünüzü oluşturmak için bu SO yayınına bakın .

İkinci dereceden bir alanın bir öğesinin bir temsilini rasyonel sayıların 2 x 2 matrisi veya bir çift rasyonel sayı olarak kodlayan çok daha fazla iş olacağını düşünmüyorum, çünkü aritmetik işlemler bu kadar karmaşık değil. Ancak, ikinci yaklaşımın daha hızlı olacağını düşünüyorum.


1
numpyHızlandırılmış matris işlemlerinin pratik performansını kullanıcı tanımlı veri türleriyle karşılaştırmak ilginç olabilir . Kazanın ne olacağından emin değilim.
korniş

Evet bu doğru, numpy'nin işleri daha hızlı hale getirmek için C tarafında çok sayıda Cython + el kodlu optimizasyonu var. Aynı etkiyi elde etmek için bazılarını kendiniz tekrarlamanız gerekir. Bununla birlikte, işlevsellik önce gelmelidir ve daha sonra hız hakkında endişelenebilirsiniz.
Daniel Shapero
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.