ABC 137 F - Polynomial Construction
g(x):=x(x−1)...(x−p+1), gi(x):=g(x)/(x−i)と定める。ai=1である添え字iをi1,i2,...,ikとするとき、求める多項式fは次のように書ける:
f(x):=gi1(x)/gi1(i1)+gi2(x)/gi2(i2)+...+gik(x)/gik(ik)
したがって、g(x)を多項式乗算で求めたあと、必要なiについてx−iで割ってgi(x)を求めればよい。 乗算は最初はFFTでやったのだが、よく考えると一次式を掛けていくだけなので素朴な掛け算でO(p)だった。割り算も同様で、一次式で割るので高速な多項式除算を実現する必要はない。つまり、
g(x)=αpxp+αp−1xp−1+...+α1x+α0
g(x)=(x−i)(βp−1xp−1+βp−2xp−2+...+β0)=βp−1xp+(βp−2−iβp−1)xp−1+...+(β0−iβ1)x−β0i
の2つの式を比較すると
βp−1=αpβp−2=αp−1+iβp−1...β0=α1+iβ1
となっていて、βp−1から順次求まることがわかる。計算量はO(p2)。
O(N2)の素朴な乗算と組立除法をやっているだけなので、ライブラリとして用意しておいたほうが良さそう。
http://web.cs.iastate.edu/~cs577/handouts/polydivide.pdf
一般の多項式除算と互除法について。