Function nekolib::math::sqrt_fraction_fn

source ·
pub fn sqrt_fraction_fn(
    n: i128
) -> (i128, impl Fn(i128, i128) -> (i128, i128, i128))
Expand description

平方根の連分数展開。

n\sqrt{n} の連分数展開の ii step 目が次のように表されるとする。 n=a0+1+1ai1+nbi1ci1. \sqrt{n} = a_0 + \frac{1}{\dots\,+\frac{1}{a_{i-1}+\frac{\sqrt{n}-b_{i-1}}{c_{i-1}}}}.

a0a_0 と、関数 f:(bi,ci)(ai+1,bi+1,ci+1)f: (b_i, c_i)\mapsto (a_{i+1}, b_{i+1}, c_{i+1}) を返す。 ただし、(a0,b0,c0)=(n,n,1)(a_0, b_0, c_0) = (\lfloor\sqrt{n}\rfloor, \lfloor\sqrt{n}\rfloor, 1) である。

実際の連分数展開が欲しいときは sqrt_fraction を用いればよい。 周期検出などをしたいときは (b,c)(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)]