{"id":13741900,"url":"https://github.com/pygae/galgebra","last_synced_at":"2026-04-04T15:01:06.458Z","repository":{"id":44864620,"uuid":"113447311","full_name":"pygae/galgebra","owner":"pygae","description":"Symbolic Geometric Algebra/Calculus package for SymPy :crystal_ball:","archived":false,"fork":false,"pushed_at":"2026-04-04T13:47:30.000Z","size":56333,"stargazers_count":277,"open_issues_count":64,"forks_count":73,"subscribers_count":15,"default_branch":"master","last_synced_at":"2026-04-04T14:39:18.031Z","etag":null,"topics":["clifford-algebras","geometric-algebra","physics","python","quaternions","symbolic"],"latest_commit_sha":null,"homepage":"https://galgebra.rtfd.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pygae.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.md","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":".zenodo.json","notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-12-07T12:18:29.000Z","updated_at":"2026-04-04T13:47:36.000Z","dependencies_parsed_at":"2024-03-30T09:26:02.923Z","dependency_job_id":"183266fc-c810-4fcb-9a99-53bf78931b5c","html_url":"https://github.com/pygae/galgebra","commit_stats":{"total_commits":748,"total_committers":10,"mean_commits":74.8,"dds":0.4331550802139037,"last_synced_commit":"644a32a70928346e36ce5d17bd18afe75232c971"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/pygae/galgebra","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pygae%2Fgalgebra","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pygae%2Fgalgebra/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pygae%2Fgalgebra/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pygae%2Fgalgebra/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pygae","download_url":"https://codeload.github.com/pygae/galgebra/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pygae%2Fgalgebra/sbom","scorecard":{"id":751412,"data":{"date":"2025-08-11","repo":{"name":"github.com/pygae/galgebra","commit":"8f661e31b27c453dc86ec6e56310e2ba5705e156"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.3,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 1/15 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/pygae/galgebra/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/pygae/galgebra/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/pygae/galgebra/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/pygae/galgebra/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/pygae/galgebra/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:83: update your workflow using https://app.stepsecurity.io/secureworkflow/pygae/galgebra/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:86: update your workflow using https://app.stepsecurity.io/secureworkflow/pygae/galgebra/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:109: update your workflow using https://app.stepsecurity.io/secureworkflow/pygae/galgebra/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:111: update your workflow using https://app.stepsecurity.io/secureworkflow/pygae/galgebra/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:121: update your workflow using https://app.stepsecurity.io/secureworkflow/pygae/galgebra/ci.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:38","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:39","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:116","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   3 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/ci.yml:92"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Vulnerabilities","score":0,"reason":"18 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-29gw-9793-fvw7","Warn: Project is vulnerable to: PYSEC-2015-24 / GHSA-4vwq-x64q-j4cj","Warn: Project is vulnerable to: PYSEC-2017-46 / GHSA-66gw-5xpf-gfp5","Warn: Project is vulnerable to: PYSEC-2015-25 / GHSA-92mr-v722-f48m","Warn: Project is vulnerable to: PYSEC-2022-12 / GHSA-pq7m-3gw7-gq5x","Warn: Project is vulnerable to: PYSEC-2017-47","Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: PYSEC-2019-156 / GHSA-xp76-357g-9wqq","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114","Warn: Project is vulnerable to: PYSEC-2022-43017 / GHSA-qwmp-2cf2-g9g6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":1,"reason":"SAST tool is not run on all commits -- score normalized to 1","details":["Warn: 4 commits out of 28 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T20:29:43.053Z","repository_id":44864620,"created_at":"2025-08-22T20:29:43.054Z","updated_at":"2025-08-22T20:29:43.054Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31403952,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clifford-algebras","geometric-algebra","physics","python","quaternions","symbolic"],"created_at":"2024-08-03T04:01:03.848Z","updated_at":"2026-04-04T15:01:06.450Z","avatar_url":"https://github.com/pygae.png","language":"Python","funding_links":[],"categories":["Uncategorized","Python"],"sub_categories":["Uncategorized"],"readme":"GAlgebra\n=========================================\n\nSymbolic Geometric Algebra/Calculus package for SymPy.\n\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/pygae/galgebra)\n[![PyPI](https://img.shields.io/pypi/v/galgebra.svg)](https://pypi.org/project/galgebra/)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/galgebra.svg)](https://pypi.org/project/galgebra/)\n[![Python CI](https://github.com/pygae/galgebra/actions/workflows/ci.yml/badge.svg)](https://github.com/pygae/galgebra/actions/workflows/ci.yml)\n[![Documentation Status](https://readthedocs.org/projects/galgebra/badge/?version=latest)](https://galgebra.readthedocs.io/en/latest/?badge=latest)\n[![DOI](https://zenodo.org/badge/113447311.svg)](https://zenodo.org/badge/latestdoi/113447311)\n\n![](https://raw.githubusercontent.com/pygae/galgebra/master/doc/images/n_vector_positive_spherical.svg?sanitize=true)\n\nDevelopment Status\n--------------------\n\n![PyPI - Status](https://img.shields.io/pypi/status/galgebra.svg)\n![GitHub contributors](https://img.shields.io/github/contributors/pygae/galgebra.svg)\n[![Codecov](https://img.shields.io/codecov/c/github/pygae/galgebra.svg)](https://codecov.io/gh/pygae/galgebra)\n[![Maintainability](https://api.codeclimate.com/v1/badges/26d1c1b351d32d2b1097/maintainability)](https://codeclimate.com/github/pygae/galgebra/maintainability)\n\n[brombo/galgebra](https://github.com/brombo/galgebra) was originally written by Alan Bromborsky, but was no longer actively maintained, and as of 2019-11-25 no longer exists.\n\n[pygae/galgebra](https://github.com/pygae/galgebra) is a community fork, maintained by [Pythonic Geometric Algebra Enthusiasts](https://github.com/pygae).\n\nThe fork supports Python 3, increases test coverage, sets up CI and linters, maintains releases to [PyPI](https://pypi.org/project/galgebra/#history), improves [docs](http://galgebra.readthedocs.io) and has many bug fixes, see [Changelog](https://galgebra.readthedocs.io/en/latest/changelog.html).\n\nFor information on how GAlgebra is used in other projects, see [Used by](https://github.com/pygae/galgebra/blob/master/doc/used_by.md).\n\n\u003e [!IMPORTANT] \n\u003e Readers of Prof. Alan Macdonald's [Linear and Geometric Algebra](http://www.faculty.luther.edu/~macdonal/laga/index.html) and [Vector and Geometric Calculus](http://www.faculty.luther.edu/~macdonal/vagc/index.html), please check out [**Migrating guide for readers of LAGA\u0026VAGC**](#migrating-guide-for-readers-of-lagavagc) below.\n\u003e \n\u003e If you are coming from [sympy.galgebra](https://docs.sympy.org/0.7.6.1/modules/galgebra/) or [brombo/galgebra](https://github.com/brombo/galgebra) (unlikely nowadays), please check out section the old [Migration Guide](https://github.com/pygae/galgebra/blob/master/doc/old_migration_guide.md).\n\nFeatures\n--------------------\n\n### Geometric Algebra\n\n- Arbitrary Vector Basis and Metric\n- Scalar, Vector, Bivector, Multivector, Pseudoscalar, Spinor, Blade\n- Basic Geometric Algebra Operations\n  - Sum, Difference\n  - Geometric Product\n  - Outer and Inner Products\n  - Left and Right Contractions\n  - Reverse, Dual, Undual, Grade Involution, Clifford Conjugation\n  - Commutator\n  - Projection, Reflection, Rotation\n  - Reciprocal Frames\n- Multivector Functions\n  - Exponential, Inverse, Norm, Magnitude\n  - Scalar Product, Quadratic Form\n  - Grade Selection, Even/Odd Parts\n  - Blade Coefficients, Components\n- Inspecting Base/Blade Representation\n- Symbolic Manipulations\n  - `expand`, `factor`, `simplify`, `subs`, `trigsimp` etc.\n\n#### Overloaded Python operators for GA operations\n\n| Operation | Python | Description |\n|-----------|--------|-------------|\n| `A + B` | `A + B` | Sum |\n| `A - B` | `A - B` | Difference |\n| `AB` | `A * B` | Geometric product |\n| `A ^ B` | `A ^ B` | Outer (wedge) product |\n| `A . B` | `A \\| B` | Inner (dot) product |\n| `A ⌋ B` | `A \u003c B` | Left contraction |\n| `A ⌊ B` | `A \u003e B` | Right contraction |\n| `A / B` | `A / B` | Division (A times B inverse) |\n| `s / A` | `s / A` | Scalar divided by multivector |\n| `~A` | `~A` | Reverse |\n| `abs(A)` | `abs(A)` | Norm |\n| `A[k]` | `A[k]` | Grade-k part |\n\n#### Multivector methods and functions\n\n| Method | Function | Description |\n|--------|----------|-------------|\n| `A.rev()` | `rev(A)` | Reverse |\n| `A.dual()` | `dual(A)` | Dual |\n| `A.undual()` | `undual(A)` | Undual |\n| `A.g_invol()` | `g_invol(A)` | Grade involution |\n| `A.ccon()` | `ccon(A)` | Clifford conjugation |\n| `A.exp()` | `exp(A)` | Exponential |\n| `A.inv()` | `inv(A)` | Inverse |\n| `A.norm()` | `norm(A)` | Norm |\n| `A.norm2()` | `norm2(A)` | Norm squared |\n| `A.mag()` | `mag(A)` | Magnitude |\n| `A.mag2()` | `mag2(A)` | Magnitude squared |\n| `A.sp(B)` | `sp(A, B)` | Scalar product |\n| `A.qform()` | `qform(A)` | Quadratic form |\n| `A.even()` | `even(A)` | Even-grade part |\n| `A.odd()` | `odd(A)` | Odd-grade part |\n| `A.scalar()` | `scalar(A)` | Scalar (grade-0) part |\n| `A.grade(k)` | -- | Grade-k part |\n| `A.proj(blades)` | `proj(A, B)` | Projection |\n| `A.blade_coefs()` | -- | Blade coefficients |\n| `A.components()` | -- | List of single-blade components |\n| `A.get_coefs(k)` | -- | Grade-k coefficients |\n\n### Geometric Calculus\n\n- Geometric Derivative\n- Submanifolds\n- Linear Transformations\n- Differential Operators\n\nThe various derivatives of a multivector function is accomplished by multiplying the gradient operator vector with the function:\n\n```math\n\\begin{aligned}\n  \\nabla F \u0026=  \\texttt{grad*F} \\\\\n  F \\bar{\\nabla} \u0026=  \\texttt{F*rgrad} \\\\\n  \\nabla {\\wedge}F \u0026=  \\mathtt{grad \\verb!^! F} \\\\\n  F {\\wedge}\\bar{\\nabla} \u0026=  \\mathtt{F \\verb!^! rgrad} \\\\\n  \\nabla \\cdot F \u0026=  \\texttt{grad|F} \\\\\n  F \\cdot \\bar{\\nabla} \u0026=  \\texttt{F|rgrad} \\\\\n  \\nabla \\rfloor F \u0026=  \\mathtt{grad \\lt F} \\\\\n  F \\rfloor \\bar{\\nabla} \u0026=  \\mathtt{F \\lt rgrad} \\\\\n  \\nabla \\lfloor F \u0026=  \\mathtt{grad \\gt F} \\\\\n  F \\lfloor \\bar{\\nabla} \u0026= \\mathtt{F \\gt rgrad}\n\\end{aligned}\n```\n\n```math\n\\begin{aligned}\n  F \\nabla \u0026=  \\texttt{F*grad} \\\\\n  \\bar{\\nabla} F \u0026=  \\texttt{rgrad*F} \\\\\n  F {\\wedge}\\nabla \u0026=  \\mathtt{F \\verb!^! grad} \\\\\n  \\bar{\\nabla} {\\wedge}F \u0026=  \\mathtt{rgrad \\verb!^! F} \\\\\n  F \\cdot \\nabla \u0026=  \\texttt{F|grad} \\\\\n  \\bar{\\nabla}\\cdot F \u0026=  \\texttt{rgrad|F} \\\\\n  F \\rfloor \\nabla \u0026=  \\mathtt{F \\lt grad} \\\\\n  \\bar{\\nabla} \\rfloor F \u0026=  \\mathtt{rgrad \\lt F} \\\\\n  F \\lfloor \\nabla \u0026=  \\mathtt{F \\gt grad} \\\\\n  \\bar{\\nabla} \\lfloor F \u0026= \\mathtt{rgrad \\gt F}\n\\end{aligned}\n```\n\nTip: an example for getting `grad` and `rgrad` of a 3-d Euclidean geometric algebra in rectangular coordinates:\n\n```python\nfrom sympy import symbols\nfrom galgebra.ga import Ga\n\no3d = Ga('e', g=[1,1,1], coords=symbols('x,y,z',real=True))\n(grad,rgrad) = o3d.grads()\n```\n\n### Printing\n\n- Enhanced Console Printing\n- Latex Printing\n  - out-of-the-box support for Jupyter Notebook\n  - PDF generation and croping support if you have `pdflatex`/`pdfcrop` installed\n\n\u003c!-- Note: These comments are parsed by our sphinx documentation --\u003e\n\n\u003c!-- begin: getting-started --\u003e\n\nGetting Started\n---------------------\n\nAfter installing GAlgebra (see section [Installing GAlgebra](#installing-galgebra) below), in a Jupyter Notebook:\n\n```python\nfrom sympy import symbols\nfrom galgebra.ga import Ga\n\nfrom galgebra.printer import Format\nFormat(Fmode = False, Dmode = True)\n\nst4coords = (t,x,y,z) = symbols('t x y z', real=True)\nst4 = Ga('e',\n         g=[1,-1,-1,-1],\n         coords=st4coords)\n\nM = st4.mv('M','mv',f = True)\n\nM.grade(3).Fmt(3,r'\\langle \\mathbf{M} \\rangle _3')\n```\n\nYou will see:\n\n```math\n\\begin{aligned}   \\langle \\mathbf{M} \\rangle _3 =\u0026 M^{txy}  \\boldsymbol{e}_{t}\\wedge \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y} \\\\  \u0026  + M^{txz}  \\boldsymbol{e}_{t}\\wedge \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{z} \\\\  \u0026  + M^{tyz}  \\boldsymbol{e}_{t}\\wedge \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z} \\\\  \u0026  + M^{xyz}  \\boldsymbol{e}_{x}\\wedge \\boldsymbol{e}_{y}\\wedge \\boldsymbol{e}_{z}  \\end{aligned}\n```\n\nYou may also check out more examples [here](https://github.com/pygae/galgebra/blob/master/examples/).\n\nFor detailed documentation, please visit https://galgebra.readthedocs.io/ .\n\n\u003c!-- end: getting-started --\u003e\n\u003c!-- begin: installation --\u003e\n\nInstalling GAlgebra\n---------------------\n\n### Prerequisites\n\n- Works on Linux, Windows, Mac OSX\n- [Python](https://www.python.org/) \u003e= 3.10 (3.10, 3.11, 3.12 tested via CI)\n  - 0.6.0 was the last supported release for Python 3.8/3.9\n  - 0.5.0 was the last supported release for Python 3.5-3.7\n  - 0.4.x was the last supported release series for Python 2.7\n- [SymPy](https://www.sympy.org) \u003e= 1.3\n  - Only SymPy 1.12 is tested via CI, see `.github/workflows/ci.yml` for more details\n  - 0.5.0 was the last supported release for SymPy 1.7\n\n### Installing GAlgebra From PyPI (Recommended for users)\n\n```bash\npip install galgebra\n```\n\nThen you are all set!\n\n### Installing GAlgebra From Source (Recommended for developers)\n\nTo install from the latest source code of GAlgebra:\n\n```bash\ngit clone https://github.com/pygae/galgebra.git\ncd galgebra\npip install -e .\n```\n\nNote that the optional `-e` argument is used here for a developer install so modifying the source will take effect immediately without the need of reinstallation.\n\nNow you may run tests to verify the installation, run from the root of the repository:\n\n```bash\npip install pytest\npytest test\n```\n\nFurther, to run the complete test suite including the ones using [nbval](https://github.com/computationalmodelling/nbval), just run:\n\n```bash\npip install nbval\npytest --nbval examples/ipython/ --nbval examples/primer/ test --nbval-current-env --nbval-sanitize-with test/.nbval_sanitize.cfg\n```\n\nThis could take more than 10 minutes, please be patient.\n\n\u003c!-- end: installation --\u003e\n\u003c!-- begin: migration --\u003e\n\nMigration Guide\n----------------\n\n### Migrating guide for readers of LAGA\u0026VAGC\n\nReaders of [Linear and Geometric Algebra](http://www.faculty.luther.edu/~macdonal/laga/index.html) and [Vector and Geometric Calculus](http://www.faculty.luther.edu/~macdonal/vagc/index.html) might be guided by [GAlgebra Primer](http://www.faculty.luther.edu/~macdonal/GAlgebraPrimer.pdf) (version September 15, 2023, accessed April 2, 2026) to download [GAfiles.zip](http://www.faculty.luther.edu/~macdonal/GAfiles.zip) and copy `gprinter.py`, `lt.py`, `mv.py`, and `GAlgebraInit.py`¸ into where GAlgebra is installed.\n\nThese steps are NO LONGER NEEDED since GAlgebra 0.6.0 as they are merge into GAlgebra with tests, copying these files will cause conflicts and regressions of fixed bugs. Instead, you may follow the following steps:\n\n```bash\npip install galgebra\n```\n\nFor minor differences to those files, please check out [the change log for GAlgebra 0.6.0](https://galgebra.readthedocs.io/en/latest/changelog.html#0.6.0). Also please note that:\n\n- `GAlgebraInit.py` is renamed to `primer.py` and can be imported like `from galgebra.primer import *` but it's usage is discouraged, although it saves some boilerplate code, this is not part of GAlgebra's maintained API, GAlgebra might remove it in future.\n- Some notebooks from the zip are included in GAlgebra in `examples/primer`.\n\n\u003c!-- end: migration --\u003e\n\n\u003c!-- begin: bundled-resources --\u003e\n\nBundled Resources\n------------------\n\nNote that in the [doc/books](https://github.com/pygae/galgebra/blob/master/doc/books/) directory there are:\n\n- `BookGA.pdf` which is a collection of notes on Geometric Algebra and Calculus based of \"Geometric Algebra for Physicists\" by Doran and Lasenby and on some papers by Lasenby and Hestenes.\n- `galgebra.pdf` which is the original main doc of GAlgebra in PDF format, while the math part is still valid, the part describing the installation and usage of GAlgebra is outdated, please read with caution or visit https://galgebra.readthedocs.io/ instead.\n- `Macdonald` which contains bundled supplementary materials for [Linear and Geometric Algebra](http://www.faculty.luther.edu/~macdonal/laga/index.html) and [Vector and Geometric Calculus](http://www.faculty.luther.edu/~macdonal/vagc/index.html) by Alan Macdonald, see [here](https://github.com/pygae/galgebra/blob/master/doc/books/Macdonald/) and [here](https://github.com/pygae/galgebra/blob/master/examples/Macdonald/) for more information.\n  - Particularly, `GAlgebraPrimer.pdf` is an archived version of [GAlgebra Primer](http://www.faculty.luther.edu/~macdonal/GAlgebraPrimer.pdf) by Alan Macdonald, last updated on September 15, 2023.\n\n\u003c!-- end: bundled-resources --\u003e\n\nStar History\n-------------------\n\n\u003ca href=\"https://star-history.com/#pygae/galgebra\u0026Date\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=pygae/galgebra\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=pygae/galgebra\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=pygae/galgebra\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\nContributors\n-------------------\n\n\u003ca href=\"https://github.com/pygae/galgebra/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=pygae/galgebra\" /\u003e\n\u003c/a\u003e\n\nMade with [contrib.rocks](https://contrib.rocks).\n\nCiting This Library\n-------------------\n\nFor citation information, see [our `CITATION.md` file](https://github.com/pygae/galgebra/blob/master/CITATION.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpygae%2Fgalgebra","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpygae%2Fgalgebra","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpygae%2Fgalgebra/lists"}