說好了,這個作用不大,主要是……過一下板子,趕時間的小朋友可以右上角叉叉了……
1. 多項式Sin & 多項式Cos
P5264 【模板】多項式三角函數
歐拉公式:
eix=cosx+isinx
直接推公式:
e−ix=cosx−isinx
加減一下得到:
2cosx=eix+e−ix
2isinx=eix−e−ix
所以有:
cosx=ieix+e−ix
sinx=2ieix−e−ix
用多項式A替換掉 x 即可:
cos(A)=iexp(i⋅A)+exp(−i⋅A)
sin(A)=2iexp(i⋅A)−exp(−i⋅A)
多項式卷單項式,exp,求逆,多項式卷多項式就好了,現在問題是 i 怎麼搞:
已知 i2=−1,所以說 i 既是 mod−1 在 %mod意義下的二次剩餘,具體怎麼算二次剩餘呢,可以看這裏,顯然可以預處理出來,前置和目錄裏面已經說的有了,既爲img。
inline Polynomial Sin(const Polynomial &a){
return (Exponential(a*img)-Exponential(a*(mod-img)))*Inv(2ll*img%mod);
}
inline Polynomial Cos(const Polynomial &a){
return (Exponential(a*img)+Exponential(a*(mod-img)))*Inv(2);
}
2. 多項式Asin & 多項式Atan
P5265 【模板】多項式反三角函數
這個東西比較麻煩啦,直接給公式咯,具體證明可以看教材:
Asin(A)=∫1−A2A′dx
Atan(A)=∫1+A2A′dx
inline Polynomial Asin(const Polynomial &a){
Polynomial As_a=a*a;
As_a.resize(a.size());
for(int i=0;i<a.size();i++)As_a[i]=(mod-As_a[i]);
As_a[0]=(1+As_a[0])%mod;
return Integral(Derivation(a)*Inverse(Kth_root(As_a,2)));
}
inline Polynomial Atan(const Polynomial &a){
Polynomial At_a=a*a;
At_a.resize(a.size());At_a[0]=(1+At_a[0])%mod;
return Integral(Derivation(a)*Inverse(At_a));
}