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}