use crate::iso::witness::algebra_iso::AlgebraIso;
use crate::iso::witness::division_algebra_iso::DivisionAlgebraIso;
use crate::iso::witness::field_iso::FieldIso;
use crate::iso::witness::group_iso::GroupIso;
use crate::iso::witness::iso::Iso;
use crate::iso::witness::ring_iso::RingIso;
use crate::{Algebra, DivisionAlgebra, Field, Group, Ring};
pub fn assert_witness_iso_round_trip<W, S, T>(s: S, t: T)
where
W: Iso<S, T>,
S: Clone + PartialEq + core::fmt::Debug,
T: Clone + PartialEq + core::fmt::Debug,
{
let t_from_s: T = W::to_target(s.clone());
let s_back: S = W::to_source(t_from_s);
assert_eq!(
s, s_back,
"Witness iso round-trip S -> T -> S failed: original {:?} differs from to_source(to_target(original))",
s
);
let s_from_t: S = W::to_source(t.clone());
let t_back: T = W::to_target(s_from_t);
assert_eq!(
t, t_back,
"Witness iso round-trip T -> S -> T failed: original {:?} differs from to_target(to_source(original))",
t
);
}
pub fn assert_witness_group_iso_law<W, S, T>(a: S, b: S)
where
W: GroupIso<S, T>,
S: Group + Clone + PartialEq + core::fmt::Debug,
T: Group + Clone + PartialEq + core::fmt::Debug,
{
let lhs: T = W::to_target(a.clone() + b.clone());
let rhs: T = W::to_target(a) + W::to_target(b);
assert_eq!(
lhs, rhs,
"Witness GroupIso homomorphism failed: to_target(a + b) != to_target(a) + to_target(b)"
);
}
pub fn assert_witness_ring_iso_laws<W, S, T>(a: S, b: S)
where
W: RingIso<S, T>,
S: Ring + Clone + PartialEq + core::fmt::Debug,
T: Ring + Clone + PartialEq + core::fmt::Debug,
{
let lhs_add: T = W::to_target(a.clone() + b.clone());
let rhs_add: T = W::to_target(a.clone()) + W::to_target(b.clone());
assert_eq!(
lhs_add, rhs_add,
"Witness RingIso addition homomorphism failed: to_target(a + b) != to_target(a) + to_target(b)"
);
let lhs_mul: T = W::to_target(a.clone() * b.clone());
let rhs_mul: T = W::to_target(a) * W::to_target(b);
assert_eq!(
lhs_mul, rhs_mul,
"Witness RingIso multiplication homomorphism failed: to_target(a * b) != to_target(a) * to_target(b)"
);
}
pub fn assert_witness_field_iso_laws<W, S, T>(a: S)
where
W: FieldIso<S, T>,
S: Field + Clone + PartialEq + core::fmt::Debug,
T: Field + Clone + PartialEq + core::fmt::Debug,
{
let inv_s: S = a.clone().inverse();
let from_inv: T = W::to_target(inv_s);
let inv_from: T = W::to_target(a).inverse();
assert_eq!(
from_inv, inv_from,
"Witness FieldIso multiplicative-inverse homomorphism failed: to_target(a.inverse()) != to_target(a).inverse()"
);
}
pub fn assert_witness_algebra_iso_law<W, S, T, R>(a: S, r: R)
where
W: AlgebraIso<S, T, R>,
R: Ring + Clone,
S: Algebra<R> + Clone + PartialEq + core::fmt::Debug,
T: Algebra<R> + Clone + PartialEq + core::fmt::Debug,
{
let scaled_s: S = a.clone().scale(r.clone());
let from_scaled: T = W::to_target(scaled_s);
let scale_from: T = W::to_target(a).scale(r);
assert_eq!(
from_scaled, scale_from,
"Witness AlgebraIso scalar-multiplication homomorphism failed: to_target(a.scale(r)) != to_target(a).scale(r)"
);
}
pub fn assert_witness_division_algebra_iso_law<W, S, T, R>(a: S)
where
W: DivisionAlgebraIso<S, T, R>,
R: Field + Clone,
S: DivisionAlgebra<R> + Clone + PartialEq + core::fmt::Debug,
T: DivisionAlgebra<R> + Clone + PartialEq + core::fmt::Debug,
{
let conj_s: S = a.clone().conjugate();
let from_conj: T = W::to_target(conj_s);
let conj_from: T = W::to_target(a).conjugate();
assert_eq!(
from_conj, conj_from,
"Witness DivisionAlgebraIso conjugation homomorphism failed: to_target(a.conjugate()) != to_target(a).conjugate()"
);
}