Checking sign distributions of Zets under product
The following program makes use of the arthroprod library to observe their common properties under the full product.
Program
#[macro_use]
extern crate arthroprod;
use arthroprod::algebra::{full, MultiVector, AR};
use arthroprod::prelude::*;
macro_rules! for_all_zets {
{ zets: $zets:expr; $($description:expr => $func:ident;)+ } => {
$(println!("{}", $description);
for (zet, mvec) in $zets.iter() {
println!(" {}: {}", zet, $func(mvec));
}
println!("");)+
}
}
fn sign_checked(m: &MultiVector) -> String {
m.as_terms()
.iter()
.map(|t| t.sign().to_string())
.collect::<Vec<String>>()
.join("")
}
fn main() {
let a0 = alpha!(0);
let hermitian = |m: &MultiVector| sign_checked(&m.hermitian());
let dual = |m: &MultiVector| sign_checked(&m.dual());
let reversed = |m: &MultiVector| sign_checked(&m.reversed());
let herm_dual = |m: &MultiVector| (m.hermitian() == m.reversed()).to_string();
let parity = |m: &MultiVector| sign_checked(&full::<_, MultiVector, _>(&a0, &full(m, &a0)));
for_all_zets! {
zets: vec![
("ZB", Zet_B()),
("ZT", Zet_T()),
("ZA", Zet_A()),
("ZE", Zet_E()),
];
"Hermitian conjugate" => hermitian;
"Dual multivector" => dual;
"Reversed indices" => reversed;
"Hermitian == reversed" => herm_dual;
"Parity: a0_Z_a0" => parity;
}
}
Output
$ cargo run --bin=zet-properties
Hermitian conjugate
ZB: +---
ZT: +---
ZA: +---
ZE: -+++
Dual multivector
ZB: -+++
ZT: +---
ZA: -+++
ZE: +---
Reversed indices
ZB: ----
ZT: +---
ZA: -+++
ZE: +---
Hermitian == reversed
ZB: false
ZT: true
ZA: false
ZE: false
Parity: a0_Z_a0
ZB: ++++
ZT: ++++
ZA: ----
ZE: ----