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