// codesnip-guard: Polynomial #[cfg_attr(any(),rustfmt::skip)]#[derive(Clone,Debug,Default,PartialEq,Eq)]pub struct Polynomial{pub data:Vec}#[cfg_attr(any(),rustfmt::skip)]mod polynomial_impls{use super::*;use std::ops::{Add,Div,Index,IndexMut,Mul,Rem,Sub};implPolynomial{pub fn from_vec(data:Vec)->Self{Self{data}}pub fn length(&self)->usize{self.data.len()}}implZero for Polynomial{fn zero()->Self{Self::from_vec(Vec::new())}}implOne for Polynomialwhere T:One{fn one()->Self{Self::from_vec(vec![One::one()])}}impl+Mul>Polynomial{pub fn assign(&self,x:T)->T{let mut res=Zero::zero();for c in self.data.iter().rev().cloned(){res=res*x.clone()+c;}res}}implIndexfor Polynomial{type Output=T;fn index(&self,index:usize)->&Self::Output{&self.data[index]}}implIndexMutfor Polynomial{fn index_mut(&mut self,index:usize)->&mut Self::Output{&mut self.data[index]}}impl>Add<&Polynomial>for&Polynomial{type Output=Polynomial;fn add(self,rhs:&Polynomial)->Self::Output{let(x,y)=if self.length()Sub<&Polynomial>for&Polynomialwhere T:Copy+Zero+Sub{type Output=Polynomial;fn sub(self,rhs:&Polynomial)->Self::Output{let mut x=self.clone();x.data.resize(self.length().max(rhs.length()),Zero::zero());for(a,&b)in x.data.iter_mut().zip(&rhs.data){*a=*a-b;}x}}impl+Mul>Mul<&Polynomial>for&Polynomial{type Output=Polynomial;fn mul(self,rhs:&Polynomial)->Self::Output{if self.data.is_empty()||rhs.data.is_empty(){return Polynomial::zero();}let mut res=Polynomial::from_vec(vec![Zero::zero();self.length()+rhs.length()-1]);for i in 0..self.length(){for j in 0..rhs.length(){res[i+j]=res[i+j]+self[i]*rhs[j];}}res}}impl+Mul+Div>Div<&Polynomial>for&Polynomial{type Output=Polynomial;fn div(self,rhs:&Polynomial)->Self::Output{let mut x=self.clone();let mut res=Polynomial::from_vec(vec![]);for i in(rhs.length()-1..x.length()).rev(){let t=x[i]/rhs[rhs.length()-1];res.data.push(t);for j in 0..rhs.length(){x[i-j]=x[i-j]-t*rhs[rhs.length()-1-j];}}res.data.reverse();res}}impl+Mul+Div>Rem<&Polynomial>for&Polynomial{type Output=Polynomial;fn rem(self,rhs:&Polynomial)->Self::Output{let mut x=self.clone();for i in(rhs.length()-1..x.length()).rev(){let t=x[i]/rhs[rhs.length()-1];for j in 0..rhs.length(){x[i-j]=x[i-j]-t*rhs[rhs.length()-1-j];}}x.data.truncate(rhs.length()-1);x}}impl+Mul>Polynomial{pub fn pow(&self,mut n:usize)->Self{let mut x=self.clone();let mut res=Self::one();while n>0{if n&1==1{res=&res*&x;}n>>=1;if n!=0{x=&x*&x;}}res}}} // codesnip-guard: zero_one #[cfg_attr(any(),rustfmt::skip)]pub use self::zero_one::{One,Zero};#[cfg_attr(any(),rustfmt::skip)]mod zero_one{pub trait Zero:Sized{fn zero()->Self;#[inline]fn is_zero(&self)->bool where Self:PartialEq{self==&Self::zero()}#[inline]fn set_zero(&mut self){*self=Self::zero();}}pub trait One:Sized{fn one()->Self;#[inline]fn is_one(&self)->bool where Self:PartialEq{self==&Self::one()}#[inline]fn set_one(&mut self){*self=Self::one();}}macro_rules!impl_zero_one{($({$(<$T:ident:$Bound:ident>)?$Trait:ident$method:ident$($t:ty)*,$e:expr})*)=>{$(impl_zero_one!(@impl[$(<$T:$Bound>)?]$Trait$method[$($t)*],$e);)*};(@impl[<$T:ident:$Bound:ident>]$Trait:ident$method:ident[$($t:ty)*],$e:expr)=>{$(impl<$T:$Bound>$Trait for$t{fn$method()->Self{$e}})*};(@impl[]$Trait:ident$method:ident[$($t:ty)*],$e:expr)=>{$(impl$Trait for$t{fn$method()->Self{$e}})*};}impl_zero_one!({Zero zero u8 u16 u32 u64 usize i8 i16 i32 i64 isize u128 i128,0}{Zero zero f32 f64,0.}{One one u8 u16 u32 u64 usize i8 i16 i32 i64 isize u128 i128,1}{One one f32 f64,1.}{Zero zero std::num::Wrapping,Self(T::zero())}{One one std::num::Wrapping,Self(T::one())});}