use malachite_base::num::arithmetic::traits::ArithmeticCheckedShl;
use malachite_nz::platform::Limb;
pub(crate) fn generate_fibonacci_data() {
println!("// This section is created by fibonacci_data.rs.");
println!();
let mut xs: Vec<Limb> = vec![1, 0];
loop {
let len = xs.len();
if let Some(x) = xs[len - 1].checked_add(xs[len - 2]) {
xs.push(x);
} else {
break;
}
}
let fib_limit = xs.len() - 2;
let mut lucnum_limit = 0;
for n in 1..=fib_limit {
if xs[n]
.arithmetic_checked_shl(1u64)
.and_then(|d: Limb| d.checked_add(xs[n + 1]))
.is_some()
{
lucnum_limit = n;
} else {
break;
}
}
println!(
"// This is equivalent to `__gmp_fib_table` in `mpn/fib_table.c`, GMP 6.3.0. \
`FIB_TABLE[i]` is"
);
println!("// F(i - 1), so the table begins with F(-1) = 1 and F(0) = 0.");
print!("pub(crate) const FIB_TABLE: [Limb; {}] = [", xs.len());
let mut first = true;
for &x in &xs {
if first {
first = false;
} else {
print!(", ");
}
print!("{x}");
}
println!("];");
println!();
println!("// The largest n whose F(n) fits in one limb.");
println!("//");
println!("// This is equivalent to `FIB_TABLE_LIMIT` in `fib_table.h`, GMP 6.3.0.");
println!("pub(crate) const FIB_TABLE_LIMIT: u64 = {fib_limit};");
println!();
println!("// The largest n whose L(n) = F(n) + 2 * F(n - 1) fits in one limb.");
println!("//");
println!("// This is equivalent to `FIB_TABLE_LUCNUM_LIMIT` in `fib_table.h`, GMP 6.3.0.");
println!("pub(crate) const FIB_TABLE_LUCNUM_LIMIT: u64 = {lucnum_limit};");
}