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}