• fibonacci数的矩阵乘法


     斐波那契数列1,1,2,3,5,8,13…….有如下定义
    F(n)=f(n-1)+f(n-2)
    F(1)=1
    F(2)=1
    对于以下矩阵乘法

    [F(n+1)]=[1    0][F(n)   ]
    [    F(n)]=[1    0][F(n-1)]
      结果
      F(n+1)=F(n)+F(n-1)
      F(n)=F(n)

      设[ 1    1] 
         [ 1    0]为A

     f(n)=Af(n-1)=A^n-1f(1)

    f(1)可以表示成 [ 1    1] 
                     [ 1    0]

       所以 F[n] = A^n  

     还有另外一种形式:

    ( F(n+1) F(n)            

     F(n)     F(n-1) )   = A^n;

    先看自己写的简单易懂的代码:

    #include<iostream>
    using namespace std;
    
    void mul(int m[2][2],int f[2][2])
    {
        int x,y,z,w;  // 必须用4个变量暂存结果
            
        x=m[0][0]*f[0][0]+m[0][1]*f[1][0];
        y=m[0][0]*f[0][1]+m[0][1]*f[1][1];
        z=m[1][0]*f[0][0]+m[1][1]*f[1][0];
        w=m[1][0]*f[0][1]+m[1][1]*f[1][1];
        
        f[0][0]=x;f[0][1]=y;
        f[1][0]=z;f[1][1]=w;
    }
    
    void power(int f[2][2],int n)
    { 
        int m[2][2]={{1,1},{1,0}};
    
        f[0][0]=f[0][1]=f[1][0]=1;
        f[1][1]=0;
        if(n==1)
            return ;
    
        for(int i=2;i<=n;i++)
            mul(m,f);
    }
    
    int main()
    {
        int n;
    
        int f[2][2];
    
        cin>>n;
    
        for(int i=1;i<=n;i++)
        {
             power(f,i);
            cout<<f[0][1]<<endl;
        }
    }

    再看别人写的:

    #include <stdio.h>
    #include <stdlib.h>
    /*******************************************
    *
    *          matrix A =   [[1, 1],
    *                        [1, 0]]
    *          A^n = [[F(N+1), F(N)],
    *                 [F(N),   F(N -1)]];
    *
    ********************************************/
    
    #define fib(n, power) \
        int F[2][2] = {{1,1},{1,0}};\
        if(n == 0)\
            return 0;\
        power(F, n-1);\
        return F[0][0]; //为什么是f[0][0];因为这里传递的是N-1,第一个为Fn,推荐用这种,减少了一步计算
    
    void mul(int F[2][2], int M[2][2]);
    void power1(int F[2][2], int n);
    void power2(int F[2][2], int n);
    int fib1(int n);
    int fib2(int n);void mul(int F[2][2], int M[2][2])
    {
        // [[l: left, r : right],
        //  [t: top,  b : bootom]]
        int lt, rt,
            bl, br;
    
    //  parallel setions by order {
    
        //parallel section 1 {
        lt = F[0][0]*M[0][0] + F[0][1]*M[1][0], rt =  F[0][0]*M[0][1] + F[0][1]*M[1][1];
        bl = F[1][0]*M[0][0] + F[1][1]*M[1][0], br =  F[1][0]*M[0][1] + F[1][1]*M[1][1];
        //}
        //parallel section 2 {
        F[0][0] = lt, F[0][1] = rt;
        F[1][0] = bl, F[1][1] = br;
        //}
    //}
    
    }
    
    // func : power1
    // params :
    // todo(matrix power)
    // Time Complexity: O(n)
    // Extra Space: O(1)
    void power1(int F[2][2], int n)
    {
        int i;
        int M[2][2] = {{1,1},{1,0}};
    
        for ( i = 2; i <= n; i++ )
            mul(F, M);
    
    }
    
    // func : power2
    // params :
    // todo(matrix power)
    // Time Complexity: O(Logn)
    // Extra Space: {'fuction stack size' : O(Logn),
    //              'otherwise' : O(1)}
    void power2(int F[2][2], int n)
    {
        if( n == 0 || n == 1)
            return;
        int M[2][2] = {{1,1},{1,0}};
    
        power2(F, n/2);
        mul(F, F);
    
        if( n%2 != 0 )
            mul(F, M);
    }
    
    
    int fib1(int n)
    {
        fib(n, power1)
    }
    
    int fib2(int n)
    {
      fib(n, power2);
    }

    int main()
    {
        int n = 30;
        printf("Fibonacci(%03d) = %d\n", n, fib2(n));
        getchar();
    
        return 0;
    }
     

     这篇也不错!

    http://caoruntao.iteye.com/blog/1129379

  • 相关阅读:
    python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)
    python基础学习Day14 内置函数 匿名函数
    python基础学习Day12 生成器、列表推导式、字典的表达式、字典键值对的互换、集合推导式
    python基础学习Day11 函数名的应用、闭包、迭代器
    python基础学习Day10 函数形参的动态参数、*args **kwargs 命名空间 global 与 nonlocal
    python基础学习Day9 函数的初识,实参、形参、
    定时器定时循环执行和只执行一次
    CocoaPods 安装和使用
    tableView的cell之间间隔显示空白区域
    去掉tableView空白区域的分割线
  • 原文地址:https://www.cnblogs.com/youxin/p/2447906.html
Copyright © 2020-2023  润新知