多項式開根小結

2021-10-06 08:11:02 字數 3466 閱讀 9515

跟 exp

expex

p 套路是一樣的,套乙個牛頓迭代就出來了。

給出多項式 a(x

)a(x)

a(x)

,求出乙個多項式 g(x

)g(x)

g(x)

滿足 g2(

x)≡a

(x)(

modx

n)

g^2(x)\equiv a(x)\pmod

g2(x)≡

a(x)

(mod

xn)。

設 f (g

(x))

=g2(

x)−a

(x

)f(g(x))=g^2(x)-a(x)

f(g(x)

)=g2

(x)−

a(x)

,那麼就是要求出 f

ff 的零點。

考慮倍增,當 n=1

n=1n=

1 時,這題保證了 a(x

)=

1a(x)=1

a(x)=1

,故 g(x

)=

1g(x)=1

g(x)=1

。假設此時已經求出了 g0(

x)

g_0(x)

g0​(x)

,滿足 g02

(x)≡

a(x)

(mod

x⌈n2

⌉)

g_0^2(x)\equiv a(x)\pmod }

g02​(x

)≡a(

x)(m

odx⌈

2n​⌉

),根據牛頓迭代,有

g (x

)=g0

(x)−

f(g0

(x))

f′(g

0(x)

)=g0

(x)−

f(g0

(x))

2g0(

x)=g

02(x

)+a(

x)2g

0(x)

\begin g(x)&=g_0(x)-\frac \\ &=g_0(x)-\frac \\ &=\frac \\ \end

g(x)​=

g0​(

x)−f

′(g0

​(x)

)f(g

0​(x

))​=

g0​(

x)−2

g0​(

x)f(

g0​(

x))​

=2g0

​(x)

g02​

(x)+

a(x)

​​於是就做完了,**如下:

#include

#include

#include

#include

#include

using

namespace std;

#define maxn 600010

#define mod 998244353

#define bin(x) (1<<(x))

int n;

int inv[maxn]

;int

ksm(

int x,

int y)

#define inv(x) ksm(x,mod-2)

struct ntt

}int r[maxn]

,limit;

void

dft(

int*f,

int lg,

int type=0)

for(

int mid=

1,lg=

1;mid1,lg++

)for

(int j=

0;j=(mid<<1)

)for

(int i=

0;i}ntt;

int a[maxn]

,b[maxn]

,c[maxn]

,m;struct poly

poly()

int&

operator

(int x)

friend

const poly operator

*(poly a_,

const

int x)

void

dft(

int*a_,

int lg,

int ln)

void

idft

(int

*a_,

int lg,

int ln)

const poly mul

(poly b,

int ln=m)

}f,g;

void

getinv

(poly &f,poly &g,

int ln=m)

getinv

(f,g,

(ln+1)

>>1)

;int lg=

ceil

(log2(2

*ln-1)

);f.

dft(a,lg,ln)

;g.dft

(b,lg,ln)

;for

(int i=

0;i<

bin(lg)

;i++

)b[i]

=1ll*(

2ll-

1ll*a[i]

*b[i]

%mod+mod)

%mod*b[i]

%mod;g.

idft

(b,lg,ln);}

void

getsqrt

(poly &f,poly &g,

int ln=m)

getsqrt

(f,g,

(ln+1)

>>1)

;poly p=g*

2,pp;

getinv

(p,pp,ln)

;int lg=

ceil

(log2

(ln+ln-1)

);f.

dft(a,lg,ln)

;g.dft

(b,lg,ln)

;pp.

dft(c,lg,ln)

;for

(int i=

0;i<

bin(lg)

;i++

)c[i]

=1ll*(

1ll*b[i]

*b[i]

%mod+a[i]

)%mod*c[i]

%mod;g.

idft

(c,lg,ln);}

intmain()

多項式求逆與多項式開根

閒著沒事幹研究些黑科技 霧 求 a x b x 1 mod x n 其中n為a x b x 的度的較大值 已知a x 求b x b x a x 1 mod x n 假設n 1,則b x a x 常數項在mod p 意義下的的逆元 假設n 1 已知 a x b x 1 mod x n 2 a x b ...

洛谷5205 模板 多項式開根

點此看題面 大致題意 給定多項式 f x 求 g x 滿足 g x 2 equiv f x mod x n 向 998244353 取模。在知道多項式乘法逆的前提下,這道題的推導其實是非常簡單,甚至要簡單於多項式乘法逆的。但由於多項式開根最後的求解依然需要用到多項式乘法逆,所以總體難度還是高於多項式...

Luogu P5205 模板 多項式開根

給定乙個 n 1 次多項式 a x 求乙個在 bmod x n 意義下的多項式 b x 使得 b 2 x equiv a x bmod x n 多項式的係數在 bmod 998244353 的意義下進行運算。n leq 10 5,a i in 0,998244352 cap mathbb 其實推導過...