多項式牛頓迭代
公式:$f(z) \equiv f_0(z) - \frac \pmod $
(以下截圖自金策2015**)
(研究了很久都沒有明白那個泰勒展開的求導為什麼是對的...好像是把a(x)當成了」常數項「...?把f看成」變數「???但是g這個函式應該是輸入乙個函式輸出乙個函式吧,根本就不是一般的函式,真的能求導嗎?但是這種做法的確具有通用性,在多項式開根等也可以用,很迷)
upd190323:大概感受了一下,以下是口胡:
首先,假設x是常數。設y=f(x),現在f沒有確定,因此y不是常數。g(y)=ln(y)-a(x),其中a(x)是常數
現在,對於這個確定的x可以用牛頓迭代求出y的零點。$g(y_0)+g'(y_0)(y-y_0)=0$,$y=y_0-\frac$
可以發現,對於每乙個x,每一次迭代求出來的y是固定的。每一次迭代求出的y與x之間存在乙個函式關係。
因此,如果x不是常數,仍然可以用這樣的方法做多項式牛頓迭代。
(不過,就算求導是錯的,最後的結論式子也應當是對的?直接兩邊求ln?(好像也不對)不懂...先鴿著吧)
式子可以寫成$f(x)=f_0(x)+f_0(x)(a(x)-ln(f_0(x))$,可以先算$a(x)-ln(f_0(x))$,根據牛頓迭代那套理論這個後面一半全是0,可以用來簡單優化常數
當然,輸入多項式要求常數項是0(因為要求模意義下常數的exp,這個只能對0求),輸出多項式常數項就是1
(式子裡面$ln(f_0(x))$求的是長度為len的ln(設$f_0$的長度為len/2,空的部分補0),不是特別懂)
版本1:基於版本3
1view code#prag\
2 ma gcc optimize(2
)3 #include4 #include5 #include6 #include7 #include8
using
namespace
std;
9#define fi first
10#define se second
11#define mp make_pair
12#define pb push_back
13 typedef long
long
ll;14 typedef unsigned long
long
ull;
15const
int md=998244353;16
const
int n=262144;17
#define delto(a,b) ((a)-=(b),((a)<0)&&((a)+=md))
18 inline int del(int a,int
b)19
23int
rev[n];
24void init(int
len)
2531
ull poww(ull a,ull b)
3239
void dft(int *a,int len,int idx)//
要求len為2的冪
4059}60
}61if(idx==-1)62
67}68void p_inv(int *f,int *g,int len)//
g=f^(-1);f,g陣列的長度不小於2len(需要足夠長用於臨時存放元素) ;要求len是2的冪
6992}93
int inv[300011
];94 inline void p_de(int *f,int len)//
derivative求導;f=f'
95100 inline void p_in(int *f,int len)//
integral積分;f=?f
101106
void p_ln(int *f,int len)//
要求len為2的冪
107116
void p_exp(int *f,int *g,int len)//
要求len為2的冪,f[0]=0
117139
}140
int a[n<<1],b[n<<1
];141
intn,n1;
142int
main()
143
版本2:基於此題版本1
1view code#prag\
2 ma gcc optimize(2
)3 #include4 #include5 #include6 #include7 #include8
using
namespace
std;
9#define fi first
10#define se second
11#define mp make_pair
12#define pb push_back
13 typedef long
long
ll;14 typedef unsigned long
long
ull;
15const
int md=998244353;16
const
int n=262144;17
#define delto(a,b) ((a)-=(b),((a)<0)&&((a)+=md))
18 inline int del(int a,int
b)19
23int
rev[n];
24void init(int
len)
2531
ull poww(ull a,ull b)
3239
int inv[300011
];40
void dft(int *a,int len,int idx)//
要求len為2的冪
4160}61
}62if(idx==-1)63
68}69void p_inv(int *f,int *g,int len)//
g=f^(-1);f,g陣列的長度不小於2len(需要足夠長用於臨時存放元素);要求len是2的冪
7093
}94 inline void p_de(int *f,int len)//
derivative求導;f=f'
95100 inline void p_in(int *f,int len)//
integral積分;f=?f
101106
void p_ln(int *f,int len)//
要求len為2的冪,f[0]=1
107116
void p_exp(int *f,int *g,int len)//
要求len為2的冪,f[0]=0
117139
}140
inta[n],b[n];
141int
n,n1;
142int
main()
143
Luogu 4726 模板 多項式指數函式
補補補 這個題的解法讓我認識到了泰勒展開的美妙之處。泰勒展開就是用乙個多項式型的函式去逼近乙個難以準確描述的函式。有公式在這裡 g 表示 g 的 n 階導。在 0 這個點的泰勒展開 x 0 0 叫做麥克勞林級數,利用這個東西可以很精確地去逼近原來的函式。比如,有了泰勒展開之後我們可以定義一些看上去很...
洛谷 P3803 模板 多項式乘法(FFT)
fft模板題 單向膜拜 從多項式乘法到快速傅利葉變換 fft 學習筆記 大致理解為將多項式從係數表示法轉化為點值表示法然後再變回係數表示法 include include include define n 2621450 define pi acos 1.0 using namespace std ...
洛谷P4238 模板 多項式求逆
題目傳送門 題目分析 放個板子在blog上,以後複習的時候用。注意每一次呼叫poly rev 的時候都要重新計算一遍rev陣列,而且要先清0。求modxm modx m下的逆元的時候,注意ntt的次數界要開到2m,因為a x g2 x a x g2 x 的次數界加起來為m m2 m 2 2 2m 2...