- 注册时间
- 2008-11-26
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 149507
- 在线时间
- 小时
|
楼主 |
发表于 2012-7-16 14:09:53
|
显示全部楼层
- (*从左向右与从右向左的模幂算法的mathematica子函数*)
- (*地址:http://bbs.emath.ac.cn/thread-4462-1-1.html*)
- Clear["Global`*"];(*Clear all variables*)
- (*从右向左的模幂算法子函数*)
- PowerModRL[base0_,exponent0_,modulus0_]:=(*三个参量依次是:底\指数\模*)
- Module[
- {
- base=base0,
- exponent=exponent0,
- modulus=modulus0,
- result,array,k (*局部变量*)
- },
- result=1;(*最终的求解的模幂的结果*)
- array=IntegerDigits[exponent,2];(*把指数写成二进制的形式*)
- Do[ If[ array[[k]]==1,
- (*如果是奇数按照下列方式处理,以及处理指数*)
- result=Mod[result*base,modulus]
- ];(*end of If*)
- (*如果是偶数,按照下列方式处理,以及处理指数*)
- base=Mod[base*base,modulus],
- {k,Length@array,1,-1}
- ];(*end of Do*)
- result
- ]
- (*从左向右的模幂算法子函数*)
- PowerModLR[base0_,exponent0_,modulus0_]:=(*三个参量依次是:底\指数\模*)
- Module[
- {
- base=Mod[base0,modulus0],
- exponent=exponent0,
- modulus=modulus0,
- result,array,k (*局部变量*)
- },
- result=1;(*最终的求解的模幂的结果*)
- array=IntegerDigits[exponent,2];(*把指数写成二进制的形式*)
- Do[ result=Mod[result^2,modulus];
- If[array[[k]]==1,result=Mod[result*base,modulus]],
- {k,1,Length@array}
- ];(*end of Do Loop*)
- result
- ]
-
- a=10^25+4;
- e=500!;
- n=142*69^2000+1;
- (*检验模幂算法子函数写的是否正确,与mathematica的PowerMod函数比较*)
- PowerModLR[a,e,n]-PowerMod[a,e,n]
- (*检验模幂算法子函数写的是否正确,与mathematica的PowerMod函数比较*)
- PowerModRL[a,e,n]-PowerMod[a,e,n]
- Print["从左向右的模幂函数的计算时间"]
- b=Timing@PowerModLR[a,e,n];b[[1]]
- Print["从右向左的模幂函数的计算时间"]
- b=Timing@PowerModRL[a,e,n];b[[1]]
- Print["mathematica本身的模幂函数计算时间"]
- b=Timing@PowerMod[a,e,n];b[[1]]
-
复制代码 为了便于比较,我重新把两个方法的代码改写了一下,改成差不多的形式
从左向右的,只有一个result变量在不断被赋值,
而从右向左的,却有两个变量result与base在不断被赋值!
因此从左向右的比较节省时间!!!!!!!! |
|