use num::complex::ComplexFloat;
use std::fmt;
use std::ops;
pub use peroxide::numerical::integral::Integral;
pub type R = f64;
pub type C = num::Complex<R>;
pub type NCTYPE = u32;
pub type NFTYPE = u32;
pub trait Num:
Copy
+ num::Num
+ fmt::Debug
+ fmt::Display
+ ops::Add<R, Output = Self>
+ ops::Mul<R, Output = Self>
+ ops::Div<R, Output = Self>
+ ops::Sub<R, Output = Self>
+ ops::Neg<Output = Self>
+ ops::Add<C, Output = C>
+ ops::Sub<C, Output = C>
+ ops::Mul<C, Output = C>
+ ops::Div<C, Output = C>
+ From<R>
+ Into<C>
{
fn abs(&self) -> R;
fn exp(&self) -> Self;
fn im(&self) -> R;
fn inv(&self) -> Self;
fn ln(&self) -> Self;
fn re(&self) -> R;
fn sqrt(&self) -> Self;
}
impl Num for R {
#[inline(always)]
fn abs(&self) -> R {
(*self as Self).abs()
}
#[inline(always)]
fn exp(&self) -> Self {
(*self as Self).exp()
}
#[inline(always)]
fn im(&self) -> R {
0.
}
#[inline(always)]
fn inv(&self) -> Self {
1. / self
}
#[inline(always)]
fn ln(&self) -> Self {
(*self as Self).ln()
}
#[inline(always)]
fn re(&self) -> R {
*self
}
#[inline(always)]
fn sqrt(&self) -> Self {
(*self as Self).sqrt()
}
}
impl Num for C {
#[inline(always)]
fn abs(&self) -> R {
(*self as Self).abs()
}
#[inline(always)]
fn exp(&self) -> Self {
(*self as Self).exp()
}
#[inline(always)]
fn im(&self) -> R {
self.im
}
#[inline(always)]
fn inv(&self) -> Self {
1. / self
}
#[inline(always)]
fn ln(&self) -> Self {
(*self as Self).ln()
}
#[inline(always)]
fn re(&self) -> R {
self.re
}
#[inline(always)]
fn sqrt(&self) -> Self {
(*self as Self).sqrt()
}
}