zoukankan      html  css  js  c++  java
  • 【转】 矩阵构造方法

    题目链接:http://www.cnblogs.com/frog112111/archive/2013/05/19/3087648.html

    Fibonacci数列:F(0)=1 , F(1)=1 , F(n)=F(n-1)+F(n-2)

    我们以前快速求Fibonacci数列第n项的方法是 构造常系数矩阵

    (一)   Fibonacci数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的第n项快速求法(不考虑高精度)

    解法:

    考虑1×2的矩阵【f[n-2],f[n-1]】。根据Fibonacci数列的递推关系,我们可以通过乘以一个2×2的矩阵A,得到矩阵:【f[n-1],f[n]】。

    即:【f[n-2],f[n-1]】*A = 【f[n-1],f[n]】=【f[n-1],f[n-1]+f[n-2]】

    很容易构造出这个2×2矩阵A,即:
    0 1 
    1 1

    所以,有【f[1],f[2]】×A=【f[2],f[3]】
    又因为矩阵乘法满足结合律,故有:
    【f[1],f[2]】×A ^(n-1) =【f[n],f[n+1]】
    这个矩阵的第一个元素f[n]即为所求。

    (二)   数列f[n]=f[n-1]+f[n-2]+1,f[1]=f[2]=1的第n项的快速求法(不考虑高精度)

    解法:
    仿照前例,考虑1×3的矩阵【f[n-2],f[n-1],1】,希望求得某3×3的矩阵A,使得此1×3的矩阵乘以A得到矩阵:【f[n-1],f[n],1】

    即:【f[n-2],f[n-1],1】* A =【f[n-1],f[n],1】=【f[n-1],f[n-1]+f[n-2]+1,1】

    容易构造出这个3×3的矩阵A,即:
    0 1 0 
    1 1 0 
    0 1 1

    故:【f[1],f[2],1】* A^(n-1) = 【f[n],f[n+1],1】

    (三)数列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的第n项的快速求法(不考虑高精度).
    解法:
    仿照前例,考虑1×4的矩阵【f[n-2],f[n-1],n,1】,希望求得某4×4的矩阵A,使得此1×4的矩阵乘以A得到矩阵:【f[n-1],f[n],n+1,1】
    即:【f[n-2],f[n-1],n,1】* A  = 【f[n-1],f[n],n+1,1】=【f[n-1],f[n-1]+f[n-2]+n+1,n+1,1】
    容易构造出这个4×4的矩阵A,即:
    0 1 0 0 
    1 1 0 0 
    0 1 1 0 
    0 1 1 1

    故:【f[1],f[2],3,1】* A^(n-1) = 【f[n],f[n+1],n+2,1】

    (四)   数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的前n项和s[n]=f[1]+f[2]+……+f[n]的快速求法(不考虑高精度).

    解法:

    仿照之前的思路,考虑1×3的矩阵【f[n-2],f[n-1],s[n-2]】,我们希望通过乘以一个3×3的矩阵A,得到1×3的矩阵:【f[n-1],f[n],s[n-1]】
    即:【f[n-2],f[n-1],s[n-2]】 * A  = 【f[n-1],f[n],s[n-1]】=【f[n-1],f[n-1]+f[n-2],s[n-2]+f[n-1]】
    容易得到这个3×3的矩阵A是:
    0 1 0 
    1 1 1 
    0 0 1

    这种方法的矩阵规模是(r+1)*(r+1)

    f(1)=f(2)=s(1)=1 ,所以,有

    【f(1),f(2),s(1)】* A  = 【f(2),f(3),s(2)】

    故:【f(1),f(2),s(1)】* A^(n-1)  = 【f(n),f(n+1),s(n)】

    (五)   数列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的前n项和s[n]=f[1]+f[2]+……+f[n]的快速求法(不考虑高精度).

    解法:

    考虑1×5的矩阵【f[n-2],f[n-1],s[n-2],n,1】,
    我们需要找到一个5×5的矩阵A,使得它乘以A得到如下1×5的矩阵【f[n-1],f[n],s[n-1],n+1,1】
    即:【f[n-2],f[n-1],s[n-2],n,1】* A  =【f[n-1],f[n],s[n-1],n+1,1】

    =【f[n-1], f[n-1]+f[n-2]+n+1,s[n-2]+f[n-1],n+1,1】
    容易构造出A为:
    0 1 0 0 0 
    1 1 1 0 0 
    0 0 1 0 0 
    0 1 0 1 0 
    0 1 0 1 1

    故:【f(1),f(2),s(1),3,1】* A^(n-1)  = 【f(n),f(n+1),s(n),n+2,1】

    一般地,如果有f[n]=p*f[n-1]+q*f[n-2]+r*n+s
    可以构造矩阵A为:
    0  q  0  0  0 
    1  p  1  0  0 
    0  0  1  0  0 
    0  r  0  1  0 
    0  s  0  1  1

    更一般的,对于f[n]=Sigma(a[n-i]*f[n-i])+Poly(n),其中0<i<=某常数c, Poly (n)表示n的多项式,我们依然可以构造类似的矩阵A来解决问题。
    设Degree(Poly(n))=d, 并规定Poly(n)=0时,d=-1,此时对应于常系数线性齐次递推关系。则本方法求前n项和的复杂度为:
    ((c+1)+(d+1))3*logns

    例如:A(0) = 1 , A(1) = 1 , A(N) = X * A(N - 1) + Y * A(N - 2) (N >= 2);给定三个值N,X,Y求S(N):S(N) = A(0)2 +A(1)2+……+A(n)2。

    解:

    考虑1*4 的矩阵【s[n-2],a[n-1]^2,a[n-2]^2,a[n-1]*a[n-2]】

    我们需要找到一个4×4的矩阵A,使得它乘以A得到1×4的矩阵

    【s[n-1],a[n]^2,a[n-1]^2,a[n]*a[n-1]】

    即:【s[n-2],a[n-1]^2,a[n-2]^2,a[n-1]*a[n-2]】* A = 【s[n-1],a[n]^2,a[n-1]^2,a[n]*a[n-1]】

    = 【s[n-2]+a[n-1]^2 , x^2 * a[n-1]^2 + y^2 * a[n-2]^2 + 2*x*y*a[n-1]*a[n-2] ,

    a[n-1]^2 , x*a[n-1]^2 + y*a[n-2]a[n-1]】

    可以构造矩阵A为:

    1     0    0    0

    1    x^2   1    x

    0    y^2   0    0

    0    2xy   0    y

    故:【S[0],a[1]^2,a[0]^2,a[1]*a[0]】 * A^(n-1) = 【s[n-1],a[n]^2,a[n-1]^2,a[n]*a[n-1]】

    所以:【S[0],a[1]^2,a[0]^2,a[1]*a[0]】 * A^(n) = 【s[n],a[n+1]^2,a[n]^2,a[n+1]*a[n]】

    若A = (B * C ) 则AT = ( B * C )T = C* BT

  • 相关阅读:
    Docker容器启动时初始化Mysql数据库
    使用Buildpacks高效构建Docker镜像
    Mybatis 强大的结果集映射器resultMap
    Java 集合排序策略接口 Comparator
    Spring MVC 函数式编程进阶
    换一种方式编写 Spring MVC 接口
    【asp.net core 系列】6 实战之 一个项目的完整结构
    【asp.net core 系列】5 布局页和静态资源
    【asp.net core 系列】4. 更高更强的路由
    【Java Spring Cloud 实战之路】- 使用Nacos和网关中心的创建
  • 原文地址:https://www.cnblogs.com/rpSebastian/p/4170217.html
Copyright © 2011-2022 走看看