學多項式也有好久了,可是我自己還沒怎麼認認真真推過柿子,導致啥都不會,然後被吊打。
看來再不回顧一下就不行了啊。
寫了乙個好看一點的 ntt 板子,僅供參考。
inline int add(int x, int y)
inline int sub(int x, int y)
inline int mul(int x, int y)
int fastpow(int x, int y)
int r[maxn], w[maxn];
void fft(int *p, int n)
}templatevoid polymul(int *a, int *b, int n, int p, c cal)
如果 \(f(x)\) 在 \(x_0\) 處存在 \(n\) 階導,那麼有:
\[f(x) = \sum_^n \frac (x_0)} (x - x_0) ^ i + \xi
\]其中 \(\xi\) 是餘項,當 \(n\) 趨近於無窮大時,\(\xi\) 趨近於高階無窮小。
比如說 \(e ^ x = 1 + \frac x + \frac + \cdots\)
首先可以知道多項式的任何乙個運算都可以表示成對於乙個多項式 \(b(x)\) 以及乙個給定的函式 \(f(x)\),求 \(f(b(x)) \equiv 0 \pmod \)
設 \(b_n(x)\) 表示當模數是 \(x ^ n\) 的合法解。那麼當 \(n = 1\) 是我們很容易可以得到結果,考慮如何用 \(b_n(x)\) 推到 \(b_(x)\)。
對 \(f(b_(x))\) 在 \(b_n(x)\) 處泰勒展開,我們得到\(f(b_(x)) = f(b_n(x)) + f'(b_n(x))(b_(x) - b_n(x))\)。
那麼我們化簡一下就是:
\[b_(x) = b_n(x) - \frac
\]這樣我們就可以倍增求解。
接下來均假設我們要做運算的多項式是 \(a(x)\)。
多項式求逆
並不需要牛頓迭代。
\[\begin
ab_n &\equiv 1 \pmod \\
(ab_n - 1)^2 &\equiv 0 \pmod }\\
a(2b_n - ab_n^2) &\equiv 1 \pmod }
\end
\]由此可得:\(b_ = b_n(2 - ab_n)\),這種初等推導可以應用到更加廣泛的運算中(如係數是矩陣)。
void inv(int *a, int *b, int n)
); std::fill(b + n, b + l, 0);
}
ln 一下再 exp 一下
也不需要牛頓迭代。
\[\begin
b_n &\equiv \sqrt a \pmod \\
(b_n - \sqrt a)^2 &\equiv 0 \pmod }\\
b_n^2 - 2b_n \sqrt a + a &\equiv 0 \pmod }\\
\frac 12 \left(b_n - \frac a\right) &\equiv \sqrt a \pmod }
\end
\]也就是說,\(b_ = \frac 12 \left(b_n - \frac a\right)\)。可以看出多項式開根中需要套用多項式求逆。
void sqrt(int *a, int *b, int n)
同樣不需要牛頓迭代。
\[\begin
\ln a &= b \\
\rightarrow\frac &= b'
\end
\]然後就將 \(a\) 求導求逆,乘起來再積分一下就可以了。
void ln(int *f, int *g, int n)
令 \(f(b_n(x)) = \ln(b_n(x)) - a(x) \equiv 0\)
推下式子可得:
\[\begin
b_(x) &= b_n(x) - \frac } \\
&= b_n(x)(1 - \ln(b_n(x)) + a(x))
\end
\]
void exp(int *a, int *b, int n)
給定乙個 \(n\) 次多項式 \(a(x)\) 和乙個 \(m\) 次多項式 \(b(x)\),求解乙個 \(n - m\) 次的多項式 \(q(x)\) 以及乙個小於 \(n - m\) 次的多項式 \(r(x)\),使得 \(a(x) = q(x)b(x) + r(x)\)
假設 \(f\) 是乙個 \(n\) 次多項式,定義運算 \(r\) 使得 \(f^r(x) = x ^ nf(\frac 1x)\),也就是說將 \(f\) 的係數翻轉。
那麼可以得到:
\[\begin
a(x) &= q(x)b(x) + r(x) \\
a\left(\frac 1x\right) &= q\left(\frac 1x\right)b\left(\frac 1x\right) + r\left(\frac 1x\right) \\
x ^ na\left(\frac 1x\right) &= \left(x ^ m b\left(\frac 1x\right)\right) \left( x ^ q\left(\frac 1x\right)\right) + x ^ n r\left(\frac 1x\right) \\
a^r(x) &= q^r(x)b^r(x) + x^r^r(x) \\
a^r(x) &\equiv q^r(x)b^r(x) \pmod} \\
q^r(x) &\equiv \frac \pmod}
\end
\]那麼這樣就可以用多項式求逆求出 \(q\),再用 \(r(x) = a(x) - q(x)b(x)\) 即可求出 \(r\),於是就完成了多項式除法和多項式取模。
多項式相關學習筆記
已知 f x 求 g x 令 f x times g x equiv 1 text x n 假設當前求出了 g 0 f times g 0 equiv 1 text x rceil 並且我們有 f times g equiv 1 text x rceil 相減得 g g 0 equiv 0 text...
學習筆記 多項式相關演算法
手動部落格搬家 本文發表於20181125 13 19 28,原位址 最近學了一下多項式相關演算法,簡單記錄一下 記號說明 o af n 表示時間複雜度 o f n fft的常數為 a 例如,進行了 6 次大小為 2n 的dft idft,則複雜度為 o 12n log n 以下的常數都是以我的實現...
學習筆記 多項式
給你n個點 x 1,y 1 x 2,y 2 求乙個n 1次的多項式 f x 求 f k 我們可以認為 f x f 1 x f 2 x f x 其中 f i x i y i 且 forall j neq i,f i x j 0 也就是說乙個點 x i 只在乙個函式中為 y i 其他函式中均為0 換言之...