This package allows for the calculation of both the Hermite and Smith normal forms, which are commonly used throughout crystallography.
Packages to calculate the Smith and Hermite normal forms already exist, but this package provides
several advantages. First, it integrates into pre-existing infrastructure provided by the
LinearAlgebra
standard library by exporting the RowHermite
, ColumnHermite
, and Smith
types,
which are subtypes of LinearAlgebra.Factorization
. Second, effort has been made to thoroughly
comment the code so the algorithms can be easily understood. Third, the code is integrated with
StaticArrays.jl, and methods are available for SMatrix
, which cannot be mutated in-place.
This package is written to be compatible with the latest LTS (Julia 1.6.7 as of the most recent commit).
NormalForms.jl is now in the Julia package registry! To install, just use the package manager:
(@v1.6+) pkg> add NormalForms
Alternatively:
julia> import Pkg
Pkg.add("NormalForms")
You can also add the repo URL, with an optional specifier for the branch you want to track. By
default, it tracks main
. release
matches the package state in the General repo.
(@v1.6+) pkg> add https://github.com/brainandforce/NormalForms.jl#branchname
Alternatively:
julia> import Pkg
Pkg.add("https://github.com/brainandforce/NormalForms.jl", rev="branchname")
This package is not in a finished state. The primary block to this is that some matrices cannot be placed in Hermite or Smith normal form because the unimodular factors fail to be unimodular. As of now, it's unclear what causes this to happen, but the solution may come in more extensive testing.
- HermiteNormalForm.jl (This package adapts some code from here)
- SmithNormalForm.jl (Not available in the General package repository)
For those interested in the Hermite and Smith normal forms in the context of abstract algebra: