2019年8月10日土曜日

ABC 137 F - Polynomial Construction

ABC 137 F - Polynomial Construction

g(x):=x(x1)...(xp+1)g(x) := x(x-1)...(x-p+1), gi(x):=g(x)/(xi)g_i(x) := g(x)/(x-i)と定める。ai=1a_i=1である添え字iii1,i2,...,iki_1, i_2, ..., i_kとするとき、求める多項式ffは次のように書ける:

f(x):=gi1(x)/gi1(i1)+gi2(x)/gi2(i2)+...+gik(x)/gik(ik)f(x) := g_{i_1}(x)/g_{i_1}(i_1) + g_{i_2}(x)/g_{i_2}(i_2) + ... + g_{i_k}(x)/g_{i_k}(i_k)

したがって、g(x)g(x)を多項式乗算で求めたあと、必要なiiについてxix-iで割ってgi(x)g_i(x)を求めればよい。 乗算は最初はFFTでやったのだが、よく考えると一次式を掛けていくだけなので素朴な掛け算でO(p){\mathcal O}(p)だった。割り算も同様で、一次式で割るので高速な多項式除算を実現する必要はない。つまり、

g(x)=αpxp+αp1xp1+...+α1x+α0g(x) = \alpha_{p}x^{p}+\alpha_{p-1}x^{p-1} + ... + \alpha_1x + \alpha_0

g(x)=(xi)(βp1xp1+βp2xp2+...+β0)=βp1xp+(βp2iβp1)xp1+...+(β0iβ1)xβ0i\begin{aligned} g(x) & = (x-i)(\beta_{p-1}x^{p-1}+\beta_{p-2}x^{p-2} + ... + \beta_0) \\ & = \beta_{p-1}x^p+(\beta_{p-2}-i\beta_{p-1})x^{p-1}+...+(\beta_0-i\beta_1)x- \beta_0i \end{aligned}

の2つの式を比較すると

βp1=αpβp2=αp1+iβp1...β0=α1+iβ1\beta_{p-1} = \alpha_p\\ \beta_{p-2} = \alpha_{p-1} + i\beta_{p-1} \\ ... \\ \beta_0 = \alpha_1 + i\beta_1

となっていて、βp1\beta_{p-1}から順次求まることがわかる。計算量はO(p2){\mathcal O}(p^2)


O(N2){\mathcal O}(N^2)の素朴な乗算と組立除法をやっているだけなので、ライブラリとして用意しておいたほうが良さそう。

http://web.cs.iastate.edu/~cs577/handouts/polydivide.pdf
一般の多項式除算と互除法について。