use crate::algebra::{full, MultiVector, Term, AR};
pub fn div<L: AR, R: AR, T: AR>(left: &L, right: &R) -> T {
let lterms = left.as_terms();
let rterms = right.as_terms();
let terms = if lterms.len() == 1 && rterms.len() == 1 {
div_single_terms(<erms[0], &rterms[0])
} else {
apply_van_der_mark(left, right)
};
T::from_terms(terms)
}
fn div_single_terms(left: &Term, right: &Term) -> Vec<Term> {
vec![left.form_product_with(&right.inverse())]
}
fn apply_van_der_mark<L: AR, R: AR>(left: &L, right: &R) -> Vec<Term> {
let l_dagger = left.hermitian();
let l_phi: MultiVector = full(left, &l_dagger);
let l_diamond_phi = l_phi.diamond();
let t: Term = full(&l_phi, &l_diamond_phi);
let divisor = t.magnitude();
let inverse: MultiVector = full(&l_dagger, &l_diamond_phi);
let product: MultiVector = full(&inverse, right);
(product / divisor).as_terms()
}