1use crate::math::fps::inv::*;
3use crate::math::polynomial::{Polynomial, PolynomialOperator};
4use crate::num::ff::*;
5
6pub trait FpsLog {
8 type Poly;
10
11 fn fps_log(&self, f: Self::Poly) -> Self::Poly;
13}
14
15impl<const P: u32, const PR: u32> FpsLog for PolynomialOperator<'_, P, PR> {
16 type Poly = Polynomial<P>;
17
18 fn fps_log(&self, f: Self::Poly) -> Self::Poly {
19 assert_eq!(f.coeff_of(0).value(), 1);
20 let n = f.len();
21 let a = self.differentiate(f.clone());
22 let b = self.fps_inv(f);
23 let c = self.mul(a, b);
24 let mut ret = self.integrate(c);
25 ret.as_mut().resize(n, 0.into());
26 ret
27 }
28}