use crate::HostTypes;
pub trait NormedDivisionAlgebra<H: HostTypes> {
fn algebra_dimension(&self) -> u64;
fn is_commutative(&self) -> bool;
fn is_associative(&self) -> bool;
fn basis_elements(&self) -> &H::HostString;
type MultiplicationTable: MultiplicationTable<H>;
fn algebra_multiplication_table(&self) -> &Self::MultiplicationTable;
}
pub trait CayleyDicksonConstruction<H: HostTypes> {
type NormedDivisionAlgebra: NormedDivisionAlgebra<H>;
fn cayley_dickson_source(&self) -> &Self::NormedDivisionAlgebra;
fn cayley_dickson_target(&self) -> &Self::NormedDivisionAlgebra;
fn adjoined_element(&self) -> &H::HostString;
fn conjugation_rule(&self) -> &H::HostString;
}
pub trait MultiplicationTable<H: HostTypes> {}
pub trait AlgebraCommutator<H: HostTypes> {}
pub trait AlgebraAssociator<H: HostTypes> {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullNormedDivisionAlgebra<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullNormedDivisionAlgebra<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullNormedDivisionAlgebra<H> {
pub const ABSENT: NullNormedDivisionAlgebra<H> = NullNormedDivisionAlgebra {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> NormedDivisionAlgebra<H> for NullNormedDivisionAlgebra<H> {
fn algebra_dimension(&self) -> u64 {
0
}
fn is_commutative(&self) -> bool {
false
}
fn is_associative(&self) -> bool {
false
}
fn basis_elements(&self) -> &H::HostString {
H::EMPTY_HOST_STRING
}
type MultiplicationTable = NullMultiplicationTable<H>;
fn algebra_multiplication_table(&self) -> &Self::MultiplicationTable {
&<NullMultiplicationTable<H>>::ABSENT
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullCayleyDicksonConstruction<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullCayleyDicksonConstruction<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullCayleyDicksonConstruction<H> {
pub const ABSENT: NullCayleyDicksonConstruction<H> = NullCayleyDicksonConstruction {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> CayleyDicksonConstruction<H> for NullCayleyDicksonConstruction<H> {
type NormedDivisionAlgebra = NullNormedDivisionAlgebra<H>;
fn cayley_dickson_source(&self) -> &Self::NormedDivisionAlgebra {
&<NullNormedDivisionAlgebra<H>>::ABSENT
}
fn cayley_dickson_target(&self) -> &Self::NormedDivisionAlgebra {
&<NullNormedDivisionAlgebra<H>>::ABSENT
}
fn adjoined_element(&self) -> &H::HostString {
H::EMPTY_HOST_STRING
}
fn conjugation_rule(&self) -> &H::HostString {
H::EMPTY_HOST_STRING
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullMultiplicationTable<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullMultiplicationTable<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullMultiplicationTable<H> {
pub const ABSENT: NullMultiplicationTable<H> = NullMultiplicationTable {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> MultiplicationTable<H> for NullMultiplicationTable<H> {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullAlgebraCommutator<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullAlgebraCommutator<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullAlgebraCommutator<H> {
pub const ABSENT: NullAlgebraCommutator<H> = NullAlgebraCommutator {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> AlgebraCommutator<H> for NullAlgebraCommutator<H> {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullAlgebraAssociator<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullAlgebraAssociator<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullAlgebraAssociator<H> {
pub const ABSENT: NullAlgebraAssociator<H> = NullAlgebraAssociator {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> AlgebraAssociator<H> for NullAlgebraAssociator<H> {}
#[derive(Debug)]
pub struct NormedDivisionAlgebraHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for NormedDivisionAlgebraHandle<H> {}
impl<H: HostTypes> Clone for NormedDivisionAlgebraHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for NormedDivisionAlgebraHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for NormedDivisionAlgebraHandle<H> {}
impl<H: HostTypes> core::hash::Hash for NormedDivisionAlgebraHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> NormedDivisionAlgebraHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait NormedDivisionAlgebraResolver<H: HostTypes> {
fn resolve(
&self,
handle: NormedDivisionAlgebraHandle<H>,
) -> Option<NormedDivisionAlgebraRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct NormedDivisionAlgebraRecord<H: HostTypes> {
pub algebra_dimension: u64,
pub is_commutative: bool,
pub is_associative: bool,
pub basis_elements: &'static H::HostString,
pub algebra_multiplication_table_handle: MultiplicationTableHandle<H>,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedNormedDivisionAlgebra<'r, R: NormedDivisionAlgebraResolver<H>, H: HostTypes> {
handle: NormedDivisionAlgebraHandle<H>,
resolver: &'r R,
record: Option<NormedDivisionAlgebraRecord<H>>,
}
impl<'r, R: NormedDivisionAlgebraResolver<H>, H: HostTypes>
ResolvedNormedDivisionAlgebra<'r, R, H>
{
#[inline]
pub fn new(handle: NormedDivisionAlgebraHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> NormedDivisionAlgebraHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&NormedDivisionAlgebraRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: NormedDivisionAlgebraResolver<H>, H: HostTypes> NormedDivisionAlgebra<H>
for ResolvedNormedDivisionAlgebra<'r, R, H>
{
fn algebra_dimension(&self) -> u64 {
match &self.record {
Some(r) => r.algebra_dimension,
None => 0,
}
}
fn is_commutative(&self) -> bool {
match &self.record {
Some(r) => r.is_commutative,
None => false,
}
}
fn is_associative(&self) -> bool {
match &self.record {
Some(r) => r.is_associative,
None => false,
}
}
fn basis_elements(&self) -> &H::HostString {
match &self.record {
Some(r) => r.basis_elements,
None => H::EMPTY_HOST_STRING,
}
}
type MultiplicationTable = NullMultiplicationTable<H>;
fn algebra_multiplication_table(&self) -> &Self::MultiplicationTable {
&<NullMultiplicationTable<H>>::ABSENT
}
}
impl<'r, R: NormedDivisionAlgebraResolver<H>, H: HostTypes>
ResolvedNormedDivisionAlgebra<'r, R, H>
{
#[inline]
pub fn resolve_algebra_multiplication_table<'r2, R2: MultiplicationTableResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<ResolvedMultiplicationTable<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(ResolvedMultiplicationTable::new(
record.algebra_multiplication_table_handle,
r,
))
}
}
#[derive(Debug)]
pub struct CayleyDicksonConstructionHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for CayleyDicksonConstructionHandle<H> {}
impl<H: HostTypes> Clone for CayleyDicksonConstructionHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for CayleyDicksonConstructionHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for CayleyDicksonConstructionHandle<H> {}
impl<H: HostTypes> core::hash::Hash for CayleyDicksonConstructionHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> CayleyDicksonConstructionHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait CayleyDicksonConstructionResolver<H: HostTypes> {
fn resolve(
&self,
handle: CayleyDicksonConstructionHandle<H>,
) -> Option<CayleyDicksonConstructionRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct CayleyDicksonConstructionRecord<H: HostTypes> {
pub cayley_dickson_source_handle: NormedDivisionAlgebraHandle<H>,
pub cayley_dickson_target_handle: NormedDivisionAlgebraHandle<H>,
pub adjoined_element: &'static H::HostString,
pub conjugation_rule: &'static H::HostString,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedCayleyDicksonConstruction<
'r,
R: CayleyDicksonConstructionResolver<H>,
H: HostTypes,
> {
handle: CayleyDicksonConstructionHandle<H>,
resolver: &'r R,
record: Option<CayleyDicksonConstructionRecord<H>>,
}
impl<'r, R: CayleyDicksonConstructionResolver<H>, H: HostTypes>
ResolvedCayleyDicksonConstruction<'r, R, H>
{
#[inline]
pub fn new(handle: CayleyDicksonConstructionHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> CayleyDicksonConstructionHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&CayleyDicksonConstructionRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: CayleyDicksonConstructionResolver<H>, H: HostTypes> CayleyDicksonConstruction<H>
for ResolvedCayleyDicksonConstruction<'r, R, H>
{
type NormedDivisionAlgebra = NullNormedDivisionAlgebra<H>;
fn cayley_dickson_source(&self) -> &Self::NormedDivisionAlgebra {
&<NullNormedDivisionAlgebra<H>>::ABSENT
}
fn cayley_dickson_target(&self) -> &Self::NormedDivisionAlgebra {
&<NullNormedDivisionAlgebra<H>>::ABSENT
}
fn adjoined_element(&self) -> &H::HostString {
match &self.record {
Some(r) => r.adjoined_element,
None => H::EMPTY_HOST_STRING,
}
}
fn conjugation_rule(&self) -> &H::HostString {
match &self.record {
Some(r) => r.conjugation_rule,
None => H::EMPTY_HOST_STRING,
}
}
}
impl<'r, R: CayleyDicksonConstructionResolver<H>, H: HostTypes>
ResolvedCayleyDicksonConstruction<'r, R, H>
{
#[inline]
pub fn resolve_cayley_dickson_source<'r2, R2: NormedDivisionAlgebraResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<ResolvedNormedDivisionAlgebra<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(ResolvedNormedDivisionAlgebra::new(
record.cayley_dickson_source_handle,
r,
))
}
#[inline]
pub fn resolve_cayley_dickson_target<'r2, R2: NormedDivisionAlgebraResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<ResolvedNormedDivisionAlgebra<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(ResolvedNormedDivisionAlgebra::new(
record.cayley_dickson_target_handle,
r,
))
}
}
#[derive(Debug)]
pub struct MultiplicationTableHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for MultiplicationTableHandle<H> {}
impl<H: HostTypes> Clone for MultiplicationTableHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for MultiplicationTableHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for MultiplicationTableHandle<H> {}
impl<H: HostTypes> core::hash::Hash for MultiplicationTableHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> MultiplicationTableHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait MultiplicationTableResolver<H: HostTypes> {
fn resolve(&self, handle: MultiplicationTableHandle<H>)
-> Option<MultiplicationTableRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct MultiplicationTableRecord<H: HostTypes> {
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedMultiplicationTable<'r, R: MultiplicationTableResolver<H>, H: HostTypes> {
handle: MultiplicationTableHandle<H>,
resolver: &'r R,
record: Option<MultiplicationTableRecord<H>>,
}
impl<'r, R: MultiplicationTableResolver<H>, H: HostTypes> ResolvedMultiplicationTable<'r, R, H> {
#[inline]
pub fn new(handle: MultiplicationTableHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> MultiplicationTableHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&MultiplicationTableRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: MultiplicationTableResolver<H>, H: HostTypes> MultiplicationTable<H>
for ResolvedMultiplicationTable<'r, R, H>
{
}
#[derive(Debug)]
pub struct AlgebraCommutatorHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for AlgebraCommutatorHandle<H> {}
impl<H: HostTypes> Clone for AlgebraCommutatorHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for AlgebraCommutatorHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for AlgebraCommutatorHandle<H> {}
impl<H: HostTypes> core::hash::Hash for AlgebraCommutatorHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> AlgebraCommutatorHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait AlgebraCommutatorResolver<H: HostTypes> {
fn resolve(&self, handle: AlgebraCommutatorHandle<H>) -> Option<AlgebraCommutatorRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct AlgebraCommutatorRecord<H: HostTypes> {
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedAlgebraCommutator<'r, R: AlgebraCommutatorResolver<H>, H: HostTypes> {
handle: AlgebraCommutatorHandle<H>,
resolver: &'r R,
record: Option<AlgebraCommutatorRecord<H>>,
}
impl<'r, R: AlgebraCommutatorResolver<H>, H: HostTypes> ResolvedAlgebraCommutator<'r, R, H> {
#[inline]
pub fn new(handle: AlgebraCommutatorHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> AlgebraCommutatorHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&AlgebraCommutatorRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: AlgebraCommutatorResolver<H>, H: HostTypes> AlgebraCommutator<H>
for ResolvedAlgebraCommutator<'r, R, H>
{
}
#[derive(Debug)]
pub struct AlgebraAssociatorHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for AlgebraAssociatorHandle<H> {}
impl<H: HostTypes> Clone for AlgebraAssociatorHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for AlgebraAssociatorHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for AlgebraAssociatorHandle<H> {}
impl<H: HostTypes> core::hash::Hash for AlgebraAssociatorHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> AlgebraAssociatorHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait AlgebraAssociatorResolver<H: HostTypes> {
fn resolve(&self, handle: AlgebraAssociatorHandle<H>) -> Option<AlgebraAssociatorRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct AlgebraAssociatorRecord<H: HostTypes> {
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedAlgebraAssociator<'r, R: AlgebraAssociatorResolver<H>, H: HostTypes> {
handle: AlgebraAssociatorHandle<H>,
resolver: &'r R,
record: Option<AlgebraAssociatorRecord<H>>,
}
impl<'r, R: AlgebraAssociatorResolver<H>, H: HostTypes> ResolvedAlgebraAssociator<'r, R, H> {
#[inline]
pub fn new(handle: AlgebraAssociatorHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> AlgebraAssociatorHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&AlgebraAssociatorRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: AlgebraAssociatorResolver<H>, H: HostTypes> AlgebraAssociator<H>
for ResolvedAlgebraAssociator<'r, R, H>
{
}
pub mod real_algebra {
pub const ALGEBRA_DIMENSION: i64 = 1;
pub const BASIS_ELEMENTS: &str = "{1}";
pub const IS_ASSOCIATIVE: bool = true;
pub const IS_COMMUTATIVE: bool = true;
}
pub mod complex_algebra {
pub const ALGEBRA_DIMENSION: i64 = 2;
pub const BASIS_ELEMENTS: &str = "{1, i}";
pub const IS_ASSOCIATIVE: bool = true;
pub const IS_COMMUTATIVE: bool = true;
}
pub mod quaternion_algebra {
pub const ALGEBRA_DIMENSION: i64 = 4;
pub const BASIS_ELEMENTS: &str = "{1, i, j, k}";
pub const IS_ASSOCIATIVE: bool = true;
pub const IS_COMMUTATIVE: bool = false;
}
pub mod octonion_algebra {
pub const ALGEBRA_DIMENSION: i64 = 8;
pub const BASIS_ELEMENTS: &str = "{1, i, j, k, l, il, jl, kl}";
pub const IS_ASSOCIATIVE: bool = false;
pub const IS_COMMUTATIVE: bool = false;
}
pub mod cayley_dickson_r_to_c {
pub const ADJOINED_ELEMENT: &str = "i";
pub const CAYLEY_DICKSON_SOURCE: &str = "https://uor.foundation/division/RealAlgebra";
pub const CAYLEY_DICKSON_TARGET: &str = "https://uor.foundation/division/ComplexAlgebra";
pub const CONJUGATION_RULE: &str = "i² = −1";
}
pub mod cayley_dickson_c_to_h {
pub const ADJOINED_ELEMENT: &str = "j";
pub const CAYLEY_DICKSON_SOURCE: &str = "https://uor.foundation/division/ComplexAlgebra";
pub const CAYLEY_DICKSON_TARGET: &str = "https://uor.foundation/division/QuaternionAlgebra";
pub const CONJUGATION_RULE: &str = "ij = k, ji = −k";
}
pub mod cayley_dickson_h_to_o {
pub const ADJOINED_ELEMENT: &str = "l";
pub const CAYLEY_DICKSON_SOURCE: &str = "https://uor.foundation/division/QuaternionAlgebra";
pub const CAYLEY_DICKSON_TARGET: &str = "https://uor.foundation/division/OctonionAlgebra";
pub const CONJUGATION_RULE: &str = "non-associative Fano plane products";
}