pub struct FibonacciValue {
pub index: u8,
pub fib_value: u128,
}
pub mod lib_fibonacci {
pub use super::*;
pub fn kernel(mut n: u8) -> FibonacciValue {
let mut value_before = FibonacciValue {
index: 0,
fib_value: 1,
};
let mut value_now = FibonacciValue {
index: 0,
fib_value: 1,
};
let mut exchange = FibonacciValue {
index: 0,
fib_value: 1,
};
let mut index: u8 = 0;
n = n - 1;
while n > index {
exchange = FibonacciValue {
index: index,
fib_value: value_before.fib_value + value_now.fib_value,
};
value_before = value_now;
value_now = exchange;
index += 1;
}
return value_now;
}
pub fn kernel_recursion(n: u8) -> FibonacciValue {
if n == 0 {
return FibonacciValue {
index: 0,
fib_value: 1,
};
}
if n == 1 {
return FibonacciValue {
index: 0,
fib_value: 1,
};
}
return FibonacciValue {
index: n,
fib_value: kernel_recursion(n - 1).fib_value + kernel_recursion(n - 2).fib_value,
};
}
fn abs(number: i128) -> i128 {
if number > 0 {
return number;
} else {
return -number;
}
}
fn involution(mut number: f64, mut times: i8) -> f64 {
let n: f64 = number;
while abs(times.into()) > 0 {
number *= n;
times -= 1
}
if times == 0 {
return match number {
0.0 => 0.0,
_ => 1.0,
};
}
return number;
}
pub fn kernel_linear_algebra(n: u8) -> f64 {
let result: f64 = (involution(1.618035, n.try_into().unwrap())
- involution(-0.61803399, n.try_into().unwrap()))
* 0.4472136;
return result;
}
}
pub trait Iterator {
fn next(&mut self) -> FibonacciValue;
}
impl Iterator for FibonacciValue {
fn next(&mut self) -> FibonacciValue {
return lib_fibonacci::kernel(self.index+1);
}
}