我是靠谱客的博主 灵巧大侠,最近开发中收集的这篇文章主要介绍用数论的知识解决模幂运算,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

在数学上,如果数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 }

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

# include <iostream>
using std::cin ;
using std::cout ;
using std::endl ;
int main( int argc, char **argv )
{
while( 1 )
{
int digit, n, m ;
if( cin >> digit >> n >> m )
{
cout << ModCal( digit, n, m ) << endl ;
}
}
return 0 ;
}

 

转载于:https://www.cnblogs.com/crazyhf/archive/2012/05/04/2483397.html

最后

以上就是灵巧大侠为你收集整理的用数论的知识解决模幂运算的全部内容,希望文章能够帮你解决用数论的知识解决模幂运算所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部