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).
- newtype Alg m = MkAlg {}
- fromBase ∷ (RingMorphism m, Field (Domain m)) ⇒ Domain m → Alg m
- fromRealAlg ∷ Alg QinR → Alg QinC
- isRational ∷ Alg QinC → Maybe Rational
- isComplexRational ∷ Alg QinC → Maybe ComplexRational
- isInteger ∷ Alg QinC → Maybe Integer
- isApproxInteger ∷ Alg QinC → Maybe Integer
- isRationalPoly ∷ Poly (Alg QinC) → Maybe (Poly Rational)
- isIntegerPoly ∷ Poly (Alg QinC) → Maybe (Poly Integer)
- isApproxIntegerPoly ∷ Poly (Alg QinC) → Maybe (Poly Integer)
- eval ∷ (RingMorphism m, Eq (Domain m), HasAnnihilatingPolynomials (Domain m)) ⇒ Alg m → Poly (Domain m) → Alg m
- goldenRatio ∷ Alg QinR
- sqrt2 ∷ Alg QinR
- demo ∷ IO ()
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.
fromBase ∷ (RingMorphism m, Field (Domain m)) ⇒ Domain m → Alg m
Liftet Elemente des Grundrings in den Ring algebraischer Zahlen.
Beziehungen zu anderen Zahlbereichen
fromRealAlg ∷ Alg QinR → Alg QinC
Liftet eine reell-algebraische Zahl in die komplex-algebraischen Zahlen.
Entscheidet, ob eine gegebene algebraische Zahl sogar rational ist.
∷ 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.
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.
isApproxInteger ∷ Alg 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.
isRationalPoly ∷ Poly (Alg QinC) → Maybe (Poly Rational)
Entscheidet, ob ein uebergebenes Polynom mit algebraischen Koeffizienten sogar ausschliesslich rationale Koeffizienten besitzt.
isIntegerPoly ∷ Poly (Alg QinC) → Maybe (Poly Integer)
Entscheidet, ob ein uebergebenes Polynom mit algebraischen Koeffizienten sogar ausschliesslich ganzzahlige Koeffizienten besitzt.
isApproxIntegerPoly ∷ Poly (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
Konstante fuer den goldenen Schnitt.
demo ∷ IO ()