X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Feja%2Feja_algebra.py;h=f687e46215a1f1aefb5a5955acffd4fc4c6be301;hb=a167bfc4ffb18296eb75d505112a6c1dd4c7f9ae;hp=1337cc14f8a82862cca9a3eb069a6e33b9c397f2;hpb=47bf2e62cdeaaff94290310624f38c0c4eef9ccb;p=sage.d.git diff --git a/mjo/eja/eja_algebra.py b/mjo/eja/eja_algebra.py index 1337cc1..f687e46 100644 --- a/mjo/eja/eja_algebra.py +++ b/mjo/eja/eja_algebra.py @@ -123,11 +123,11 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule): vector representations) back and forth faithfully:: sage: set_random_seed() - sage: J = RealCartesianProductEJA(5) + sage: J = RealCartesianProductEJA.random_instance() sage: x = J.random_element() sage: J(x.to_vector().column()) == x True - sage: J = JordanSpinEJA(5) + sage: J = JordanSpinEJA.random_instance() sage: x = J.random_element() sage: J(x.to_vector().column()) == x True @@ -658,6 +658,28 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule): return s.random_element() + @classmethod + def random_instance(cls, field=QQ, **kwargs): + """ + Return a random instance of this type of algebra. + + In subclasses for algebras that we know how to construct, this + is a shortcut for constructing test cases and examples. + """ + if cls is FiniteDimensionalEuclideanJordanAlgebra: + # Red flag! But in theory we could do this I guess. The + # only finite-dimensional exceptional EJA is the + # octononions. So, we could just create an EJA from an + # associative matrix algebra (generated by a subset of + # elements) with the symmetric product. Or, we could punt + # to random_eja() here, override it in our subclasses, and + # not worry about it. + raise NotImplementedError + + n = ZZ.random_element(1, cls._max_test_case_size()) + return cls(n, field, **kwargs) + + def rank(self): """ Return the rank of this EJA. @@ -781,8 +803,7 @@ class RealCartesianProductEJA(FiniteDimensionalEuclideanJordanAlgebra): Our inner product satisfies the Jordan axiom:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: J = RealCartesianProductEJA(n) + sage: J = RealCartesianProductEJA.random_instance() sage: x = J.random_element() sage: y = J.random_element() sage: z = J.random_element() @@ -812,8 +833,7 @@ class RealCartesianProductEJA(FiniteDimensionalEuclideanJordanAlgebra): over `R^n`:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: J = RealCartesianProductEJA(n) + sage: J = RealCartesianProductEJA.random_instance() sage: x = J.random_element() sage: y = J.random_element() sage: X = x.natural_representation() @@ -861,13 +881,12 @@ def random_eja(): Euclidean Jordan algebra of dimension... """ - constructor = choice([RealCartesianProductEJA, - JordanSpinEJA, - RealSymmetricEJA, - ComplexHermitianEJA, - QuaternionHermitianEJA]) - n = ZZ.random_element(1, constructor._max_test_case_size()) - return constructor(n, field=QQ) + classname = choice([RealCartesianProductEJA, + JordanSpinEJA, + RealSymmetricEJA, + ComplexHermitianEJA, + QuaternionHermitianEJA]) + return classname.random_instance() @@ -1047,7 +1066,8 @@ def _embed_complex_matrix(M): SETUP:: - sage: from mjo.eja.eja_algebra import _embed_complex_matrix + sage: from mjo.eja.eja_algebra import (_embed_complex_matrix, + ....: ComplexHermitianEJA) EXAMPLES:: @@ -1069,7 +1089,8 @@ def _embed_complex_matrix(M): Embedding is a homomorphism (isomorphism, in fact):: sage: set_random_seed() - sage: n = ZZ.random_element(5) + sage: n_max = ComplexHermitianEJA._max_test_case_size() + sage: n = ZZ.random_element(n_max) sage: F = QuadraticField(-1, 'i') sage: X = random_matrix(F, n) sage: Y = random_matrix(F, n) @@ -1161,7 +1182,8 @@ def _embed_quaternion_matrix(M): SETUP:: - sage: from mjo.eja.eja_algebra import _embed_quaternion_matrix + sage: from mjo.eja.eja_algebra import (_embed_quaternion_matrix, + ....: QuaternionHermitianEJA) EXAMPLES:: @@ -1178,7 +1200,8 @@ def _embed_quaternion_matrix(M): Embedding is a homomorphism (isomorphism, in fact):: sage: set_random_seed() - sage: n = ZZ.random_element(5) + sage: n_max = QuaternionHermitianEJA._max_test_case_size() + sage: n = ZZ.random_element(n_max) sage: Q = QuaternionAlgebra(QQ,-1,-1) sage: X = random_matrix(Q, n) sage: Y = random_matrix(Q, n) @@ -1273,14 +1296,6 @@ def _unembed_quaternion_matrix(M): return matrix(Q, n/4, elements) -# The inner product used for the real symmetric simple EJA. -# We keep it as a separate function because e.g. the complex -# algebra uses the same inner product, except divided by 2. -def _matrix_ip(X,Y): - X_mat = X.natural_representation() - Y_mat = Y.natural_representation() - return (X_mat*Y_mat).trace() - class RealSymmetricEJA(FiniteDimensionalEuclideanJordanAlgebra): """ @@ -1308,7 +1323,8 @@ class RealSymmetricEJA(FiniteDimensionalEuclideanJordanAlgebra): The dimension of this algebra is `(n^2 + n) / 2`:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) + sage: n_max = RealSymmetricEJA._max_test_case_size() + sage: n = ZZ.random_element(1, n_max) sage: J = RealSymmetricEJA(n) sage: J.dimension() == (n^2 + n)/2 True @@ -1316,8 +1332,7 @@ class RealSymmetricEJA(FiniteDimensionalEuclideanJordanAlgebra): The Jordan multiplication is what we think it is:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: J = RealSymmetricEJA(n) + sage: J = RealSymmetricEJA.random_instance() sage: x = J.random_element() sage: y = J.random_element() sage: actual = (x*y).natural_representation() @@ -1337,8 +1352,7 @@ class RealSymmetricEJA(FiniteDimensionalEuclideanJordanAlgebra): Our inner product satisfies the Jordan axiom:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: J = RealSymmetricEJA(n) + sage: J = RealSymmetricEJA.random_instance() sage: x = J.random_element() sage: y = J.random_element() sage: z = J.random_element() @@ -1349,8 +1363,7 @@ class RealSymmetricEJA(FiniteDimensionalEuclideanJordanAlgebra): product unless we specify otherwise:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: J = RealSymmetricEJA(n) + sage: J = RealSymmetricEJA.random_instance() sage: all( b.norm() == 1 for b in J.gens() ) True @@ -1361,8 +1374,7 @@ class RealSymmetricEJA(FiniteDimensionalEuclideanJordanAlgebra): the operator is self-adjoint by the Jordan axiom:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: x = RealSymmetricEJA(n).random_element() + sage: x = RealSymmetricEJA.random_instance().random_element() sage: x.operator().matrix().is_symmetric() True @@ -1414,7 +1426,8 @@ class ComplexHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra): The dimension of this algebra is `n^2`:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) + sage: n_max = ComplexHermitianEJA._max_test_case_size() + sage: n = ZZ.random_element(1, n_max) sage: J = ComplexHermitianEJA(n) sage: J.dimension() == n^2 True @@ -1422,8 +1435,7 @@ class ComplexHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra): The Jordan multiplication is what we think it is:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: J = ComplexHermitianEJA(n) + sage: J = ComplexHermitianEJA.random_instance() sage: x = J.random_element() sage: y = J.random_element() sage: actual = (x*y).natural_representation() @@ -1443,8 +1455,7 @@ class ComplexHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra): Our inner product satisfies the Jordan axiom:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: J = ComplexHermitianEJA(n) + sage: J = ComplexHermitianEJA.random_instance() sage: x = J.random_element() sage: y = J.random_element() sage: z = J.random_element() @@ -1455,8 +1466,7 @@ class ComplexHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra): product unless we specify otherwise:: sage: set_random_seed() - sage: n = ZZ.random_element(1,4) - sage: J = ComplexHermitianEJA(n) + sage: J = ComplexHermitianEJA.random_instance() sage: all( b.norm() == 1 for b in J.gens() ) True @@ -1467,8 +1477,7 @@ class ComplexHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra): the operator is self-adjoint by the Jordan axiom:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: x = ComplexHermitianEJA(n).random_element() + sage: x = ComplexHermitianEJA.random_instance().random_element() sage: x.operator().matrix().is_symmetric() True @@ -1529,7 +1538,8 @@ class QuaternionHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra): The dimension of this algebra is `2*n^2 - n`:: sage: set_random_seed() - sage: n = ZZ.random_element(1,4) + sage: n_max = QuaternionHermitianEJA._max_test_case_size() + sage: n = ZZ.random_element(1, n_max) sage: J = QuaternionHermitianEJA(n) sage: J.dimension() == 2*(n^2) - n True @@ -1537,8 +1547,7 @@ class QuaternionHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra): The Jordan multiplication is what we think it is:: sage: set_random_seed() - sage: n = ZZ.random_element(1,4) - sage: J = QuaternionHermitianEJA(n) + sage: J = QuaternionHermitianEJA.random_instance() sage: x = J.random_element() sage: y = J.random_element() sage: actual = (x*y).natural_representation() @@ -1558,8 +1567,7 @@ class QuaternionHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra): Our inner product satisfies the Jordan axiom:: sage: set_random_seed() - sage: n = ZZ.random_element(1,4) - sage: J = QuaternionHermitianEJA(n) + sage: J = QuaternionHermitianEJA.random_instance() sage: x = J.random_element() sage: y = J.random_element() sage: z = J.random_element() @@ -1570,8 +1578,7 @@ class QuaternionHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra): product unless we specify otherwise:: sage: set_random_seed() - sage: n = ZZ.random_element(1,4) - sage: J = QuaternionHermitianEJA(n) + sage: J = QuaternionHermitianEJA.random_instance() sage: all( b.norm() == 1 for b in J.gens() ) True @@ -1582,8 +1589,7 @@ class QuaternionHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra): the operator is self-adjoint by the Jordan axiom:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: x = QuaternionHermitianEJA(n).random_element() + sage: x = QuaternionHermitianEJA.random_instance().random_element() sage: x.operator().matrix().is_symmetric() True @@ -1670,8 +1676,7 @@ class JordanSpinEJA(FiniteDimensionalEuclideanJordanAlgebra): Our inner product satisfies the Jordan axiom:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: J = JordanSpinEJA(n) + sage: J = JordanSpinEJA.random_instance() sage: x = J.random_element() sage: y = J.random_element() sage: z = J.random_element() @@ -1716,8 +1721,7 @@ class JordanSpinEJA(FiniteDimensionalEuclideanJordanAlgebra): over `R^n`:: sage: set_random_seed() - sage: n = ZZ.random_element(1,5) - sage: J = JordanSpinEJA(n) + sage: J = JordanSpinEJA.random_instance() sage: x = J.random_element() sage: y = J.random_element() sage: X = x.natural_representation()