// General Hamming parity-check code (length 2^m - 1) // Source: HeytingLean.CodingTheory.Hamming.General use crate::hamming_basic::Bit; pub fn hamming_length(m: u32) -> usize { (1usize << m) - 1 } pub fn hamming_syndrome(m: u32, x: &[Bit]) -> Vec { let n = hamming_length(m); (0..m).map(|k| { let mut sum: Bit = 0; for i in 0..n { let bit_k = if ((i + 1) >> k) & 1 == 1 { 1u8 } else { 0u8 }; sum = (sum + bit_k * x[i]) & 1; } sum }).collect() } pub fn hamming_code_member(m: u32, x: &[Bit]) -> bool { hamming_syndrome(m, x).iter().all(|&s| s == 0) } #[cfg(test)] mod tests { use super::*; use crate::hamming74::hamming74_encode; #[test] fn test_hamming_length() { assert_eq!(hamming_length(3), 7); assert_eq!(hamming_length(4), 15); } #[test] fn test_h3_codeword_membership() { // Hamming(7,4) codewords should be in H(3) let m = [1, 0, 1, 0]; let enc = hamming74_encode(&m); assert!(hamming_code_member(3, &enc)); } }