1pub mod exp;
14pub mod inv;
15pub mod log;
16pub mod pow;
17pub mod sqrt;
18
19#[cfg(test)]
20mod tests {
21 use super::{exp::*, inv::*, log::*, pow::*};
22
23 use crate::math::ntt::*;
24 use crate::math::polynomial::*;
25
26 #[test]
27 fn test_inv() {
28 let ntt = NTT998244353::new();
29 let po = PolynomialOperator::new(&ntt);
30
31 let a: Vec<u32> = vec![5, 4, 3, 2, 1];
32 let b = po.fps_inv(a.clone().into());
33
34 assert_eq!(
35 po.mul(a.into(), b).get_until(5),
36 Polynomial::constant(1_u32.into())
37 );
38 }
39
40 #[test]
41 fn test_log() {
42 let ntt = NTT998244353::new();
43 let po = PolynomialOperator::new(&ntt);
44
45 let a: Vec<u32> = vec![1, 1, 499122179, 166374064, 291154613];
46 let b = po.fps_log(a.clone().into());
47
48 assert_eq!(b, vec![0, 1, 2, 3, 4].into());
49 }
50
51 #[test]
52 fn test_exp() {
53 let ntt = NTT998244353::new();
54 let po = PolynomialOperator::new(&ntt);
55
56 let a: Vec<u32> = vec![0, 1, 2, 3, 4];
57 let b = po.fps_exp(a.clone().into());
58 let b = po.fps_log(b);
59
60 assert_eq!(b, a.into());
61 }
62
63 #[test]
64 fn test_pow() {
65 let ntt = NTT998244353::new();
66 let po = PolynomialOperator::new(&ntt);
67
68 let a: Vec<u32> = vec![0, 0, 9, 2];
69 let b = po.fps_pow(a.clone().into(), 3);
70 assert_eq!(b, vec![0, 0, 0, 0].into());
71
72 let a: Vec<u32> = vec![1, 1];
73 let b = po.fps_pow(a.clone().into(), 2);
74 assert_eq!(b, vec![1, 2].into());
75
76 let a: Vec<u32> = vec![0, 0];
77 let b = po.fps_pow(a.clone().into(), 0);
78 dbg!(b);
79 }
80}