0356 三次多项式根
* * * *
拉格朗日计划
* * * *
三次多项式根

记$a_n$为多项式$g(x)=x^3-2^nx^2+n$的最大实根。例如,$a_2\approx3.86619826\ldots$。

求$\sum_{i=1}^30\lfloor a_i^{987654321}\rfloor$的最后8位数字。

本题难度:



解答

容易看出 \begin{align*} g(-1)&=-1-2^n+n < 0 g(0)&=n>0 g(1)&=1-2^n+n\le 0 g(2^n)&=n>0 \end{align*} 因此由介值性可得g有三个实根,且若这三个根分别是$x_1 < x_2 < x_3$,那么$x_1$在-1到0之间,$x_2$在0到1之间,$x_3$在1到$2^n$之间。

取一些具体的n可以观察到当n增加时,$x_3$以很快的速度接近$2^n$,且由$x_1+x_2+x_3=2^n$可知$|x_2|>|x_1|$,但$|x_2|-|x_1|$很接近0。

考虑矩阵 $$A_n=\begin{pmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ -n & 0 & 2^n \end{pmatrix},$$ 它的特征多项式就是$g(x)$,从而$x_1^k+x_2^k+x_3^k=\tr(A_n^k)$,其中$\tr$是矩阵的迹。

当$k=987654321$时$|x_1^k|$和$|x_2^k|$都非常小,且后者略大于前者,因此 $$\lfloor x_3^{987654321}\rfloor=\tr(A_n^{987654321})-1.$$ 用矩阵快速幂计算后者并汇总即得最终结果$28010159$。

mul=lambda A,B: [[sum(A[i][k]*B[k][j] for k in range(3))%(10**8) for j in range(3)] for i in range(3)]
tr=lambda A: A[0][0]+A[1][1]+A[2][2]

def pow(A,n):
    if n==1:
        return A
    if n==2:
        return mul(A,A)
    B=pow(A,n//2)
    return mul(B,B) if n%2==0 else mul(mul(B,B),A)

print sum(tr(pow([[0,1,0],[0,0,1],[-i,0,1 << i]],987654321))-1 for i in range(1,31))%(10**8)