use crate::num::basic::unsigneds::PrimitiveUnsigned;
pub fn checked_fibonacci_naive<T: PrimitiveUnsigned>(n: u64) -> Option<T> {
if n == 0 {
return Some(T::ZERO);
}
let (mut a, mut b) = (T::ZERO, T::ONE);
for _ in 1..n {
let c = a.checked_add(b)?;
a = b;
b = c;
}
Some(b)
}
pub fn checked_fibonacci_pair_naive<T: PrimitiveUnsigned>(n: u64) -> Option<(T, T)> {
if n == 0 {
return Some((T::ZERO, T::ONE));
}
let (mut a, mut b) = (T::ZERO, T::ONE);
for _ in 1..n {
let c = a.checked_add(b)?;
a = b;
b = c;
}
Some((b, a))
}
pub fn checked_lucas_number_naive<T: PrimitiveUnsigned>(n: u64) -> Option<T> {
if n == 0 {
return Some(T::TWO);
}
let (mut a, mut b) = (T::TWO, T::ONE);
for _ in 1..n {
let c = a.checked_add(b)?;
a = b;
b = c;
}
Some(b)
}
pub fn checked_lucas_number_pair_naive<T: PrimitiveUnsigned>(n: u64) -> Option<(T, T)> {
if n == 0 {
return None;
}
let (mut a, mut b) = (T::TWO, T::ONE);
for _ in 1..n {
let c = a.checked_add(b)?;
a = b;
b = c;
}
Some((b, a))
}