已知多項式 \(g(x)\) ,求 \(f(x)\) ,滿足:
\[g(f(x)) \equiv 0 \pmod
\]假設我們有乙個 \(f_0(x)\) 滿足:
\[g(f_0(x)) \equiv 0 \pmod \rceil}}
\]由定義可知:
\[f(x)-f_0(x)\equiv 0 \pmod \rceil}}
\]\[\rightarrow \forall k \ge 2, \left( f(x)-f_0(x) \frac{}{} \right)^k \equiv 0 \pmod
\]由泰勒展開:
\[\sum_^ \frac(f_0(x))}(f(x)-f_0(x))^i \equiv 0 \pmod
\]\[\rightarrow g(f_0(x))+g'(f_0(x))(f(x)-f_0(x)) \equiv 0 \pmod
\]\[\rightarrow f(x) \equiv f_0(x)-\frac \pmod
\]已知多項式 \(g(x)\) ,求 \(f(x)\) ,滿足:
\[f(x)g(x) \equiv 1 \pmod
\]假設我們有乙個 \(f_0(x)\) 滿足:
\[f_0(x)g(x) \equiv 1 \pmod \rceil}}
\]由 (一) 可知:
\[\left( f(x)-f_0(x) \frac{}{} \right)^2 \equiv 0 \pmod
\]\[\rightarrow f^2(x)-2f(x)f_0(x)+f_0^2(x) \equiv 0 \pmod
\]同乘 \(g(x)\):
\[\rightarrow f(x)-2f_0(x)+f_0^2(x)g(x) \equiv 0 \pmod
\]\[\rightarrow f(x) \equiv f_0(x)\left( 2-f_0(x)g(x) \frac{}{} \right)\pmod
\]注意 \(g\) 的長度也要控制為 \(len\) , 不然就退化成 \(\mathcal(nlog^2n)\) 的了。
poly inv( poly g )
return f;
}
雖然好寫但不知道為什麼常數那麼大
\[f(x)=\sum_^n f_ix^i
\]\[\begin
\rightarrow f'(x)&= \sum_^ if_i x^ \\
&= \sum_^ (i+1)f_ x^i
\end\]
poly der( poly f )
\[f(x)=\sum_^n f_ix^i
\]\[\begin
\rightarrow \int f(x)&= \sum_^ \frac x^\\
&= \sum_^ \frac} x^\\
\end\]
poly int( poly f )
已知多項式 \(g(x)\) , 求 \(f(x)\) , 滿足:
\[f(x) \equiv \ln g(x) \pmod
\]兩邊同時求導 (注意右式為復合函式):
\[f'(x) \equiv \frac \pmod
\]算完後積分回來就好了。
因為保證 \(g(0)=1\) , 所以積分常數 \(c\) 為 \(0\)。
poly ln( poly f )
已知多項式 \(g(x)\) , 求 \(f(x)\) , 滿足:
\[f(x) \equiv e^ \pmod
\]兩邊取 ln:
\[\ln f(x) \equiv g(x) \pmod
\]\[\ln f(x)-g(x) \equiv 0 \pmod
\]令 \(h(f(x)) \equiv \ln f(x) - g(x) \equiv
0 \pmod\) 。
兩邊求導:
\[h'(f(x)) \equiv \frac \pmod
\]\[\]
用牛頓迭代展開:
\[f(x) \equiv f_0(x)-\frac \pmod \]
\[\rightarrow f(x) \equiv f_0(x)-\frac(x)} \pmod
\]\[\rightarrow f(x) \equiv f_0(x)\left( 1-\ln f_0(x)+g(x) \frac{}{} \right) \pmod
\]
poly exp( poly f )
g.resize( len( f ) ); return g;
}
不知道為什麼mxlen
需要到 \(4\) 倍,希望有好心人指出。
已知多項式 \(g(x)\) , 求 \(f(x)\) , 滿足:
\[f(x) \equiv g^k(x) \pmod
\]同時取 ln 得到:
\[\ln f(x) \equiv k \ln g(x) \pmod
\]然後 exp 回去即可。
常數一目了然,不言而喻
poly pow( poly f , int k )
已知多項式 \(g(x)\) , 求 \(f(x)\) , 滿足:
\[f(x) \equiv \sqrt \pmod
\]使用多項式冪函式計算 \(g^}(x)\) ,複雜度 \(\mathcal\)
吸氧才能過
\[f(x) \equiv \sqrt \pmod
\]\[\rightarrow f^2(x) - g(x) \equiv 0 \pmod
\]令 \(h(f(x)) \equiv f^2(x)-g(x) \equiv 0\)
兩邊求導:
\[h'(f(x))=2f(x)
\]用牛頓迭代展開:
\[f(x) \equiv f_0(x)-\frac \pmod \]
\[\rightarrow f(x) \equiv f_0(x)-\frac \pmod
\]\[\rightarrow f(x) \equiv \frac \pmod
\]複雜度同樣是 \(\mathcal\)
當常數項不為 \(1\) 時,可以用二次剩餘算出結果。
int add( int x , int y )
int sub( int x , int y )
int mul( int x , int y )
int quick_pow( int x , int po )
int inv( int x )
int iv[ maxn + 5 ];
void init()
#define poly vector< int >
#define len( x ) ( (int)x.size() )
poly operator - ( int x , poly f )
poly operator - ( poly f , int x )
poly operator * ( poly f , int x )
poly operator + ( poly f , poly g )
poly operator - ( poly f , poly g )
const int g = 3 , ig = 332748118;
int lim , ilim , rev[ maxn + 5 ];
void ntt( poly &f , int op )
} }if( op == -1 ) for( int i = 0 ; i < lim ; i ++ ) f[ i ] = mul( f[ i ] , ilim );
}int mxlen = 100000000;
poly operator * ( poly f , poly g )
poly inv( poly f )
g.resize( len( f ) ); return g;
}poly der( poly f )
poly int( poly f )
poly ln( poly f )
poly exp( poly f )
g.resize( len( f ) ); return g;
}poly pow( poly f , int k )
poly sqrt( poly f )
g.resize( len( f ) ); return g;
}
多項式全家桶
眾所周知,生成函式是乙個十分強大的東西,許多與多項式相關的演算法也就應運而生了,在這裡選取幾種較為簡單的演算法做乙個介紹.p.s.這篇文章在去年noi前已經完成了一半,現在筆者將其補充完整後發出,同時也為了紀念那一段美好的時光。已知 f x 求 g x 使得 f x g x equiv 1 mod ...
多項式全家桶
include include includeusing namespace std const double pi acos 1.0 const int maxn 1e7 5 inline int read int n,m,len,lim 1 int r maxn struct complex c...
多項式全家桶 更新中
多項式全家桶 多項式加法 省略 多項式減法 省略 多項式乘法 多項式取逆 多項式取商 取模 多項式求導 多項式積分 多項式對數 多項式開方 未完成常數項 多項式指數 多項式冪次 未完成常數項為 0 多項式開 k 次方 未完成 多項式三角函式 多項式反三角函式 includeusing namespa...