This release is a pre-release and may not be stable for production use.
galaga_matrix
Matrix representations for galaga Clifford algebras.
Status: published to PyPI alongside galaga. Released as part of the monorepo.
For the Galaga 2 beta, opt into prereleases:
python -m pip install --pre "galaga-matrix>=2.0.0b1,<3"
What it does
Every multivector in a Clifford algebra can be represented as a matrix. This
package provides to_matrix / from_matrix conversions, spinor-column
conversions for supported even subalgebras, quaternion-block output for
selected quaternionic signatures, and a MatrixRepr wrapper with LaTeX
rendering for use in marimo notebooks and Jupyter.
The canonical spinor-column API is to_spinor_column / from_spinor_column.
to_spinor_matrix / from_spinor_matrix are compatibility aliases.
Two modes
| Mode | Matrix size | Entries | Works for | Roundtrips |
|---|---|---|---|---|
left-regular |
2ⁿ × 2ⁿ | real | any symmetric Gram matrix | always |
compact |
2^⌊n/2⌋ × 2^⌊n/2⌋ | complex | numerically suitable nondegenerate Gram matrices | only when the selected representation is injective |
Quick start
from galaga import Algebra
from galaga_matrix import to_matrix, from_matrix, MatrixRepr
# Pauli matrices from Cl(3,0)
cl3 = Algebra(3)
e1, e2, e3 = cl3.basis_vectors()
mat = to_matrix(e1, mode="compact") # returns MatrixRepr (2×2 Pauli σ₁)
mat @ mat # MatrixRepr: σ₁² = I
mat.inv() # MatrixRepr: σ₁⁻¹ = σ₁
mat.trace() # 0 (traceless)
mat.mv # back to Multivector
# Named, tracked MV gets automatic ρ(name) symbolic name
e1, e2, e3 = cl3.basis_vectors(expr=True)
R = (e1 * e2).named("B", latex=r"\hat{B}")
M = to_matrix(R, mode="compact")
M.latex() # "\\rho(\\hat{B}) = \\begin{pmatrix}..."
M.expr.latex() # "\\rho(\\hat{B})"
M.symbolic_name.latex # "\\rho(\\hat{B})"
# from_matrix can infer algebra and mode from MatrixRepr
from_matrix(M) # MV named ρ⁻¹(ρ(B̂))
from_matrix(cl3, M.mat, mode="compact") # unnamed MV (raw array)
# Dirac matrices from Cl(1,3)
sta = Algebra(1, 3)
g0 = sta.basis_vectors()[0]
to_matrix(g0, mode="compact") # 4×4 Dirac γ⁰
# Left-regular works for everything, including PGA
pga = Algebra(2, 0, 1)
v = pga.basis_vectors()[0]
to_matrix(v) # 8×8 real matrix
# It also works directly in a nonorthogonal basis
oblique = Algebra(gram=[[2.0, 0.5], [0.5, -1.0]])
x = oblique.multivector([1.0, 2.0, 3.0, 4.0])
from_matrix(to_matrix(x)) # exact coefficient roundtrip in the native basis
# Automatic mode stays left-regular for compatibility; compact is explicit
compact_x = to_matrix(x, mode="compact") # 2×2 instead of 4×4
from_matrix(compact_x) # native exterior-basis coefficients are preserved
Executable examples
The repository includes a short Marimo series using the Galaga 2 facade:
- representations and round-trips;
- compact matrices in an oblique basis;
- a basis-independent compact workflow;
- CGA from its native-null Gram matrix;
- CGA objects in complex and quaternion form;
- Pauli and Dirac matrices; and
- spinor columns.
The CGA comparison notebook covers vectors, lifted points, point pairs, lines,
circles, spheres, planes, and rotors. It shows their 4×4 compact complex
matrices and an expandable 32×32 real left-regular view. Its quaternion
examples explicitly map even CGA into the existing Cl(1,3) quaternion mode;
native CGA quaternion conversion is still planned. A mixed rotor-plus-point
example teaches the pair Q(E), Q(B) in A = E + B J, with a computed central
pseudoscalar J satisfying J² = -1. This pair is a notebook construction,
not an additional public representation mode.
Each notebook is compiled, dependency-checked, and executed headlessly by the example test ledger.
MatrixRepr
MatrixRepr is a transparent numpy proxy that wraps a matrix with:
- All arithmetic operations —
@,+,-,*,/,**returnMatrixRepr - Linear algebra —
.T,.H,.conj(),.trace(),.det(),.inv() - Numpy interop —
np.add(M, N),np.conj(M)etc. returnMatrixReprvia__array_ufunc__ - Symbolic naming —
.name()assigns an immutable, target-awaresymbolic_name - Immutable provenance —
.exprrecords frozen matrix-domain operations;.as_expression()exposes an operand - Metadata propagation —
algebra,mode,domain,basis, andkindpass through operations - Indexing —
M[i,j]for elements,M[0:2, 0:2]for submatrices - Rendering —
.latex(),._repr_latex_()for notebooks - Escape hatch —
.matgives the raw numpy array - Roundtrip —
.mvconverts back to aMultivector(requiresalgebra=) - Factories —
MatrixRepr.identity(k),MatrixRepr.zeros((m,n)),.kron(other)
Auto-naming
to_matrix(named_mv) names the result as ρ(name) and gives it a symbolic
representation-map expression. from_matrix(named_matrix) can infer the
algebra and mode from MatrixRepr and names the recovered MV as
ρ⁻¹(name-or-expression). Raw arrays still need
from_matrix(alg, array, mode=...). Unnamed inputs pass through without new
names. Quaternion-block mode uses ρ_{\mathbb{H}}(name).
Expression ownership
galaga_matrix.expr owns matrix multiplication, transpose, adjoint, inverse,
basis-change, Kronecker-product, representation-map, and spinor-column nodes.
They are frozen and their matrix leaves hold read-only NumPy snapshots.
Representation-map provenance records the source coefficient domain:
"full" for ordinary matrix conversion and "even" for spinor columns.
Galaga's public expression tree remains a geometric-algebra operation tree.
When a facade value carries provenance, conversion wraps it in a matrix adapter
with the active presentation. Rendering continues to honor context-local
presentation overrides on the facade algebra. galaga_matrix does not import
galaga.symbolic_core or inspect private multivector fields. This keeps the
optional package independent without losing evaluable provenance.
Works in galaga_marimo t-strings (Python 3.14+, with that optional package
installed; continuing the quick start above):
import galaga_marimo as gm
gm.md(t"""
The Pauli matrix: {to_matrix(e1, mode="compact"):block}
""")
Named special cases
The compact representation produces the standard textbook matrices:
- Cl(3,0): 2×2 Pauli matrices (σ₁, σ₂, σ₃)
- Cl(0,3): 2×2 with iσ₁, iσ₂, iσ₃
- Cl(1,3): 4×4 Dirac matrices (γ⁰, γ¹, γ², γ³) in the Dirac representation
- Cl(3,1): 4×4 Dirac matrices in the mostly-plus convention
All other nondegenerate signatures are handled by the general periodicity
recursion. For a nonnormalized or nonorthogonal native basis, compact derives
a metric congruence and lifts it to exterior blades. The named pauli,
dirac, and quaternion modes remain restricted to their normalized
orthogonal conventions.
Limitations
- Degenerate algebras (r > 0): only
left-regularmode works.compactraisesNotImplementedError. - General Gram automatic dispatch:
left-regularworks in the stored basis and remains the automatic choice for nonorthogonal and nonnormalized metrics. Requestmode="compact"explicitly to use the congruence-based representation. - Generic compact convention: eigendecomposition determines an equivalent compact basis for a dense Gram matrix. Algebraic behavior is stable, but individual entries are not a named textbook convention and should not be pinned across numerical-library changes.
- Numerical recovery: full rank establishes injectivity, not a uniform coefficient-accuracy guarantee. Extreme metric scaling separates blade magnitudes across grades; column-normalizing the inverse solve cannot undo information lost when those contributions were added in floating point. Rescale units where practical, or use the native left-regular representation when coefficient recovery is the priority.
- Double algebras (Cl(p,q) where (q−p) mod 8 ∈ {3, 7}):
to_matrixcompact works, butfrom_matrixcompact raises if the selected compact representation is not injective. Useleft-regularfor exact inverse conversion. See Double Clifford Algebras. - Quaternion output:
to_quaternion_matrixand quaternion spinor conversions use explicit quaternion-block bases. They currently support Cl(0,2) and Cl(1,3), and reject double algebras such as Cl(0,3). - Spinor roundtrip: spinor-column conversions retain their normalized
orthogonal native-basis requirement and are rank-checked for the actual
reference-column map. Signatures whose even subalgebra is not injective under
that map raise
TypeError. - Bounded plan cache: repeated conversions reuse immutable generator, blade, rank, and reconstruction-system data. The cache key uses numeric algebra identity plus the mode, source domain, basis convention, and dtype; presentation state and multivector values never enter it.
Architecture decisions
See the matrix ADR index.
For the mathematical relationship between primitive idempotents, reciprocal frames, and compact real, complex, or quaternionic matrix representations, see Spectral-Sandwich Matrix Representations.
For an interactive lesson connecting ideals, columns, even representatives, reflections and real-GA chiral projections with Dirac/Weyl spinor roundtrips, see One spinor, three representations.
For the proposed faithful 4×4 complex representation of native-null 3D CGA,
its Vahlen/Möbius block interpretation, and the 2×2 quaternion
representation of the even conformal algebra, see
Native-Null CGA Matrix Representations.
Tests
PYTHONPATH=.:packages/galaga_matrix uv run pytest packages/galaga_matrix/tests/
Metadata
Release files for galaga-matrix 2.0.0b1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| galaga_matrix-2.0.0b1.tar.gz | 133.5 kB | Without provenance | Details for galaga_matrix-2.0.0b1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| galaga_matrix-2.0.0b1-py3-none-any.whl | Python 3 | none | any | Details for galaga_matrix-2.0.0b1-py3-none-any.whl |
Total release size: 166.8 kB
Release files / galaga_matrix-2.0.0b1.tar.gz
| Download URL | galaga_matrix-2.0.0b1.tar.gz |
|---|---|
| Size | 133.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7d92e15fae61d8fb57a1dab5b6732a0dbfecd42d78a02aa7193a85441fa3c48f
|
|
BLAKE2b-256 checksum How to use checksums |
9c45f2f2c2ca2860263491d9034c49674c3f9dc7b05228e127fb9ad597ca5e1b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / galaga_matrix-2.0.0b1-py3-none-any.whl
| Download URL | galaga_matrix-2.0.0b1-py3-none-any.whl |
|---|---|
| Size | 33.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e388d78a6b024677638646183081bf1421de086fa9bec8846a60c2acbf7d3b85
|
|
BLAKE2b-256 checksum How to use checksums |
03ecc1d5ea008115c81f0bf994b49c1c80e00dec3c004c9291ba1fd73af46462
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for galaga-matrix 2.0.0b1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.