模幂运算及应用

在数学上,如果数A与数B对M取模后得到的值相等,即A%M=B%M,则称A与B是关于模M同余,记为A≡B。

此外对于同余运算有如下定理:(自己推导的话也可以轻易得证)

(1)若A≡B,则存在常数D,使得A+D≡B+D ;

(2)若A≡B,则存在常数D,使得A*D≡B*D  ;

(3)若A≡B,则存在常数n,使得A^n≡B^n  ;

基于此原理,对于模幂运算,即A^n%m的运算可以,通过A^n≡B^n(前提A≡B)的形式来化简,辅以定理(1)和(2),可以实现以较短的时间进行求解。

程序如下:

 1 /*===========================================
 2  *
 3  * 函 数 名:ModCal
 4  *
 5  * 参    数:
 6  *           int digit:底数
 7  *           int n    :指数
 8  *           int m    :模数
 9  *
10  * 功能描述:运算数论原理解决模幂运算
11  *
12  * 返 回 值:返回模幂运算的结果
13  *
14  * 抛出异常:
15  *
16  * 作者:crazyhf 2012/05/04
17  *
18  ============================================*/
19 
20 int ModCal( int digit, int n, int m )
21 {
22     int muldigit, i ;
23     digit %= m ;
24 
25     if ( !n || digit == 1 ) return 1 ;
26 
27     for( i = 1, muldigit = digit;
28          i < n && muldigit < m;
29          muldigit *= digit, i++ ) ;
30 
31     if( i == n ) return muldigit %= m ;
32 
33     return ModCal( muldigit, n / i, m ) * ModCal( digit, n % i, m ) % m ;
34 }

模幂运算功能的测试代码如下:

 
  1. # include <iostream>

  2. using std::cin ;

  3. using std::cout ;

  4. using std::endl ;

  5. int main( int argc, char **argv )

  6. {

  7. while( 1 )

  8. {

  9. int digit, n, m ;

  10. if( cin >> digit >> n >> m )

  11. {

  12. cout << ModCal( digit, n, m ) << endl ;

  13. }

  14. }

  15. return 0 ;

  16. }

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值