use crate::ffi;
use core::ffi::c_uint;
pub fn laguerre(n: u32, x: f64) -> f64 {
unsafe { ffi::math_laguerre(n as c_uint, x) }
}
pub fn laguerre_assoc(n: u32, m: u32, x: f64) -> f64 {
unsafe { ffi::math_laguerre_assoc(n as c_uint, m as c_uint, x) }
}
#[inline(always)]
#[allow(non_snake_case)]
pub fn laguerre_next(n: u32, x: f64, Ln: f64, Ln_prev: f64) -> f64 {
laguerre_assoc_next(n, 0, x, Ln, Ln_prev)
}
#[inline(always)]
#[allow(non_snake_case)]
pub fn laguerre_assoc_next(n: u32, m: u32, x: f64, Ln: f64, Ln_prev: f64) -> f64 {
(((2 * n + m + 1) as f64 - x) * Ln - (n + m) as f64 * Ln_prev) / (n + 1) as f64
}
#[cfg(test)]
mod tests {
use crate::math::{laguerre, laguerre_assoc};
const RTOL: f64 = 1e-15;
#[test]
fn test_laguerre() {
assert_relative_eq!(laguerre(1, 0.0), 1.0, epsilon = RTOL);
assert_relative_eq!(laguerre(2, 0.0), 1.0, epsilon = RTOL);
assert_relative_eq!(laguerre(3, 0.0), 1.0, epsilon = RTOL);
assert_relative_eq!(laguerre(4, 0.0), 1.0, epsilon = RTOL);
assert_relative_eq!(laguerre(1, 1.0), 0.0, epsilon = RTOL);
assert_relative_eq!(laguerre(2, 1.0), -0.5, epsilon = RTOL);
assert_relative_eq!(laguerre(3, 1.0), -2.0 / 3.0, epsilon = RTOL);
assert_relative_eq!(laguerre(4, 1.0), -5.0 / 8.0, epsilon = RTOL);
}
#[test]
fn test_laguerre_assoc() {
assert_relative_eq!(laguerre_assoc(1, 0, 0.0), 1.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(2, 0, 0.0), 1.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(3, 0, 0.0), 1.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(4, 0, 0.0), 1.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(1, 0, 1.0), 0.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(2, 0, 1.0), -0.5, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(3, 0, 1.0), -2.0 / 3.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(4, 0, 1.0), -5.0 / 8.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(1, 1, 0.0), 2.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(2, 1, 0.0), 3.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(3, 1, 0.0), 4.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(4, 1, 0.0), 5.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(1, 1, 1.0), 1.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(2, 1, 1.0), 0.5, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(3, 1, 1.0), -1.0 / 6.0, epsilon = RTOL);
assert_relative_eq!(laguerre_assoc(4, 1, 1.0), -19.0 / 24.0, epsilon = RTOL);
}
}