pub fn cycle_nth<T, F>(x0: T, f: F, n: usize) -> Twhere
T: Eq + Clone,
F: Fn(T) -> T,
Expand description
$n$ 項目を求める。
与えられた $x_0$ と $f$ を用いて $x_i = f(x_{i-1})$ ($i > 0$) として 定義される列 $\{x_i\}_{i=0}^\infty$ の $n$ 項目を求める。
Requirements
$f$ は参照透過である。
Complexuty
$x_{\mu} = x_{\mu+\lambda}$ なる最小の $(\mu, \lambda)$ に対し、$O(\min\{n, \mu+\lambda\})$ time.
Examples
use nekolib::algo::cycle_nth;
let x0 = 0;
let f = |x| (x + 1) % 100; // (mu, lambda) = (0, 100)
assert_eq!(cycle_nth(x0, f, 0), 0);
assert_eq!(cycle_nth(x0, f, 99), 99);
assert_eq!(cycle_nth(x0, f, 100), 0);
assert_eq!(cycle_nth(x0, f, 1000), 0);
assert_eq!(cycle_nth(x0, f, 10_usize.pow(9)), 0);
let x0 = -10;
let f = |x| (x + 1) % 100; // (mu, lambda) = (10, 100)
assert_eq!(cycle_nth(x0, f, 0), -10);
assert_eq!(cycle_nth(x0, f, 99), 89);
assert_eq!(cycle_nth(x0, f, 100), 90);
assert_eq!(cycle_nth(x0, f, 1000), 90);
assert_eq!(cycle_nth(x0, f, 10_usize.pow(9)), 90);