two.rs

2.1 kB · rust · 69 lines

1use crate::count::blocks;2use crate::design::Design;34fn lemma(code: u128, n: u32) -> Vec<u32> {5    let side = 1usize << n;6    let (b, r, t, l) = (0, side, 2 * side, 3 * side);7    let mut p = vec![u32::MAX; 4 * side];8    let mut tie = |x: usize, y: usize| {9        p[x] = y as u32;10        p[y] = x as u32;11    };12    match code {13        7 => {14            tie(b, l);15            tie(b + 1, l + 1);16            for k in 1..side / 2 {17                tie(b + 2 * k, b + 2 * k + 1);18                tie(l + 2 * k, l + 2 * k + 1);19            }20            for k in 0..side / 2 {21                tie(r + 2 * k, r + 2 * k + 1);22                tie(t + 2 * k, t + 2 * k + 1);23            }24        }25        11 => {26            tie(b, l);27            tie(b + side - 1, r);28            tie(r + side - 1, t + side - 1);29            for y in 1..side {30                tie(l + y, t + side - 1 - y);31            }32            for k in 1..side / 2 {33                tie(b + 2 * k - 1, b + 2 * k);34                tie(r + 2 * k - 1, r + 2 * k);35            }36        }37        _ => {38            tie(b, l);39            tie(r + side - 1, t + side - 1);40            for x in 1..side {41                tie(b + x, r + side - 1 - x);42                tie(l + x, t + side - 1 - x);43            }44        }45    }46    p47}4849pub fn two() {50    println!("BASE 2 LEMMAS: glued matching against the stated matching, levels 1..14");51    for (code, gain) in [(7u128, "2^n - 2"), (11, "2^(n-1)"), (9, "1")] {52        let d = Design::full(code, 2);53        let built = blocks(2, &d.tile, 14);54        let same = (1..=14)55            .filter(|&n| built[n].partner == lemma(code, n as u32))56            .count();57        let law = |n: u32| -> u128 {58            match code {59                7 => (1 << n) - 2,60                11 => 1 << (n - 1),61                _ => 1,62            }63        };64        let gains = (1..14)65            .filter(|&n| built[n + 1].loops - d.kept() as u128 * built[n].loops == law(n as u32))66            .count();67        println!("  {}: lemma holds at {same} of 14 levels, new loops per gluing = {gain} at {gains} of 13 gluings", d.name());68    }69}