use nalgebra::Complex;
use crate::arithmetic_utils::{sigma_3, sigma_5};
use super::modular_def::{ModularError, ModularForm, Sl2Z};
#[derive(Clone, Copy)]
pub struct EisensteinE4;
#[allow(clippy::cast_precision_loss)]
impl ModularForm<8, Complex<f64>> for EisensteinE4 {
type TransformationGroup = Sl2Z;
fn extract_coeffs(&self, which_coeff: usize) -> Result<Complex<f64>, ModularError> {
if which_coeff == 0 {
Ok(Complex::new(1.0, 0.0))
} else {
let re_ans = 240.0 * sigma_3(which_coeff) as f64;
Ok(Complex::new(re_ans, 0.0))
}
}
fn evaluate_at(&self, _q: &Complex<f64>) -> Result<Complex<f64>, ModularError> {
Err(ModularError::Unavailable)
}
}
#[allow(dead_code)]
#[derive(Clone, Copy)]
pub struct EisensteinE6;
#[allow(clippy::cast_precision_loss)]
impl ModularForm<12, Complex<f64>> for EisensteinE6 {
type TransformationGroup = Sl2Z;
fn extract_coeffs(&self, which_coeff: usize) -> Result<Complex<f64>, ModularError> {
if which_coeff == 0 {
Ok(Complex { re: 1.0, im: 0.0 })
} else {
let re_ans = -504.0 * sigma_5(which_coeff) as f64;
Ok(Complex {
re: re_ans,
im: 0.0,
})
}
}
fn evaluate_at(&self, _q: &Complex<f64>) -> Result<Complex<f64>, ModularError> {
Err(ModularError::Unavailable)
}
}