7777 where
7878 F : Fn ( usize ) -> Transition < V > ,
7979 {
80- let log2_max_steps = if max_steps == 0 {
81- 0
82- } else {
83- max_steps. ilog2 ( ) as usize
84- } ;
80+ assert ! ( max_steps > 0 ) ;
81+
82+ let log2_max_steps = max_steps. ilog2 ( ) as usize ;
8583
8684 let mut transitions = Vec :: with_capacity ( n_state * ( log2_max_steps + 1 ) ) ;
8785 for i in 0 ..n_state {
@@ -112,6 +110,15 @@ where
112110 }
113111 }
114112
113+ /// 状態`start`から長さ`pow(2, k)`の遷移を返します。
114+ pub fn get ( & self , start : usize , k : usize ) -> & Transition < V > {
115+ assert ! ( start < self . n_state) ;
116+ assert ! ( k <= self . log2_max_steps) ;
117+
118+ let offset = self . n_state * k;
119+ & self . transitions [ offset + start]
120+ }
121+
115122 /// 状態`start`から`step`回の遷移、初期値`init`から始めて`f`で畳みこんだ結果を返します。
116123 pub fn fold < A , F > ( & self , start : usize , step : usize , init : A , mut f : F ) -> A
117124 where
@@ -190,6 +197,25 @@ mod tests {
190197 ) ;
191198 }
192199
200+ #[ test]
201+ fn test_get ( ) {
202+ let n = 3 ;
203+ let to = vec ! [ 1 , 2 , 0 ] ;
204+ let doubling = Doubling :: new ( n, 100 , |i| Transition :: new ( to[ i] , Sum ( 1 ) ) ) ;
205+
206+ let t = doubling. get ( 0 , 0 ) ;
207+ assert_eq ! ( t. value, Sum ( 1 ) ) ;
208+
209+ let t = doubling. get ( 0 , 1 ) ;
210+ assert_eq ! ( t. value, Sum ( 2 ) ) ;
211+
212+ let t = doubling. get ( 0 , 2 ) ;
213+ assert_eq ! ( t. value, Sum ( 4 ) ) ;
214+
215+ let t = doubling. get ( 0 , 3 ) ;
216+ assert_eq ! ( t. value, Sum ( 8 ) ) ;
217+ }
218+
193219 impl Value for String {
194220 fn op ( & self , other : & Self ) -> Self {
195221 format ! ( "{}{}" , self , other)
@@ -199,7 +225,7 @@ mod tests {
199225 proptest ! {
200226 #[ test]
201227 fn test_fold_associativity(
202- ( n_state, max_steps, nexts, values, start, step1, step2) in ( 1_usize ..=10 , 0_usize ..=100 )
228+ ( n_state, max_steps, nexts, values, start, step1, step2) in ( 1_usize ..=10 , 1_usize ..=100 )
203229 . prop_flat_map( |( n_state, max_steps) | {
204230 (
205231 Just ( n_state) ,
0 commit comments