use std::ptr;
use crate::numerical::number_theory as nt;
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_nt_gcd(
a: u64,
b: u64,
) -> u64 {
nt::gcd(a, b)
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_nt_lcm(
a: u64,
b: u64,
) -> u64 {
nt::lcm(a, b)
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_nt_mod_pow(
base: u128,
exp: u64,
modulus: u64,
) -> u64 {
nt::mod_pow(base, exp, modulus)
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_nt_mod_inverse(
a: i64,
m: i64,
) -> i64 {
nt::mod_inverse(a, m).unwrap_or(0)
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_nt_is_prime(n: u64) -> bool {
nt::is_prime_miller_rabin(n)
}
#[unsafe(no_mangle)]
pub const extern "C" fn rssn_num_nt_phi(n: u64) -> u64 {
nt::phi(n)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_num_nt_factorize(
n: u64,
out_factors: *mut u64,
) -> usize {
unsafe {
let factors = nt::factorize(n);
if !out_factors.is_null() {
ptr::copy_nonoverlapping(factors.as_ptr(), out_factors, factors.len());
}
factors.len()
}
}