X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;ds=sidebyside;f=mjo%2Feja%2Feja_algebra.py;h=7f7b1f9f1c09703a2d8f48e295b203604fa5556c;hb=ef91dedb7fecddd4c0a5472e501188739b3d3d88;hp=562797318646cb1dd837691f846fd114b44ec131;hpb=432ca4fcc5ff6fef69ebbfc166cec124c83c5fd1;p=sage.d.git diff --git a/mjo/eja/eja_algebra.py b/mjo/eja/eja_algebra.py index 5627973..7f7b1f9 100644 --- a/mjo/eja/eja_algebra.py +++ b/mjo/eja/eja_algebra.py @@ -61,7 +61,10 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule): """ SETUP:: - sage: from mjo.eja.eja_algebra import (JordanSpinEJA, random_eja) + sage: from mjo.eja.eja_algebra import ( + ....: FiniteDimensionalEuclideanJordanAlgebra, + ....: JordanSpinEJA, + ....: random_eja) EXAMPLES: @@ -75,13 +78,20 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule): TESTS: - The ``field`` we're given must be real:: + The ``field`` we're given must be real with ``check=True``:: sage: JordanSpinEJA(2,QQbar) Traceback (most recent call last): ... ValueError: field is not real + The multiplication table must be square with ``check=True``:: + + sage: FiniteDimensionalEuclideanJordanAlgebra(QQ,((),())) + Traceback (most recent call last): + ... + ValueError: multiplication table is not square + """ if check: if not field.is_subring(RR): @@ -98,6 +108,9 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule): # The multiplication table had better be square n = len(mult_table) + if check: + if not all( len(l) == n for l in mult_table ): + raise ValueError("multiplication table is not square") fda = super(FiniteDimensionalEuclideanJordanAlgebra, self) fda.__init__(field, @@ -283,14 +296,26 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule): this algebra was constructed with ``check=False`` and passed an invalid multiplication table. """ + + # Used to check whether or not something is zero in an inexact + # ring. This number is sufficient to allow the construction of + # QuaternionHermitianEJA(2, RDF) with check=True. + epsilon = 1e-16 + for i in range(self.dimension()): for j in range(self.dimension()): for k in range(self.dimension()): x = self.monomial(i) y = self.monomial(j) z = self.monomial(k) - if (x*y).inner_product(z) != x.inner_product(y*z): - return False + diff = (x*y).inner_product(z) - x.inner_product(y*z) + + if self.base_ring().is_exact(): + if diff != 0: + return False + else: + if diff.abs() > epsilon: + return False return True