Ş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+b−3a,b∈Q

Ö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+b1−3)+(a2+b2−3)=(a1+a2)+(b1+b2)−3
  • Çarpma biraz daha hassastır, ancak onu da zor bir şekilde kodlayabiliriz
    (a1+b1−3)×(a2+b2−3)=(a1a2−3b1b2)+(a1b2+a2b1)−3
  • Veri tipimin de bölünmeyi barındırması gerekiyor. Basit olması için karşılıklı:
    1a+b−3=a−b−3a2+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

(ab−ba)

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+b−3

(a−3bba)
(a1−3b1b1a1)(a2−3b2b2a2)=(a1a2−3b1b2−3(a1b2+b1a2)a1b2+b1a2a1a2−3b1b2)

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ω(0−11−1)ω1(1001)a+bω

(a−bba−b)
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ω)=(a1a2−b1b2)+(a1b2+b1a2−b1b2)ω(a1−b1b1a1−b1)(a2−b2b2a2−b2)=(a1a2−b1b2−(a1b2+b1a2−b1b2)a1b2+b1a2−b1b2a1a2−a1b2−b1a2)

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.