快速幂运算的应用

原创 2012年03月29日 14:08:19

快速幂取余的方法,所得返回值为 a^b % p

int f(int a,int b,int p)
{
    int temp = 1;
    while(b)
    {
        if(b & 0x01)
        {
            temp = (temp * (a%p)) % p;
        }
        a = ( (a%p) * (a%p) ) % p;
        b >>= 1;
    }
    return temp;
}

例如:a^11,设b = 11,写成2进制为1011。

则a^11可以表示为   a^( 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 ) = a^(2^3) *a^(2^1) * a^(2^0)

二进制值为1的那项,在a的指数中就存在a^(2^i),

所以可以把a^(2^0),a^(2^1),a^(2^2)......求出来,

如果在b的二进制表示中第i位为1,就把a^(2^i)乘到最终保存结果的变量中去。

而求a^(2^0),a^(2^1),a^(2^2)......a^(2^i)......时,

a^(2^ (i+1) ) = a^( 2^i * 2 ) = (a^(2i))^2

所以如果知道了a^(2^0) ,对它进行平方就可以得到a^(2^1),以此类推,

所以在程序中我们就不断的将a平方,再将b向右移位。


Q1:Compute (a^(b^c)) % 317000011   ( 1 <= a,b,c <= 100000)

Tips:

⒈ 费马小定理: 如果p为素数,则a^(p-1) % p = 1;

⒉ 除法定理: 对任意整数a和任意正整数n,存在唯一的整数q和r,满足 0 <= r < n , 并且 a = qn + r;

解:设b^c = n(p-1) + d,则a^(b^c) = a^(n(p-1)) * a^(d),依据定理⒈ ,a^(b^c) = a^(d),

而d = b^c Mod (p-1)。所以 a^(b^c) % p = a^( b^c Mod (p-1) ) Mod p 。

#include <stdio.h>

#define P 317000011

unsigned long long f(unsigned long long a,unsigned long long b,unsigned long long p)
{
    unsigned long long temp = 1uLL;
    while(b)
    {
        if(b & 0x01uLL)
        {
            temp = ((temp%p) * (a%p)) % p;
        }
        a = ((a%p)*(a%p))%p;
        b >>= 1uLL;
    }
    return temp;
}


int main()
{
    int t;
    unsigned long long a,b,c;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%llu %llu %llu",&a,&b,&c);
        printf("%llu\n",f(a,f(b,c,P-1),P));
    }
    return 0;
}

Q2:矩阵幂 快速求Fibonacci数列的第 N 项

定义一个基础矩阵 base

┌      ┐     ┌      ┐

│ 1  1 │   = │F2  F1

│ 1  0 │     F1  F0

└      ┘     └      ┘

             ┌          ┐

求base^n  =  │Fn+1  Fn  │

             │Fn    Fn-1│

             └          ┘

所以矩阵的快速幂乘方方法,可以高效的求的Fibonacci数列,O(log2n)。

int f(int n)
{
    if(n == 0)  return 0;
    else if(n == 1) return 1;
    else if(n == 2) return 1;
    else
    {
        int base[2][2] = {{1,1},{1,0}};
        int b = n-1;
        int res[2][2] = {{1,1},{1,1}};
        int temp[2][2];
        while(b)
        {
            if(b & 0x01)
            {
                temp[0][0] = res[0][0] * base[0][0] + res[0][1] * base[1][0];
                temp[0][1] = res[0][0] * base[0][1] + res[0][1] * base[1][1];
                temp[1][0] = res[1][0] * base[0][0] + res[1][1] * base[1][0];
                temp[1][1] = res[1][0] * base[0][1] + res[1][1] * base[1][1];
                res[0][0] = temp[0][0]; res[0][1] = temp[0][1];
                res[1][0] = temp[1][0]; res[1][1] = temp[1][1];
            }
            temp[0][0] = base[0][0] * base[0][0] + base[0][1] * base[1][0];
            temp[0][1] = base[0][0] * base[0][1] + base[0][1] * base[1][1];
            temp[1][0] = base[1][0] * base[0][0] + base[1][1] * base[1][0];
            temp[1][1] = base[1][0] * base[0][1] + base[1][1] * base[1][1];
            base[0][0] = temp[0][0]; base[0][1] = temp[0][1];
            base[1][0] = temp[1][0]; base[1][1] = temp[1][1];
            b >>= 1;
        }
        return res[0][0];
    }
}



据说是世界上最经典的25句话

据说是世界上最经典的25句话 1,记住该记住的,忘记该忘记的。改变能改变的,接受不能改变的 2,能冲刷一切的除了眼泪,就是时间,以时间来推移感情,时间越长,冲突越淡,仿佛 不断稀释的茶。 3,怨言是上...
  • superyan
  • superyan
  • 2004-04-09 13:26:00
  • 2074

快速幂运算应用

先来一个什么是快速幂运算的讲解博客网址点击打开链接,别人写的然后理解了什么是快速幂运算后这里要写的就是它的一个应用,包含了埃氏筛法算区间素数的方法关于埃氏筛法可以看我的另一篇博客http://blog...
  • qq_34115899
  • qq_34115899
  • 2018-03-09 16:02:50
  • 41

快速幂模运算

  • 2012年09月06日 14:29
  • 311B
  • 下载

UVa1374快速幂运算迭代深搜法

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41552 本题不算太难,但我刚开始的时候居然理解错了。那句“问最...
  • FLSJZL
  • FLSJZL
  • 2016-07-02 20:22:34
  • 306

快速幂运算

#include #include using namespace std; #define mod 100007 int mi(int d,int n)//快速幂运算 思想 2的4次方可以...
  • sr19930829
  • sr19930829
  • 2014-04-24 17:10:13
  • 982

ACM模板——矩阵快速幂

  • 2011年11月15日 19:59
  • 1KB
  • 下载

大数幂 C语言

大数乘方可以看成多个数不断的相乘,关键就是如何连续的相乘
  • l_liangkk
  • l_liangkk
  • 2016-07-29 18:55:32
  • 165

矩阵乘法及矩阵快速幂运算

设矩阵为n*n(n&amp;lt;N)的矩阵,代码如下: const int N = 100; void matmul(long long a[][N], long long b[][N], long...
  • aaaliaosha
  • aaaliaosha
  • 2018-02-15 10:04:08
  • 67

快速幂运算 与 快速幂取余

在很多情况下,我们队数据的处理的时候需要进行幂运算,但是如果进行n次的话时间复杂度是O(n), 可能会超时, 所以今天学习一种能够优化幂运算的算法 ------- 快速幂运算,能有效的将时间复杂度降低...
  • WSS_ang
  • WSS_ang
  • 2017-09-19 20:00:46
  • 297

ACM-ICPC集训--数学基础知识【转】

感谢cnblogs的_kuangbin博主提供这么好的文章,转载过来学习使用。 原文博客地址http://www.cnblogs.com/kuangbin/archive/2012/08/28/26...
  • loy_184548
  • loy_184548
  • 2016-01-28 15:16:08
  • 910
收藏助手
不良信息举报
您举报文章:快速幂运算的应用
举报原因:
原因补充:

(最多只允许输入30个字)