學習筆記 多項式相關

2022-05-02 05:12:07 字數 3000 閱讀 6684

學多項式也有好久了,可是我自己還沒怎麼認認真真推過柿子,導致啥都不會,然後被吊打。

看來再不回顧一下就不行了啊。

寫了乙個好看一點的 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 換言之...