]> gitweb.michael.orlitzky.com - sage.d.git/log
sage.d.git
3 weeks agoREADME.rst: don't mention my custom Octonions
Michael Orlitzky [Thu, 9 Apr 2026 00:30:07 +0000 (20:30 -0400)]
README.rst: don't mention my custom Octonions

3 weeks agomjo/hurwitz.py: delete custom Octonions implementation
Michael Orlitzky [Thu, 9 Apr 2026 00:29:34 +0000 (20:29 -0400)]
mjo/hurwitz.py: delete custom Octonions implementation

Everything has been updated to use the Sage OctonionAlgebra.

3 weeks agomjo/hurwitz.py: update tests to use Sage's octonions
Michael Orlitzky [Thu, 9 Apr 2026 00:28:49 +0000 (20:28 -0400)]
mjo/hurwitz.py: update tests to use Sage's octonions

3 weeks agomjo/matrix_algebra.py: use Sage's octonions in all tests
Michael Orlitzky [Thu, 9 Apr 2026 00:27:25 +0000 (20:27 -0400)]
mjo/matrix_algebra.py: use Sage's octonions in all tests

3 weeks agomjo/misc.py: special case for Sage's octonions in _all2list()
Michael Orlitzky [Thu, 9 Apr 2026 00:09:32 +0000 (20:09 -0400)]
mjo/misc.py: special case for Sage's octonions in _all2list()

These have vector(), not to_vector().

3 weeks agomjo/eja: update to use Sage's octonions
Michael Orlitzky [Wed, 8 Apr 2026 23:50:53 +0000 (19:50 -0400)]
mjo/eja: update to use Sage's octonions

3 weeks agomjo/matrix_algebra.py: support Vector "rows" in from_list()
Michael Orlitzky [Wed, 8 Apr 2026 23:48:48 +0000 (19:48 -0400)]
mjo/matrix_algebra.py: support Vector "rows" in from_list()

Something in Sage changed and now we're getting Vector "rows" in what
used to be a list-of-lists resulting from a block matrix. Tweak the
test to support anything with a __len__ method inside, rather than
just list or tuple.

3 weeks agomjo/hurwitz.py: update examples to use Sage's octonions
Michael Orlitzky [Wed, 8 Apr 2026 14:01:06 +0000 (10:01 -0400)]
mjo/hurwitz.py: update examples to use Sage's octonions

Use OctonionAlgebra rather than my custom Octonions. Tests pass
within huritz.py and matrix_algebra.py, but the EJA modules are
certainly broken.

3 weeks agomjo/hurwitz.py: fix entry_algebra_gens() in HurwitzMatrixAlgebra
Michael Orlitzky [Wed, 8 Apr 2026 13:59:37 +0000 (09:59 -0400)]
mjo/hurwitz.py: fix entry_algebra_gens() in HurwitzMatrixAlgebra

Just like we did for MatrixAlgebra, add a special case for the
octonions in entry_algebra_gens(). The OctonionAlgebra uses gens()
for the multiplicative generators, so we only get five of them.

4 weeks agomjo/matrix_algebra.py: support OctonionAlgebra in entry_algebra_gens()
Michael Orlitzky [Tue, 7 Apr 2026 15:07:07 +0000 (11:07 -0400)]
mjo/matrix_algebra.py: support OctonionAlgebra in entry_algebra_gens()

We need a special case for algebras that have a basis(), since that's
really what we want, and "generators" is technically incorrect when
multiplication is involved.

4 weeks agomjo/matrix_algebra.py: special case for OctonionAlgebra
Michael Orlitzky [Tue, 7 Apr 2026 14:56:25 +0000 (10:56 -0400)]
mjo/matrix_algebra.py: special case for OctonionAlgebra

Eventually I will switch mjo.hurwitz to use Sage's (new)
OctonionAlgebra class. In preparation, add a special case to deal with
the fact that they have a vector() method but no to_vector().

5 weeks agomjo/clan/normal_decomposition.py: another principal decomp test
Michael Orlitzky [Fri, 27 Mar 2026 18:07:17 +0000 (14:07 -0400)]
mjo/clan/normal_decomposition.py: another principal decomp test

There was a bug in the previous test, since we are using the Ishi
convention that gives us a lower-triangular normal decomposition: a
subclan is obtained by "deleting" the first idempotent rather than the
last. After fixing that, we add another test to show that this does
actually produce a subalgebra (the new test finds the bug).

5 weeks agomjo/clan/normal_decomposition.py: add test for principal decomp
Michael Orlitzky [Fri, 27 Mar 2026 15:25:26 +0000 (11:25 -0400)]
mjo/clan/normal_decomposition.py: add test for principal decomp

We get a principal decomposition of a non-unital clan if we "delete"
the r'th idempotent from the normal decomposition of a unital clan,
but this isn't obvious. Let's test it.

5 weeks agomjo/clan/clan_element.py: add norm methods
Michael Orlitzky [Fri, 27 Mar 2026 00:56:17 +0000 (20:56 -0400)]
mjo/clan/clan_element.py: add norm methods

For convenience, define norm() and norm_vinberg() in terms of the
corresponding inner product methods. This will usually involve a
sqrt(), and I have not thought very hard about how to handle that
intelligently.

8 weeks agomjo/clan/vinberg_clan.py: cite references
Michael Orlitzky [Mon, 9 Mar 2026 02:10:30 +0000 (22:10 -0400)]
mjo/clan/vinberg_clan.py: cite references

2 months agomjo/clan/t_algebra_clan.py: speed up ComplexHermitianClan
Michael Orlitzky [Wed, 4 Mar 2026 15:36:42 +0000 (10:36 -0500)]
mjo/clan/t_algebra_clan.py: speed up ComplexHermitianClan

To speed up ComplexHermitianClan, we use a quadratic field extension
for the entries of the ambient matrix space rather than (basically)
assuming QQ and QQbar. But before we can do that, we need to adjust
from_matrix() to reject mismatched entry algebras. We also need to
special case several real/complex field pairs, because the quadratic
extension procedure does not always give us something usable -- our
Hurwitz matrix algebras are finicky.

2 months agomjo/clan: add tests for zero-dimensional clans
Michael Orlitzky [Wed, 4 Mar 2026 14:40:28 +0000 (09:40 -0500)]
mjo/clan: add tests for zero-dimensional clans

2 months agomjo/clan/jordan_spin_clan.py: fix n=0 case
Michael Orlitzky [Wed, 4 Mar 2026 14:40:03 +0000 (09:40 -0500)]
mjo/clan/jordan_spin_clan.py: fix n=0 case

2 months agomjo/clan: fix propagation of scalar fields
Michael Orlitzky [Wed, 4 Mar 2026 14:09:10 +0000 (09:09 -0500)]
mjo/clan: fix propagation of scalar fields

Non-default fields were getting lost in __init__. Now there are tests.

2 months agomjo/clan/trivial_clan.py: new TrivialClan class
Michael Orlitzky [Wed, 4 Mar 2026 13:03:40 +0000 (08:03 -0500)]
mjo/clan/trivial_clan.py: new TrivialClan class

Does exactly what you would expect: nothing.

2 months agomjo/clan/normal_decomposition.py: special case for rank zero
Michael Orlitzky [Wed, 4 Mar 2026 13:03:21 +0000 (08:03 -0500)]
mjo/clan/normal_decomposition.py: special case for rank zero

2 months agomjo/clan/all.py: put JordanSpinClan in the public namespace
Michael Orlitzky [Wed, 4 Mar 2026 12:47:45 +0000 (07:47 -0500)]
mjo/clan/all.py: put JordanSpinClan in the public namespace

2 months agomjo/clan/jordan_spin_clan.py: support n=1 (the real numbers)
Michael Orlitzky [Wed, 4 Mar 2026 12:47:14 +0000 (07:47 -0500)]
mjo/clan/jordan_spin_clan.py: support n=1 (the real numbers)

2 months agomjo/clan/jordan_spin_clan.py: add a comment about the inner product
Michael Orlitzky [Wed, 4 Mar 2026 03:26:47 +0000 (22:26 -0500)]
mjo/clan/jordan_spin_clan.py: add a comment about the inner product

2 months agomjo/clan/jordan_spin_clan.py: fix the clan product
Michael Orlitzky [Wed, 4 Mar 2026 03:10:16 +0000 (22:10 -0500)]
mjo/clan/jordan_spin_clan.py: fix the clan product

I forgot a "2", and now that it's there we can verify the homogeneous
polynomials D(0) and D(1).

2 months agomjo/clan/jordan_spin_clan.py: first steps towards an implementation
Michael Orlitzky [Wed, 4 Mar 2026 02:00:57 +0000 (21:00 -0500)]
mjo/clan/jordan_spin_clan.py: first steps towards an implementation

2 months agomjo/clan/vinberg_clan.py: eliminate top-level QQ import
Michael Orlitzky [Wed, 4 Mar 2026 01:26:08 +0000 (20:26 -0500)]
mjo/clan/vinberg_clan.py: eliminate top-level QQ import

2 months agomjo/cone/decomposition.py: use check=False at end of nonlineal_part()
Michael Orlitzky [Tue, 3 Mar 2026 01:50:17 +0000 (20:50 -0500)]
mjo/cone/decomposition.py: use check=False at end of nonlineal_part()

I've sketched an argument that the generating sets must be minimal.

2 months agomjo/cone/decomposition.py: remove a junk example
Michael Orlitzky [Tue, 3 Mar 2026 01:49:13 +0000 (20:49 -0500)]
mjo/cone/decomposition.py: remove a junk example

Passing a non-minimal set of generators with check=False and
normalize=False invalidates anything else that might happen.

2 months agomjo/cone/decomposition.py: update a comment / open question
Michael Orlitzky [Mon, 2 Mar 2026 16:26:10 +0000 (11:26 -0500)]
mjo/cone/decomposition.py: update a comment / open question

2 months agomjo/cone/decomposition.py: finish nonlineal_part() updates
Michael Orlitzky [Mon, 2 Mar 2026 16:22:09 +0000 (11:22 -0500)]
mjo/cone/decomposition.py: finish nonlineal_part() updates

This was remarkably close to working for something untested; only a
few minor tweaks and typos remained.

2 months agomjo/cone/decomposition.py: allow nonorthogonal nonlinea parts (WIP)
Michael Orlitzky [Mon, 2 Mar 2026 15:03:30 +0000 (10:03 -0500)]
mjo/cone/decomposition.py: allow nonorthogonal nonlinea parts (WIP)

This is a work-in-progress that probably doesn't function and
definitely won't pass tests. I'm pushing the changes only because I
broke Sage on the machine I'm working on and need to sync.

2 months agoREADME.rst: don't all-caps BASH
Michael Orlitzky [Wed, 25 Feb 2026 13:34:57 +0000 (08:34 -0500)]
README.rst: don't all-caps BASH

2 months agoREADME.rst: add "export" to PYTHONPATH example
Michael Orlitzky [Wed, 25 Feb 2026 02:19:07 +0000 (21:19 -0500)]
README.rst: add "export" to PYTHONPATH example

2 months agoREADME: convert to reStructuredText, and rewrite
Michael Orlitzky [Wed, 25 Feb 2026 02:00:38 +0000 (21:00 -0500)]
README: convert to reStructuredText, and rewrite

This will look nice on Codeberg, and in any case it's nice to have
some meaningful information in here.

2 months agomakefile: remove PYTHONPATH hack from check target
Michael Orlitzky [Wed, 25 Feb 2026 01:57:34 +0000 (20:57 -0500)]
makefile: remove PYTHONPATH hack from check target

Having eliminated the sitedir trickery from init.sage, one must now
have PYTHONPATH properly configured before anything will work.

2 months agoinit.sage: remove hard-coded repository paths
Michael Orlitzky [Wed, 25 Feb 2026 01:53:03 +0000 (20:53 -0500)]
init.sage: remove hard-coded repository paths

You'll just have to specify where the repository lives, as with all
other rogue python libraries.

2 months agomjo/clan: eliminate UnitalClan
Michael Orlitzky [Sun, 22 Feb 2026 17:44:48 +0000 (12:44 -0500)]
mjo/clan: eliminate UnitalClan

We can add Unital() in NormalDecomposition anyway, because following
Vinberg we assume that they have one. But even if they didn't, the
unit element would be a property of each individual clan.

2 months agomjo/clan: more class hierarchy refactoring
Michael Orlitzky [Sun, 22 Feb 2026 17:32:43 +0000 (12:32 -0500)]
mjo/clan: more class hierarchy refactoring

Renamed MatrixAlgebra to TAlgebraClan, since in theory the up-hat and
down-hat work for any T-algebra. Separated that out along with the
NormalDecomposition class.

2 months agomjo/clan: factor out mjo.clan.normal_decomposition_element
Michael Orlitzky [Sun, 22 Feb 2026 16:59:11 +0000 (11:59 -0500)]
mjo/clan: factor out mjo.clan.normal_decomposition_element

2 months agomjo/clan/clan.py: fix the scalar field for NormalDecomposition
Michael Orlitzky [Sun, 22 Feb 2026 16:53:08 +0000 (11:53 -0500)]
mjo/clan/clan.py: fix the scalar field for NormalDecomposition

2 months agomjo/clan: factor out mjo.clan.vinberg_clan
Michael Orlitzky [Sun, 22 Feb 2026 16:42:50 +0000 (11:42 -0500)]
mjo/clan: factor out mjo.clan.vinberg_clan

2 months agomjo/clan: rename SnClan and HnClan for consistency with EJA names
Michael Orlitzky [Sun, 22 Feb 2026 16:34:24 +0000 (11:34 -0500)]
mjo/clan: rename SnClan and HnClan for consistency with EJA names

2 months agomjo/clan/clan_operator.py: undo _is_clan() hack
Michael Orlitzky [Sat, 21 Feb 2026 15:25:52 +0000 (10:25 -0500)]
mjo/clan/clan_operator.py: undo _is_clan() hack

And just like that, it starts working for no reason.

2 months agomjo/clan/clan_operator.py: de-alias FreeModules -> ModulesWithBasis
Michael Orlitzky [Sat, 21 Feb 2026 15:01:09 +0000 (10:01 -0500)]
mjo/clan/clan_operator.py: de-alias FreeModules -> ModulesWithBasis

2 months agomjo/clan/clan.py: add SETUP:: blocks
Michael Orlitzky [Sat, 21 Feb 2026 14:57:29 +0000 (09:57 -0500)]
mjo/clan/clan.py: add SETUP:: blocks

These are now(?) necessary with the new all.py exports.

2 months agomjo/all.py,mjo/clan/all.py: export user-facing clan bits
Michael Orlitzky [Sat, 21 Feb 2026 14:31:13 +0000 (09:31 -0500)]
mjo/all.py,mjo/clan/all.py: export user-facing clan bits

2 months agomjo/clan/clan_operator.py: god-awful hack for category check
Michael Orlitzky [Sat, 21 Feb 2026 14:30:04 +0000 (09:30 -0500)]
mjo/clan/clan_operator.py: god-awful hack for category check

2 months agomjo/clan/clan.py: whitespace
Michael Orlitzky [Sat, 21 Feb 2026 14:18:36 +0000 (09:18 -0500)]
mjo/clan/clan.py: whitespace

2 months agomjo/clan/clan_operator.py: swap isinstance() for category check
Michael Orlitzky [Sat, 21 Feb 2026 14:14:59 +0000 (09:14 -0500)]
mjo/clan/clan_operator.py: swap isinstance() for category check

Amazingly, this also fails, still ONLY while doctesting.

2 months agomjo/clan/clan.py: add a category for Clans
Michael Orlitzky [Sat, 21 Feb 2026 14:11:42 +0000 (09:11 -0500)]
mjo/clan/clan.py: add a category for Clans

2 months agomjo/clan/clan.py: Vinberg cone automorphisms (WIP)
Michael Orlitzky [Fri, 20 Feb 2026 20:33:55 +0000 (15:33 -0500)]
mjo/clan/clan.py: Vinberg cone automorphisms (WIP)

This proof-of-concept is mostly working, but the tests are crashing
for some reason.

2 months agomjo/clan/clan_operator.py: fix copy/pasted docstring
Michael Orlitzky [Fri, 20 Feb 2026 20:00:23 +0000 (15:00 -0500)]
mjo/clan/clan_operator.py: fix copy/pasted docstring

2 months agomjo/clan/clan_operator.py: prefer "C" for clan variables
Michael Orlitzky [Fri, 20 Feb 2026 20:00:04 +0000 (15:00 -0500)]
mjo/clan/clan_operator.py: prefer "C" for clan variables

2 months agomjo/clan/clan_operator.py: implement composition and related methods
Michael Orlitzky [Fri, 20 Feb 2026 19:08:26 +0000 (14:08 -0500)]
mjo/clan/clan_operator.py: implement composition and related methods

2 months agomjo/clan: refactor the type hierarchy
Michael Orlitzky [Tue, 17 Feb 2026 02:51:59 +0000 (21:51 -0500)]
mjo/clan: refactor the type hierarchy

Put the clan stuff in a top-level Clan class, and make UnitalClan a
wrapper around that. This complicates everything a bit, but makes me
feel better.

2 months agomjo/clan/clan_element.py: add the Vinberg inner product
Michael Orlitzky [Tue, 17 Feb 2026 02:37:11 +0000 (21:37 -0500)]
mjo/clan/clan_element.py: add the Vinberg inner product

2 months agomjo/clan/clan_operator.py: public matrix() method
Michael Orlitzky [Tue, 17 Feb 2026 02:03:12 +0000 (21:03 -0500)]
mjo/clan/clan_operator.py: public matrix() method

This will be useful for the Vinberg inner product.

2 months agomjo/clan/unital_clan.py: add hand computations for the Vinberg clan
Michael Orlitzky [Mon, 16 Feb 2026 23:36:24 +0000 (18:36 -0500)]
mjo/clan/unital_clan.py: add hand computations for the Vinberg clan

2 months agomjo/clan: start implementing clan operators
Michael Orlitzky [Mon, 16 Feb 2026 14:17:50 +0000 (09:17 -0500)]
mjo/clan: start implementing clan operators

This is a moral prerequisite for the Vinberg inner product.

2 months agomjo/clan/clan_element.py: composite det example for the Vinberg clan
Michael Orlitzky [Sun, 15 Feb 2026 16:50:39 +0000 (11:50 -0500)]
mjo/clan/clan_element.py: composite det example for the Vinberg clan

2 months agomjo/clan/unital_clan.py: fix VinbergClan element classes
Michael Orlitzky [Sun, 15 Feb 2026 16:42:40 +0000 (11:42 -0500)]
mjo/clan/unital_clan.py: fix VinbergClan element classes

When building elements from lists/matrices, be sure to construct
them in the clan and not just in the underlying vector space.

2 months agomjo/clan/unital_clan.py: add convenience constructors for Vinberg clans
Michael Orlitzky [Sun, 15 Feb 2026 16:33:43 +0000 (11:33 -0500)]
mjo/clan/unital_clan.py: add convenience constructors for Vinberg clans

Add the following methods to build an element of the Vinberg clan:

  * from_matrices
  * from_list
  * from_lists

2 months agomjo/clan/unital_clan.py: factor out (un)lift for the Vinberg clan
Michael Orlitzky [Sun, 15 Feb 2026 15:29:40 +0000 (10:29 -0500)]
mjo/clan/unital_clan.py: factor out (un)lift for the Vinberg clan

2 months agomjo/clan/unital_clan.py: VinbergClan inits and passes tests
Michael Orlitzky [Sun, 15 Feb 2026 02:42:04 +0000 (21:42 -0500)]
mjo/clan/unital_clan.py: VinbergClan inits and passes tests

2 months agomjo/clan/unital_clan.py: begin sorting out the Vinberg clan init
Michael Orlitzky [Sat, 14 Feb 2026 20:17:54 +0000 (15:17 -0500)]
mjo/clan/unital_clan.py: begin sorting out the Vinberg clan init

2 months agomjo/cone/decomposition.py: delete reducibility stuff
Michael Orlitzky [Sat, 14 Feb 2026 18:31:07 +0000 (13:31 -0500)]
mjo/cone/decomposition.py: delete reducibility stuff

This will go upstream soon, and is only slowing the tests down.

2 months agomjo/clan/unital_clan.py: start working on the Vinberg clan
Michael Orlitzky [Sat, 14 Feb 2026 18:27:44 +0000 (13:27 -0500)]
mjo/clan/unital_clan.py: start working on the Vinberg clan

Just sketch the constructor. Nothing works, but I don't want to forget
about it.

2 months agomjo/cone/decomposition.py: add more nonlineal_part() tests
Michael Orlitzky [Mon, 9 Feb 2026 01:03:25 +0000 (20:03 -0500)]
mjo/cone/decomposition.py: add more nonlineal_part() tests

2 months agomjo/cone/decomposition.py: pointed/linspace -> nonlineal_part
Michael Orlitzky [Mon, 9 Feb 2026 00:42:41 +0000 (19:42 -0500)]
mjo/cone/decomposition.py: pointed/linspace -> nonlineal_part

Rework the pointed_linspace_decomposition() as nonlineal_part(),
returning only the pointed component. The lineality space is easy to
obtain, even as a cone, though generally that will be overkill.

We drop _orthogonalize() for now, since it appears that Sage/PPL
will implicitly orthogonalize the cone's lines().

2 months agomjo/cone/decomposition.py: add orthogonalization example over ZZ
Michael Orlitzky [Thu, 5 Feb 2026 23:44:23 +0000 (18:44 -0500)]
mjo/cone/decomposition.py: add orthogonalization example over ZZ

3 months agomjo/cone/decomposition.py: remove that NOTE
Michael Orlitzky [Tue, 3 Feb 2026 00:20:18 +0000 (19:20 -0500)]
mjo/cone/decomposition.py: remove that NOTE

I found an example where PPL does not remove the lineal components of
the remaining generators. It is now included as a doctest.

3 months agomjo/cone/decomposition.py: add a NOTE
Michael Orlitzky [Mon, 2 Feb 2026 21:20:18 +0000 (16:20 -0500)]
mjo/cone/decomposition.py: add a NOTE

I'm becoming more and more convinced that PPL will do the
lineality-space decomposition on its own.

3 months agomjo/cone/decomposition.py: new pointed-linspace decomposition
Michael Orlitzky [Sun, 1 Feb 2026 18:55:15 +0000 (13:55 -0500)]
mjo/cone/decomposition.py: new pointed-linspace decomposition

Begin a new experiment with the pointed-linspace decomposition. We
know how to do this with orthogonal projections, but in Sage we must
work over the rationals (and arithmetic is much faster there anyway).
I sketched a quick proof of concept showing that this can be done, and
it's very likely that PPL does exactly the same thing when it
minimizes the generators in Cone().

But just in case, here's an implementation that definitely does what I
think it does.

3 months agomjo/cone/decomposition.py: fix the vertices in irreducible_factors()
Michael Orlitzky [Sun, 1 Feb 2026 18:10:19 +0000 (13:10 -0500)]
mjo/cone/decomposition.py: fix the vertices in irreducible_factors()

This bug is fixed in the upstream SageMath branch (with additional
tests), but let's fix it here too until it hits "develop".

3 months agomjo/clan: factor out up_hat, down_hat, etc. for matrix clans
Michael Orlitzky [Mon, 26 Jan 2026 02:35:59 +0000 (21:35 -0500)]
mjo/clan: factor out up_hat, down_hat, etc. for matrix clans

3 months agomjo/clan: move matrix-clan methods to an intermediate class
Michael Orlitzky [Sat, 24 Jan 2026 16:16:27 +0000 (11:16 -0500)]
mjo/clan: move matrix-clan methods to an intermediate class

3 months agomjo/matrix_algebra.py: alllow from_list() to take one long list
Michael Orlitzky [Sat, 24 Jan 2026 16:10:43 +0000 (11:10 -0500)]
mjo/matrix_algebra.py: alllow from_list() to take one long list

This makes its behavior more consistent with that of MatrixSpace.

3 months agomjo/matrix_algebra.py: whitespace
Michael Orlitzky [Sat, 24 Jan 2026 16:10:34 +0000 (11:10 -0500)]
mjo/matrix_algebra.py: whitespace

3 months agomjo/clan: move one() into the NormalDecomposition class
Michael Orlitzky [Sat, 24 Jan 2026 15:09:11 +0000 (10:09 -0500)]
mjo/clan: move one() into the NormalDecomposition class

We know this in terms of the idempotents, whatever they are.

3 months agomjo/clan: initial implementation of the Hermitian complex matrix clan
Michael Orlitzky [Sat, 24 Jan 2026 02:39:13 +0000 (21:39 -0500)]
mjo/clan: initial implementation of the Hermitian complex matrix clan

3 months agomjo/clan: new diag() method for elements, everything now index-agnostic
Michael Orlitzky [Sat, 24 Jan 2026 02:15:57 +0000 (21:15 -0500)]
mjo/clan: new diag() method for elements, everything now index-agnostic

With idempotent() and diag() helpers, the element code now does not
need to know what the indexing scheme is.

3 months agomjo/clan: add idempotent() method for normal decompositions
Michael Orlitzky [Sat, 24 Jan 2026 02:14:38 +0000 (21:14 -0500)]
mjo/clan: add idempotent() method for normal decompositions

Just a helper to get the idempotent (diagonal) elements without
having to care what the basis indices are.

3 months agomjo/hurwitz.py: add matrix transpose() method
Michael Orlitzky [Sat, 24 Jan 2026 01:14:42 +0000 (20:14 -0500)]
mjo/hurwitz.py: add matrix transpose() method

Sometimes you just need to transpose a complex matrix, you know?

3 months agomjo/matrix_algebra.py: support the original __getitem__ syntax
Michael Orlitzky [Sat, 24 Jan 2026 01:11:39 +0000 (20:11 -0500)]
mjo/matrix_algebra.py: support the original __getitem__ syntax

To support submodules, we need __getitem__() to support its original
behavior of returning coordinates when given all three indices.

3 months agomjo/clan: complete the migration to three coordinates
Michael Orlitzky [Fri, 23 Jan 2026 16:50:23 +0000 (11:50 -0500)]
mjo/clan: complete the migration to three coordinates

Three coordinates are needed to identify a basis element in general:
(i,j) to identify the component, and then "k" for the basis within
the (i,j)th component.

This should allow us to define HnClan, which has 2d off-diagonal
components.

3 months agomjo/clan: WIP conversion to three coordinates
Michael Orlitzky [Fri, 23 Jan 2026 14:02:25 +0000 (09:02 -0500)]
mjo/clan: WIP conversion to three coordinates

3 months agomjo/clan/unital_clan.py: remove unused local variable
Michael Orlitzky [Fri, 23 Jan 2026 13:03:54 +0000 (08:03 -0500)]
mjo/clan/unital_clan.py: remove unused local variable

3 months agomjo/clan: add x.D(k) and x.chi(k) methods
Michael Orlitzky [Sat, 17 Jan 2026 01:58:44 +0000 (20:58 -0500)]
mjo/clan: add x.D(k) and x.chi(k) methods

These are the homogeneous polynomials and diagonals-squared of the
triangular factorization of x, as in the Ishi / Gindikin papers.

3 months agomjo/clan: factor out NormalDecomposition to its own class
Michael Orlitzky [Fri, 16 Jan 2026 13:18:39 +0000 (08:18 -0500)]
mjo/clan: factor out NormalDecomposition to its own class

Some methods require knowledge of the normal decomposition
coordinates.

3 months agomjo/clan: get inner products working; implement one() for SnClan
Michael Orlitzky [Thu, 15 Jan 2026 03:07:38 +0000 (22:07 -0500)]
mjo/clan: get inner products working; implement one() for SnClan

3 months agomjo/clan: begin implementing the clan on S^n
Michael Orlitzky [Thu, 15 Jan 2026 01:40:18 +0000 (20:40 -0500)]
mjo/clan: begin implementing the clan on S^n

4 months agoclan: eliminate the user basis stuff from the new clan module
Michael Orlitzky [Sat, 3 Jan 2026 00:51:12 +0000 (19:51 -0500)]
clan: eliminate the user basis stuff from the new clan module

I think we'll be able to get away with just using the "real" basis
elements as keys to the CFM. This makes it easy to reconstruct the
"user" coordinates from CFM elements.

4 months agomjo: move eja.eja_utils to mjo.misc
Michael Orlitzky [Fri, 2 Jan 2026 17:29:30 +0000 (12:29 -0500)]
mjo: move eja.eja_utils to mjo.misc

These functions are useful outside of Euclidean Jordan algebras.
It's looking in particular like the _all2list() gimmick may be
a useful general construct for algebras with a user basis.

4 months agomjo/clan/unital_clan.py: begin clan implementation
Michael Orlitzky [Fri, 2 Jan 2026 16:39:30 +0000 (11:39 -0500)]
mjo/clan/unital_clan.py: begin clan implementation

5 months agomjo/cone/decomposition.py: rearrangement examples for is_reducible()
Michael Orlitzky [Sun, 30 Nov 2025 21:59:49 +0000 (16:59 -0500)]
mjo/cone/decomposition.py: rearrangement examples for is_reducible()

5 months agomjo/cone/decomposition.py: handle trivial cones correctly
Michael Orlitzky [Fri, 14 Nov 2025 01:21:10 +0000 (20:21 -0500)]
mjo/cone/decomposition.py: handle trivial cones correctly

5 months agomjo/cone/decomposition.py: add new is_reducible() function
Michael Orlitzky [Wed, 12 Nov 2025 00:51:51 +0000 (19:51 -0500)]
mjo/cone/decomposition.py: add new is_reducible() function

5 months agomjo/cone/decomposition.py: add missing colon
Michael Orlitzky [Wed, 12 Nov 2025 00:51:42 +0000 (19:51 -0500)]
mjo/cone/decomposition.py: add missing colon

5 months agomjo/cone/decomposition.py: add tests, fix the edges of the edges
Michael Orlitzky [Tue, 11 Nov 2025 23:46:20 +0000 (18:46 -0500)]
mjo/cone/decomposition.py: add tests, fix the edges of the edges

A miscellaneous selection:

  * The vertex numbering was off because pivots() renumbers them.
  * Updated the docs to fix some incorrect claims.
  * Added lots of new tests.
  * Special case for irreducible cones to return K itself.
  * Use subspace_with_basis() instead of span() to preserve
    our user basis.

Tests now pass, and the documentation is converging upon the truth.