coprime.rs
2.8 kB · rust · 106 lines
1use coprime_terms::brute;2use coprime_terms::design::{CARPET, MENGER, VICSEK};3use coprime_terms::engine::{methods, terms, terms_with, Mode};45const MENGER_TERMS: [i128; 11] = [6 12,7 270,8 5916,9 123504,10 2538447,11 51497040,12 1038074187,13 20860210527,14 418429711224,15 8382927031902,16 167827226563374,17];1819const CARPET_TERMS: [i128; 12] = [20 4,21 32,22 274,23 2320,24 19178,25 155392,26 1248416,27 10013432,28 80226680,29 642182854,30 5138968090,31 41117712068,32];3334const VICSEK_TERMS: [i128; 14] = [35 5, 16, 90, 418, 2178, 10560, 54120, 266478, 1338422, 6658480, 33439772, 166998096, 835514606,36 4172530386,37];3839#[test]40fn known_terms_reproduce() {41 let menger: Vec<i128> = terms(&MENGER, 11, 4).iter().map(|l| l.value).collect();42 assert_eq!(menger, MENGER_TERMS.to_vec());43 let carpet: Vec<i128> = terms(&CARPET, 12, 4).iter().map(|l| l.value).collect();44 assert_eq!(carpet, CARPET_TERMS.to_vec());45 let vicsek: Vec<i128> = terms(&VICSEK, 14, 4).iter().map(|l| l.value).collect();46 assert_eq!(vicsek, VICSEK_TERMS.to_vec());47}4849#[test]50fn enumeration_agrees() {51 for design in [MENGER, CARPET, VICSEK] {52 let top = if design.dimension == 3 { 5 } else { 7 };53 for level in terms(&design, top, 4) {54 let found = brute::count(&design, level.level, 4);55 assert_eq!(56 level.value, found as i128,57 "{} level {}",58 design.name, level.level59 );60 }61 }62}6364#[test]65fn inner_counters_agree() {66 for design in [MENGER, CARPET, VICSEK] {67 for level in 3..=7u32 {68 let span = 3u64.pow(level);69 for modulus in 1..span {70 if modulus % 3 == 0 {71 continue;72 }73 let all = methods(&design, level, modulus);74 assert!(75 all.iter().all(|v| *v == all[0]),76 "{} level {} modulus {} {:?}",77 design.name,78 level,79 modulus,80 all81 );82 }83 }84 }85}8687#[test]88fn pinned_counters_agree() {89 for design in [MENGER, CARPET, VICSEK] {90 let reference: Vec<i128> = terms(&design, 9, 4).iter().map(|l| l.value).collect();91 for (mode, top) in [92 (Mode::Direct, 9),93 (Mode::Zeta, 9),94 (Mode::Convolve, 9),95 (Mode::Bitset, 8),96 (Mode::Rows, 9),97 (Mode::Cube, 9),98 ] {99 let run: Vec<i128> = terms_with(&design, top, 4, mode)100 .iter()101 .map(|l| l.value)102 .collect();103 assert_eq!(run, reference[..top as usize], "{} {:?}", design.name, mode);104 }105 }106}