From 2447a1613fee40f7ae0ac0c780b48e7287a10fd2 Mon Sep 17 00:00:00 2001 From: ia7ck <23146842+ia7ck@users.noreply.github.com> Date: Sat, 7 Feb 2026 23:07:59 +0900 Subject: [PATCH 1/2] =?UTF-8?q?max=5Fsteps=20=3D=200=20=E3=81=A7=E4=BD=BF?= =?UTF-8?q?=E3=81=86=E3=81=93=E3=81=A8=E3=81=AF=E3=81=AA=E3=81=95=E3=81=9D?= =?UTF-8?q?=E3=81=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/doubling/src/lib.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libs/doubling/src/lib.rs b/libs/doubling/src/lib.rs index 98f14377..1e4034c8 100644 --- a/libs/doubling/src/lib.rs +++ b/libs/doubling/src/lib.rs @@ -77,11 +77,9 @@ where where F: Fn(usize) -> Transition, { - let log2_max_steps = if max_steps == 0 { - 0 - } else { - max_steps.ilog2() as usize - }; + assert!(max_steps > 0); + + let log2_max_steps = max_steps.ilog2() as usize; let mut transitions = Vec::with_capacity(n_state * (log2_max_steps + 1)); for i in 0..n_state { @@ -199,7 +197,7 @@ mod tests { proptest! { #[test] fn test_fold_associativity( - (n_state, max_steps, nexts, values, start, step1, step2) in (1_usize..=10, 0_usize..=100) + (n_state, max_steps, nexts, values, start, step1, step2) in (1_usize..=10, 1_usize..=100) .prop_flat_map(|(n_state, max_steps)| { ( Just(n_state), From ae663fdbf802710c6bb21545231314b01d175510 Mon Sep 17 00:00:00 2001 From: ia7ck <23146842+ia7ck@users.noreply.github.com> Date: Sat, 7 Feb 2026 23:21:20 +0900 Subject: [PATCH 2/2] get() --- libs/doubling/src/lib.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/libs/doubling/src/lib.rs b/libs/doubling/src/lib.rs index 1e4034c8..d575cd46 100644 --- a/libs/doubling/src/lib.rs +++ b/libs/doubling/src/lib.rs @@ -110,6 +110,15 @@ where } } + /// 状態`start`から長さ`pow(2, k)`の遷移を返します。 + pub fn get(&self, start: usize, k: usize) -> &Transition { + assert!(start < self.n_state); + assert!(k <= self.log2_max_steps); + + let offset = self.n_state * k; + &self.transitions[offset + start] + } + /// 状態`start`から`step`回の遷移、初期値`init`から始めて`f`で畳みこんだ結果を返します。 pub fn fold(&self, start: usize, step: usize, init: A, mut f: F) -> A where @@ -188,6 +197,25 @@ mod tests { ); } + #[test] + fn test_get() { + let n = 3; + let to = vec![1, 2, 0]; + let doubling = Doubling::new(n, 100, |i| Transition::new(to[i], Sum(1))); + + let t = doubling.get(0, 0); + assert_eq!(t.value, Sum(1)); + + let t = doubling.get(0, 1); + assert_eq!(t.value, Sum(2)); + + let t = doubling.get(0, 2); + assert_eq!(t.value, Sum(4)); + + let t = doubling.get(0, 3); + assert_eq!(t.value, Sum(8)); + } + impl Value for String { fn op(&self, other: &Self) -> Self { format!("{}{}", self, other)