mod arf;
mod brown;
mod dickson;
mod extraspecial;
mod field;
pub use arf::*;
pub(crate) use arf::{
arf_nimber_at_degree, arf_ordinal_at_degree, min_field_degree, nimber_metric_max_val,
};
pub(crate) use brown::beta_from_gauss;
pub use brown::*;
pub use dickson::*;
pub use extraspecial::*;
pub use field::*;
#[cfg(test)]
mod coverage_gap_tests {
use crate::clifford::Metric;
use crate::forms::isometric_finite_char2;
use crate::forms::FiniteChar2Field;
use crate::scalar::{Fpn, Poly, Scalar};
use std::collections::BTreeMap;
type F8 = Fpn<2, 3>;
fn plane(q0: F8, q1: F8, b01: F8) -> Metric<F8> {
let mut b = BTreeMap::new();
b.insert((0usize, 1usize), b01);
Metric::new(vec![q0, q1], b)
}
#[test]
fn isometric_finite_char2_distinguishes_hyperbolic_from_anisotropic() {
let zero = F8::zero();
let one = F8::one();
let gen = F8::generator();
let hyp_a = plane(zero, zero, one);
let hyp_b = plane(zero, zero, gen);
assert_eq!(isometric_finite_char2(&hyp_a, &hyp_b), Some(true));
let aniso = plane(one, one, one);
assert_eq!(isometric_finite_char2(&hyp_a, &aniso), Some(false));
assert_eq!(isometric_finite_char2(&aniso, &aniso), Some(true));
}
#[test]
fn f4_product_of_two_irreducible_quadratics_forces_the_equal_degree_splitter() {
type F4 = Fpn<2, 2>;
let one = F4::one();
let a = F4::generator();
let a1 = a.add(&one);
let g1 = Poly::new(vec![one, a, one]); let g2 = Poly::new(vec![one, a1, one]); assert_ne!(g1, g2);
let f = g1.mul(&g2);
let factors = crate::forms::poly_factor::monic_irreducible_factor_support(
&f,
2,
F4::field_order(),
F4::from_index,
);
assert_eq!(
factors.len(),
2,
"must split into two irreducible quadratics, not stay merged"
);
assert!(factors.contains(&g1));
assert!(factors.contains(&g2));
}
}