Function nekolib::math::sqrt_fraction_::sqrt_fraction_fn
source · pub fn sqrt_fraction_fn(
n: i128
) -> (i128, impl Fn(i128, i128) -> (i128, i128, i128))
Expand description
平方根の連分数展開。
$\sqrt{n}$ の連分数展開の $i$ step 目が次のように表されるとする。 $$ \sqrt{n} = a_0 + \frac{1}{\dots\,+\frac{1}{a_{i-1}+\frac{\sqrt{n}-b_{i-1}}{c_{i-1}}}}. $$
$a_0$ と、関数 $f: (b_i, c_i)\mapsto (a_{i+1}, b_{i+1}, c_{i+1})$ を返す。 ただし、$(a_0, b_0, c_0) = (\lfloor\sqrt{n}\rfloor, \lfloor\sqrt{n}\rfloor, 1)$ である。
実際の連分数展開が欲しいときは sqrt_fraction
を用いればよい。
周期検出などをしたいときは $(b_\bullet, c_\bullet)$ が必要になる。
Derivation
todo!()
Examples
use nekolib::math::sqrt_fraction_fn;
let (a0, next) = sqrt_fraction_fn(3);
assert_eq!(a0, 1);
let (a1, b1, c1) = next(a0, 1);
let (a2, b2, c2) = next(b1, c1);
let (a3, b3, c3) = next(b2, c2);
assert_eq!((a1, b1, c1), (a3, b3, c3)); // sqrt(3) has period 2
assert_eq!([a0, a1, a2], [1, 1, 2]); // sqrt(3) = [1; (1, 2)]