多項式全家桶

2022-07-02 08:39:14 字數 4302 閱讀 8317

已知多項式 \(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...