用数论的知识解决模幂运算
2012-05-04 21:13
113 查看
在数学上,如果数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)若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),可以实现以较短的时间进行求解。
程序如下:
/*=========================================== * * 函 数 名:ModCal * * 参 数: * int digit:底数 * int n :指数 * int m :模数 * * 功能描述:运算数论原理解决模幂运算 * * 返 回 值:返回模幂运算的结果 * * 抛出异常: * * 作者:crazyhf 2012/05/04 * ============================================*/ int ModCal( int digit, int n, int m ) { int muldigit, i ; digit %= m ; if ( !n || digit == 1 ) return 1 ; for( i = 1, muldigit = digit; i < n && muldigit < m; muldigit *= digit, i++ ) ; if( i == n ) return muldigit %= m ; return ModCal( muldigit, n / i, m ) * ModCal( digit, n % i, m ) % m ; }
模幂运算功能的测试代码如下:
# 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 ; }
相关文章推荐
- hduoj1021,Fibonacci Again,数论水题,利用同余式相关知识很容易解决
- 内网知识:无法共享文件之解决办法
- H5基础知识第十一课时(JS解决变量自提升问题)
- 通过心理学知识提高问题定位与解决能力(下)
- 如何解决在网页里输不出中文及Cookies的相关知识
- Java程序员从笨鸟到菜鸟之(二十三)常见乱码解决以及javaBean基础知识
- 【问题收集·知识储备】Xcode只能选择My Mac,不能选择模拟器如何解决?
- 与密码学有关的数论知识
- Android Studio 小知识 文件无法读写解决
- 数论常用小知识总结
- [数论]数论的基础知识——最大公约数、最小公倍数
- 通过心理学知识提高问题定位与解决能力(下)
- 数论知识总结-莫比乌斯反演
- 一句话知识:如何解决winform自动缩放产生的布局问题.
- SCOM 2012知识分享-10:配置警报自动解决
- 嵌入式Linux基础知识6(ubuntu16 下操作目录,出现Permission denied的解决办法)
- ACM常用数论知识 总结
- 当前知识管理系统的焦点问题以及我的一些解决办法
- Android ListView 滑动背景为黑色的解决办法 listview小知识整理
- 小知识~VS2012的xamarin加载失败解决