zoukankan      html  css  js  c++  java
  • 快速幂

    转自(快速幂

    整数快速幂

    为了引出矩阵快速幂,以及说明快速幂算法的好处,我们可以先求整数的幂。如果现在要算X^8:
    则X*X*X*X*X*X*X*X*X 按照寻常思路,一个一个往上边乘,则乘法运算进行7次。
    用(X*X)*(X*X)*(X*X)*(X*X)这种求法,先进行乘法得X^2,然后对X^2再执行三次乘法,这样去计算则乘法运算执行4次。已经比七次少。所以为了快速算整数幂,就会考虑这种结合的思想。现在考虑应该怎么分让计算比较快。接下来计算整数快速幂。
    例如:X^19
    19的二进制为:1 0 0 1 1
    由(X^m)*(X^n)=X^(m+n)
    则X^19=(X^16)*(X^2)*(X^1)
    那么怎么来求解快速幂呢。请看下列代码:
    求解X^N的值

     

    int QuickPow(int x,int N)
    {
        int res = x;
        int ans = 1;
        while(N)
        {
            if(N&1)
            {
                ans = ans * res;
            }
            res = res*res;
            N = N>>1;
        }
        return ans;
    }

    矩阵快速幂 

    看了一个整数的快速幂,现在我们就正式介绍矩阵快速幂算法。假如现在有一个n*n的方阵A。所谓方阵就是行数和列数相等的矩阵,先给出一个数M,让算矩阵A的M次幂,A^M在此只要求计算并不需要去深究这个矩阵到底是什么含义。详细看下边的代码部分

    struct Matrix ///结构体,矩阵类型
    {
        int m[maxn][maxn];
    }ans,res;
    Matrix Mul(Matrix a,Matrix b,int n)
    {
        Matrix tmp;//定义一个临时的矩阵,存放A*B的结果
        for(int i = 1;i <= n;i++)
        {
            for(int j = 1;j <= n;j++)
            {
                tmp.m[i][j] = 0;
            }
        }
        for(itn i=1;i <= n;i++)
        {
            for(int j = 1;j <= n;j++)
            {
                for(int k = 1;k <= n;k++)
                {
                    tmp.m[i][j] = a.m[i][k]*b.m[k][j];
                }
            }
        }
        return tmp;
    }
    ///矩阵快速幂,求矩阵res的N次幂
    void quickpower(int N,int n)
    {
        //整数快速幂默认的ans是1,矩阵的话ans应为单位矩阵
        for(int i = 1;i <= n;i++)
        {
            for(int j = 1;j <= n;j++)
            {
                if(i == j)
                    ans.m[i][j] = 1;
                else
                    ans.m[i][j] = 0;
            }
        }
        while(N)
        {
            if(N&1)
                ans = Mul(res,res);
            res = Mul(res,res);
            N = N>>1;
        }
    }
    
  • 相关阅读:
    软件工程课程总结
    团队-Forward团队一阶段互评
    《Forward团队-爬虫豆瓣top250项目-开发文档》
    《结对-结对编程项目作业名称-结对项目总结》
    《结对-结对编项目作业名称-最终程序》
    《结对-结对编项目作业名称-测试过程》
    《20171125-构建之法:现代软件工程-阅读笔记》
    《软件工程课程总结》
    团队编程项目作业6-程序维护
    团队编程项目作业5-小组评分
  • 原文地址:https://www.cnblogs.com/shmilky/p/14089049.html
Copyright © 2011-2022 走看看