use super::perplex::Perplex;
use nalgebra::{Matrix2, RealField};
pub type PerplexMatrixForm<T> = Matrix2<T>;
impl<T: Copy + RealField> From<PerplexMatrixForm<T>> for Perplex<T> {
fn from(m: PerplexMatrixForm<T>) -> Self {
Self { t: m.m11, x: m.m12 }
}
}
impl<T: Copy + RealField> From<Perplex<T>> for PerplexMatrixForm<T> {
fn from(z: Perplex<T>) -> Self {
Self::new(z.t, z.x, z.x, z.t)
}
}
impl<T: Copy + RealField> Perplex<T> {
#[inline]
pub fn as_matrix_form(&self) -> PerplexMatrixForm<T> {
let t = self.real();
let x = self.hyperbolic();
PerplexMatrixForm::new(t, x, x, t)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_matrix() {
let (z1, z2) = (Perplex::new(1.0, 0.5), Perplex::new(-1.0, -2.0));
let (m1, m2) = (z1.as_matrix_form(), PerplexMatrixForm::from(z2));
assert_eq!(
z1 + z2,
Perplex::from(m1 + m2),
"Matrix addition corresponds to addition of perplex numbers!"
);
assert_eq!(
z1 * z2,
Perplex::from(m1 * m2),
"Matrix multiplication corresponds to multiplication of perplex numbers!"
);
}
}