矩阵快速幂的多项式取模优化

原问题

给定一个数列前k项,并给出其k阶递推关系 h n = i = 1 k a i h n i ,求 h n

矩阵快速幂

大家都会矩阵快速幂的方法。

构造一个转移矩阵 A

A = [ a 1 a 2 a 3 a k 1 0 0 0 0 1 0 0 0 0 0 1 0 ]

用前k项构造初始矩阵,也是一个k维向量 H 1

H 1 = ( h k h k 1 h k 2 h 1 )

即可得 A n 1 H 1 = H n

时间复杂度 O ( k 3 log n )

k如果比较大怎么办?我会卡常,jki玄学卡常,wys优化

扫描二维码关注公众号,回复: 2824051 查看本文章

多项式取模优化

前置知识

1.矩阵的特征值

对于矩阵 A 和一个n维向量 x ,如果有一个值 λ 满足 A x = λ x ,则我们称 λ 为矩阵 A 的特征值。

2.矩阵的特征多项式

简单的缩好像就是特征方程再移项?

我们把之前的那个方程移项得 ( A λ E ) x = 0 ,显然若x有非零解,那么需要满足

| A λ E | = | a 11 λ a 12 a 13 a 1 k a 21 a 22 λ a 23 a 2 k a 31 a 32 a 33 λ a 3 k a k 1 a k 2 a k 3 a k k λ | = 0

这其实是一个一元k阶方程,即特征方程。我们记 f A ( x ) = | A x E | ,称矩阵A的特征多项式

3.Cayley-Hamilton定理

f A ( A ) = 0 。具体的证明可以看widipedia,因为我也不会

为了方便记忆,有一个著名的伪证: f A ( A ) = | A A E | = 0

4.拉普拉斯展开

对于行列式A,我们定义它的关于第i行第j列的余子式 M i j 为原行列式删除第i行和第j列之后剩下的k-1阶行列式。

拉普拉斯展开是一个有关行列式的值的等式,按第i行展开得到如下等式

| A | = j = 1 k ( 1 ) j 1 a i j | M i j |

类似的,我们也可以对第j列展开

| A | = i = 1 k ( 1 ) i a i j | M i j |

5.多项式取模

f ( x ) = g ( x ) p ( x ) + r ( x )

它们满足 d e g ( r ) < d e g ( g ) < d e g ( f )

优化

我们知道如果给矩阵的某一行全部元素全部变为相反数,那么矩阵的行列式也会变成相反数,那么我们可以做这样一个操作,并记作 g

g ( x ) = ( 1 ) k f A ( x ) = | x a 1 a 2 a 3 a k 1 x 0 0 0 1 x 0 0 0 0 0 1 x |

为了求 g ( x ) 的表达式,我们可以按照第一行对其进行拉普拉斯展开:

g ( x ) = x k i = 1 k a i x k i

由于我们要求的东西就是 A n ,那不妨构造一个这样的式子:

x n = g ( x ) p ( x ) + r ( x )

x = A 则有 A n = g ( A ) p ( A ) + r ( A )

由之前的Cayley-Hamilton定理我们知道 g ( A ) = ( 1 ) k f A ( A ) = 0 。那么我们就得到了 A n = r ( A ) ,而 d e g ( r ) < k 。为了方便,我们不妨看作 d e g ( r ) = k 1

那么我们怎么求 r ( A ) 呢?原来的取模板子显然不可取,因为n可能很大,数组都开不下。考虑用倍增,即

x 2 mod g ( x ) = ( x 1 mod g ( x ) ) 2 mod g ( x ) , x 4 mod g ( x ) = ( x 2 mod g ( x ) ) 2 mod g ( x )

考虑用快速幂实现,这需要做两个操作:
* 1.多项式乘法
* 暴力 O ( k 2 )
* FFT O ( k log k )
* 2.多项式取模
* 暴力 O ( k 2 ) ,跳过中间的零项 O ( k t )
* FFT O ( k log k ) ,限制多,有时用不了?

至此,我们已经得到了 A n = i = 0 k 1 r i A i ,再在两边乘上初始矩阵 H 1 即得

H n + 1 = i = 0 k 1 r i H i + 1

由于 H 是一个n维向量,而且中间涉及到的数乘及加法的运算,对于每一行是独立的,直接把第k行上的运算提出来就得到

h n + 1 = i = 0 k 1 r i h i + 1

时间复杂度常数较大的 O ( k 2 log n ) ,或者常数更大的 O ( k log k log n ) ,fft的话要注意精度问题,mod较大就可能有问题。

相关题目

看了这么久,然而貌似应用不多?

bzoj4161

hdu4914

猜你喜欢

转载自blog.csdn.net/As_A_Kid/article/details/81737487
今日推荐