Algebraic

Contents

Description

Diese Modul stellt Ringe algebraischer Zahlen zur Verfuegung. Hauptbeispiele sind die ueber Q algebraischen komplexen Zahlen, Alg QinC, und die ueber Q algebraischen reellen Zahlen, Alg QinR.

Solche Ringe haben gegenueber beliebigen Ganzheitsringen zwei entscheidende zusaetzliche Merkmale: Sie sind diskret (d.h. Gleichheit ist entscheidbar), und sie bilden Koerper im strengen Sinn (d.h. jedes Element ist entweder null oder invertierbar, wobei die Inversen explizit konstruierbar sind).

Synopsis

Typen

newtype Alg m

Der Datentyp 'Alg' m bezeichnet fuer einen Ringmorphismus m diejenigen Elemente von 'Codomain' m, die ueber 'Domain' m algebraisch sind, wobei wir anders als in IntegralClosure fordern, dass 'Domain' m ein Koerper ist.

Da Ganzheit und Algebraizitaet ueber Koerpern dasselbe bedeuten, koennen wir zur Darstellung einfach IC nutzen.

Die Klassenvoraussetzungen fuer Eq, IntegralDomain und Field sehen in der HTML-Dokumentation sicherlich sehr erschreckend aus, im Code sind sie durch das CPP-Makro CanInvert besser lesbar.

Die Show-Instanz respektiert nicht Gleichheit, zwei gleiche algebraische Zahlen koennen also verschieden formatiert werden.

Constructors

MkAlg 

Fields

unAlgIC m
 

fromBase ∷ (RingMorphism m, Field (Domain m)) ⇒ Domain m → Alg m

Liftet Elemente des Grundrings in den Ring algebraischer Zahlen.

Beziehungen zu anderen Zahlbereichen

fromRealAlgAlg QinRAlg QinC

Liftet eine reell-algebraische Zahl in die komplex-algebraischen Zahlen.

isRational

Arguments

Alg QinC

z

→ Maybe Rational

Just q, falls z = q fuer ein rationales q, sonst Nothing

Entscheidet, ob eine gegebene algebraische Zahl sogar rational ist.

isComplexRational

Arguments

Alg QinC

z

→ Maybe ComplexRational

Just u, falls z = u fuer ein komplexrationales u, sonst Nothing

Entscheidet, ob eine gegebene algebraische Zahl sogar komplexrational ist.

isInteger

Arguments

Alg QinC

z

→ Maybe Integer

Just n, falls z = n fuer ein ganzzahliges n, sonst Nothing

Entscheidet, ob eine gegebene algebraische Zahl sogar eine ganze Zahl ist. Folgende Spezifikation wird fuer alle ganzen Zahlen n erfuellt:

 isInteger z == Just n  <==>  z = n.

isApproxIntegerAlg QinC → Maybe Integer

Entscheidet, ob die uebergebene algebraische Zahl ganzzahlig sein kann, und wenn ja, bestimmt die (dann eindeutig bestimmte) naeheste ganze Zahl an z.

Falls man mit irrtuemlicherweise als ganzzahlig gemeldeten algebraischen Zahlen leben kann (etwa, weil man spaeter selbst eine entsprechende Pruefung durchfuehrt), so ist isApproxInteger effizienter als isInteger.

Folgende Spezifikation wird fuer alle ganzen Zahlen n erfuellt:

 isApproxInteger z == Just n  <==  z = n.

isRationalPolyPoly (Alg QinC) → Maybe (Poly Rational)

Entscheidet, ob ein uebergebenes Polynom mit algebraischen Koeffizienten sogar ausschliesslich rationale Koeffizienten besitzt.

isIntegerPolyPoly (Alg QinC) → Maybe (Poly Integer)

Entscheidet, ob ein uebergebenes Polynom mit algebraischen Koeffizienten sogar ausschliesslich ganzzahlige Koeffizienten besitzt.

isApproxIntegerPolyPoly (Alg QinC) → Maybe (Poly Integer)

Entscheidet approximativ, ob ein uebergebenes Polynom mit algebraischen Koeffizienten sogar ausschliesslich ganzzahlige Koeffizienten besitzt.

Rechnungen

eval ∷ (RingMorphism m, Eq (Domain m), HasAnnihilatingPolynomials (Domain m)) ⇒ Alg m → Poly (Domain m) → Alg m

Wertet ein Polynom mit rationalen Koeffizienten in einer algebraischen Zahl aus. Erfuellt die Spezifikation

 eval x f = Poly.eval x (fmap fromBase f),

ist aber wesentlich effizienter. (Siehe eval in IntegralClosure.)

Beispiele

goldenRatioAlg QinR

Konstante fuer den goldenen Schnitt.

sqrt2Alg QinR

Konstante fuer die Quadratwurzel aus 2.

demo ∷ IO ()