Two-dimensional Euclidean Geometric Algebra.
This module implements the geometric algebra:
Cl(2,0)with signature:
{1,1}and basis:
e1, e2Vectors are represented as grade-1 multivectors:
v = x*e1 + y*e2The bivector:
e12 = e1 ∧ e2represents the oriented plane element and is the generator of rotations in two dimensions.
Examples
iex> v = Galixir.Algebras.Vector2.vector(3, 4)
iex> Galixir.Algebras.Vector2.len(v)
5.0
Summary
Functions
Adds two multivectors component-wise.
Computes the signed angle from vector a to vector b.
Checks whether a multivector is a blade.
Returns the mapping between blade names and storage indices.
Returns the canonical sign of a multivector.
Returns the coefficient of a basis blade.
Extracts Cartesian coordinates from a vector.
Computes the signed 2D cross product.
Returns the dimension of the algebra.
Computes the dot product of two vectors.
Computes the dual of a multivector.
Computes the geometric product of two multivectors.
Extracts the grade-g component of a multivector.
Returns the grades present in a multivector.
Computes the inner product of two multivectors.
Computes the inverse of a multivector.
Computes the Euclidean length of a vector.
Returns the maximum absolute coefficient of a multivector.
Negates a multivector.
Returns the norm of a multivector.
Normalizes a vector to unit length.
Normalizes a multivector.
Returns the scalar identity element.
Returns the unit pseudoscalar.
Reflects a vector about a line with normal n.
Applies the reverse operation to a multivector.
Rotates a vector using a rotor.
Creates a rotation rotor.
Checks whether a multivector contains only a scalar component.
Returns the scalar coefficient of a multivector.
Computes the scalar product of two multivectors.
Returns the metric signature of the algebra.
Returns the number of coefficients stored by the algebra.
Returns the squared norm of a multivector.
Subtracts two multivectors component-wise.
Returns the multiplication table for the algebra.
Formats a multivector using standard geometric algebra notation.
Computes the inverse dual operation.
Creates a 2D vector.
Computes the outer product (wedge product) of two multivectors.
Returns the zero vector.
Checks whether all coefficients of a multivector are zero.
Functions
Adds two multivectors component-wise.
Examples
iex> a = Galixir.Algebras.Vector2.new(scalar: 2)
iex> b = Galixir.Algebras.Vector2.new(scalar: 3)
iex> Galixir.Algebras.Vector2.add(a, b)
Galixir.Algebras.Vector2.new(scalar: 5)
Computes the signed angle from vector a to vector b.
Returns the angle in radians.
Checks whether a multivector is a blade.
A blade is a multivector containing components from at most one grade.
Scalars are considered blades.
Examples
iex> Galixir.Algebras.Vector2.blade?(Galixir.Algebras.Vector2.new(e1: 2))
true
iex> Galixir.Algebras.Vector2.blade?(Galixir.Algebras.Vector2.new(e12: 1))
true
iex> Galixir.Algebras.Vector2.blade?(Galixir.Algebras.Vector2.new(e1: 1, e2: 1))
true
iex> Galixir.Algebras.Vector2.blade?(Galixir.Algebras.Vector2.new(scalar: 2, e1: 2))
false
iex> Galixir.Algebras.Vector2.blade?(Galixir.Algebras.Vector2.new(e2: 2, e12: 2))
false
Returns the mapping between blade names and storage indices.
Blade coefficients are stored in a fixed-size tuple. This map translates canonical blade names into their corresponding tuple index.
Example
iex> Galixir.Algebras.Vector2.blade_indices()[:e1]
1
Returns the canonical sign of a multivector.
The canonical sign is determined by the first non-zero coefficient in storage order.
Returns:
1if the first non-zero coefficient is positive-1if the first non-zero coefficient is negative0if all coefficients are zero
Examples
iex> Elixir.Galixir.Algebras.Vector2.canonical_sign(Elixir.Galixir.Algebras.Vector2.new(e1: 2))
1
iex> Elixir.Galixir.Algebras.Vector2.canonical_sign(Elixir.Galixir.Algebras.Vector2.new(e1: -2))
-1
iex> Elixir.Galixir.Algebras.Vector2.canonical_sign(Elixir.Galixir.Algebras.Vector2.new())
0
Returns the coefficient of a basis blade.
The requested blade can be given in canonical form or as any registered blade alias. Aliases are automatically converted to the canonical blade and the appropriate sign is applied.
## Examples
iex> Elixir.Galixir.Algebras.Vector2.coefficient( ...> Elixir.Galixir.Algebras.Vector2.new(e1: 3), ...> :e1 ...> ) 3.0
Extracts Cartesian coordinates from a vector.
Returns:
{x, y}
Computes the signed 2D cross product.
In two dimensions the cross product is a scalar representing the oriented area:
a × b = (a ∧ b) / e12The sign indicates orientation.
Returns the dimension of the algebra.
This is the number of basis vectors defined by the signature.
Computes the dot product of two vectors.
Returns the scalar part of the geometric product.
Computes the dual of a multivector.
The dual maps each basis blade to its complementary blade with the appropriate orientation sign. The complement is determined by the full pseudoscalar of the algebra.
The operation is linear and applies independently to every coefficient.
Examples
iex> Galixir.Algebras.Vector2.dual(Galixir.Algebras.Vector2.new(e1: 1)) |> inspect Galixir.Algebras.Vector2.new(e2: 1.0) |> inspect
Computes the geometric product of two multivectors.
The geometric product is the fundamental multiplication operation of geometric algebra. It combines the outer product and metric-dependent inner product into a single associative operation.
The result depends on the algebra's metric signature.
Examples
iex> Galixir.Algebras.Vector2.gp(
...> Galixir.Algebras.Vector2.new(e1: 1),
...> Galixir.Algebras.Vector2.new(e1: 1)
...> )
Galixir.Algebras.Vector2.new(scalar: 1)
Extracts the grade-g component of a multivector.
All coefficients whose basis blades are not of grade g are set to zero.
Raises ArgumentError if g is outside the range 0..dimension().
Examples
iex> Galixir.Algebras.Vector2.grade(
...> Galixir.Algebras.Vector2.new(scalar: 1, e1: 2),
...> 1
...> )
Galixir.Algebras.Vector2.new(e1: 2)
iex> Galixir.Algebras.Vector2.grade(
...> Galixir.Algebras.Vector2.new(scalar: 1, e1: 2),
...> 0
...> )
Galixir.Algebras.Vector2.new(scalar: 1)
Returns the grades present in a multivector.
The returned list contains every grade with at least one non-zero coefficient, ordered from lowest to highest.
Examples
iex> Galixir.Algebras.Vector2.grades(
...> Galixir.Algebras.Vector2.new(scalar: 1)
...> )
[0]
iex> Galixir.Algebras.Vector2.grades(
...> Galixir.Algebras.Vector2.new(e1: 2)
...> )
[1]
iex> Galixir.Algebras.Vector2.grades(
...> Galixir.Algebras.Vector2.new(scalar: 1, e1: 2)
...> )
[0, 1]
iex> Galixir.Algebras.Vector2.grades(
...> Galixir.Algebras.Vector2.new()
...> )
[]
Computes the inner product of two multivectors.
The inner product retains only those terms of the geometric product whose grade is the absolute difference of the operand grades.
For homogeneous blades A and B:
grade(inner(A, B)) = |grade(A) - grade(B)|The exact result depends on the metric signature of the algebra.
Examples
iex> Galixir.Algebras.Vector2.inner(
...> Galixir.Algebras.Vector2.new(e1: 2),
...> Galixir.Algebras.Vector2.new(e1: 3)
...> )
Galixir.Algebras.Vector2.new(scalar: 6)
Computes the inverse of a multivector.
The inverse is computed using the reverse:
inverse(a) = reverse(a) / scalar_part(a * reverse(a))
This formula is valid when a * reverse(a) is a non-zero scalar.
Raises ArgumentError if the multivector is not invertible by this formula.
## Examples
iex> Galixir.Algebras.Vector2.inverse(
...> Galixir.Algebras.Vector2.new(e1: 2)
...> )|> inspect
Galixir.Algebras.Vector2.new(e1: 0.5) |> inspect
Computes the Euclidean length of a vector.
Returns the maximum absolute coefficient of a multivector.
Accepts either a multivector struct or the internal coefficient tuple.
Example
iex> Elixir.Galixir.Algebras.Vector2.max_abs_component(Elixir.Galixir.Algebras.Vector2.new(e1: 2, scalar: 5))
5.0
iex> Elixir.Galixir.Algebras.Vector2.max_abs_component(Elixir.Galixir.Algebras.Vector2.new(e1: 5, scalar: 2))
5.0
Negates a multivector.
Returns the norm of a multivector.
The norm is the square root of the absolute squared norm.
Example
iex> a = Galixir.Algebras.Vector2.new(scalar: 3)
iex> Galixir.Algebras.Vector2.norm(a)
3.0
Normalizes a vector to unit length.
Normalizes a multivector.
The result has unit norm while preserving the direction of the multivector.
Raises ArgumentError when attempting to normalize a null
multivector.
Example
iex> a = Galixir.Algebras.Vector2.new(scalar: 2)
iex> Galixir.Algebras.Vector2.norm(Galixir.Algebras.Vector2.normalize(a))
1.0
Returns the scalar identity element.
Returns the unit pseudoscalar.
The pseudoscalar represents the oriented plane:
I = e1 ∧ e2
Reflects a vector about a line with normal n.
Uses the reflection formula:
v' = -n v n⁻¹
Applies the reverse operation to a multivector.
Reverse (also called reversion) changes the sign of basis blades according to their grade:
grade 0: +
grade 1: +
grade 2: -
grade 3: -
grade 4: +
...For a blade with grade r, the sign is:
(-1)^(r(r-1)/2)Examples
iex> Galixir.Algebras.Vector2.reverse(Galixir.Algebras.Vector2.new(e1: 2)) |> inspect
Galixir.Algebras.Vector2.new(e1: 2)|> inspect
iex> Galixir.Algebras.Vector2.reverse(Galixir.Algebras.Vector2.new(e12: 2))|> inspect
Galixir.Algebras.Vector2.new(e12: -2)|> inspect
iex> Galixir.Algebras.Vector2.reverse(Galixir.Algebras.Vector2.new(scalar: 3))|> inspect
Galixir.Algebras.Vector2.new(scalar: 3)|> inspect
Rotates a vector using a rotor.
Applies the sandwich product:
R v reverse(R)
Creates a rotation rotor.
The rotor represents a rotation by angle radians:
R = cos(angle/2) + e12*sin(angle/2)
Checks whether a multivector contains only a scalar component.
Components with an absolute value smaller than eps are considered
zero.
Examples
iex> Galixir.Algebras.Vector2.scalar?(Galixir.Algebras.Vector2.new(scalar: 3))
true
iex> Galixir.Algebras.Vector2.scalar?(Galixir.Algebras.Vector2.new(e1: 3))
false
iex> Galixir.Algebras.Vector2.scalar?(Galixir.Algebras.Vector2.new())
true
Returns the scalar coefficient of a multivector.
This is equivalent to retrieving the coefficient of the scalar blade.
Examples
iex> Elixir.Galixir.Algebras.Vector2.scalar_part(Elixir.Galixir.Algebras.Vector2.new(scalar: 5.0, e1: 2.0))
5.0
Computes the scalar product of two multivectors.
The scalar product is the grade-0 component of the geometric product:
<a b>₀The result depends on the metric signature of the algebra. In particular, basis vectors with negative or null squares affect the result.
Examples
iex> Galixir.Algebras.Vector2.scalar_product(
...> Galixir.Algebras.Vector2.new(e1: 2),
...> Galixir.Algebras.Vector2.new(e1: 3)
...> )
6.0
Returns the metric signature of the algebra.
Example:
{1, 1, 1, 0}represents a projective geometric algebra with three Euclidean basis vectors and one null basis vector.
Returns the number of coefficients stored by the algebra.
A dimension n algebra contains 2^n basis blades.
Returns the squared norm of a multivector.
The squared norm is computed as:
scalar_part(a * reverse(a))The result may be negative for algebras with indefinite metrics.
Example
iex> a = Galixir.Algebras.Vector2.new(scalar: 3)
iex> Galixir.Algebras.Vector2.squared_norm(a)
9.0
Subtracts two multivectors component-wise.
Examples
iex> a = Galixir.Algebras.Vector2.new(scalar: 5)
iex> b = Galixir.Algebras.Vector2.new(scalar: 2)
iex> Galixir.Algebras.Vector2.sub(a, b)
Galixir.Algebras.Vector2.new(scalar: 3)
Returns the multiplication table for the algebra.
The table contains precomputed geometric products between basis blades.
Each entry maps {left_blade, right_blade} to {coefficient, result_blade}.
The blades are represented internally as bitmasks.
Example
iex> Galixir.Algebras.Vector2.table() |> Map.has_key?({1, 1})
true
Formats a multivector using standard geometric algebra notation.
Zero coefficients are omitted. Coefficients of 1 and -1 are elided for
non-scalar basis blades.
Examples
iex> inspect(Galixir.Algebras.Vector2.new())
"0"
iex> inspect(Galixir.Algebras.Vector2.new(scalar: 2))
"2.0"
iex> inspect(Galixir.Algebras.Vector2.new(e1: 1))
"e1"
iex> inspect(Galixir.Algebras.Vector2.new(scalar: 1, e1: 2))
"1.0 + 2.0e1"
Computes the inverse dual operation.
undual/1 reverses the blade complement operation performed by dual/1.
For non-degenerate Euclidean algebras this corresponds to applying the dual operation twice with the appropriate pseudoscalar factor. In degenerate algebras the result depends on the implemented dual convention.
Examples
iex> Galixir.Algebras.Vector2.undual(Galixir.Algebras.Vector2.dual(Galixir.Algebras.Vector2.new(e1: 2)))
Galixir.Algebras.Vector2.new(e1: 2)
Creates a 2D vector.
Creates:
x*e1 + y*e2
Computes the outer product (wedge product) of two multivectors.
The wedge product combines blades by joining their basis vectors. It is antisymmetric:
a ∧ b = -(b ∧ a)and vanishes when the operands share a basis vector.
Examples
iex> Galixir.Algebras.Vector2.wedge(
...> Galixir.Algebras.Vector2.new(e1: 1),
...> Galixir.Algebras.Vector2.new(e2: 1)
...> )
Galixir.Algebras.Vector2.new(e12: 1)
iex> Galixir.Algebras.Vector2.wedge(
...> Galixir.Algebras.Vector2.new(e2: 1),
...> Galixir.Algebras.Vector2.new(e1: 1)
...> )
Galixir.Algebras.Vector2.new(e12: -1)
iex> Galixir.Algebras.Vector2.wedge(
...> Galixir.Algebras.Vector2.new(e1: 1),
...> Galixir.Algebras.Vector2.new(e1: 1)
...> )
Galixir.Algebras.Vector2.new()
Returns the zero vector.
Checks whether all coefficients of a multivector are zero.
Examples
iex> Galixir.Algebras.Vector2.zero?(Galixir.Algebras.Vector2.new())
true
iex> Galixir.Algebras.Vector2.zero?(Galixir.Algebras.Vector2.new(e1: 1))
false