求高次幂算法(高效)

作者在 2009-04-12 11:28:00 发布以下内容
#include<stdio.h> #include<math.h>

#define N 62  //指定的指数
int main()
{
    
int i,x,exp=1,time=0;//exp记录指数,time用来统计乘法计算次数
     scanf("%d",&x);
    
long double a,s=(long double)x;
    
while(exp!=N)  //指数等于指定的指数结束循环
     {
         a
=x;
        
for(i=1;exp<N;i*=2)//指数小于指定的时候,继续以平方的形式递乘
         {              s*=a;//改变目标值
             exp+=i;
             a
=a*a;//将原数平方
             time++;
         }
        
if(exp-N>N/2&&exp!=N)//判断这个时候是从原数开始乘还是从原数开始除的好
         {
             exp
-=i/2;
             s
/=sqrt(a);
                         time
--;
            
continue;
         }
         a
=x;
        
for(i=1;exp>N;i*=2)//指数大于指定的时候,继续以平方的形式递除
         {
             s
/=a;//改变目标值
             exp-=i;
             a
=a*a;//将原数平方
             time++;
         }
     };
     printf(
"%lf,%d",s,time);
    
return 0;

}


用这个算法去算62次要9次,但如果是65次,只要七次即可

下面以62为例分析上面程序:

首先循环1:X*X*X^2*X^4*X^8*X^16*X^32=X^64(64 >62退出循环)共6次
64-62 >62/2不成立
跳过执行下一个循环2:X^64/X/X^2=X^61(61 <62退出循环)共2次
61!=62条件成立,执行WHILE
又开始执行循环1: X^61*X=X^62(62==62退出循环)共1次
后面的都不成立,直接退出WHILE,完毕

整体而言就是这样运算X*X*X^2*X^4*X^8*X^16*X^32/X/X^2*X=X^62;(共九次,实际分析的话,肯定最后两步肯定不会这样运算,这个是为了针对所有情况,选择的最佳方法)

如果是65的话就是:X*X*X^2*X^4*X^8*X^16*X^32^X^64/X^64(在实际分析中,这两步可以抵消)*X=X^65(去掉中间的两步就是7次)
原创 | 阅读 4829 次
文章评论,共5条
夜风依旧
2009-04-12 22:52
1
高效?搞笑吧?
夜风依旧
2009-04-12 22:54
2
sqrt(a)是怎么实现的你知道不??高效应该尽量减少乘除、循环、比较的次数,找找关于数论的书看下,你马上就会找到真正高效的了。。。呵呵,我会不会太直白了??
keloy
2009-04-13 11:24
3
真正的高效算法是以二进制以为为主,加法和减法为辅,你可以去看下离散数学里面有怎样进行高阶二进制转换的方法。<br />
<br />
外加,小夜你就不能说话温柔点嘛。<br />
毕竟人家的二分思想写的和不错的嘛。
夜风依旧
2009-04-14 12:46
4
<div class="quote"><span class="q"><b>keloy</b>: 真正的高效算法是以二进制以为为主,加法和减法为辅,你可以去看下离散数学里面有怎样进行高阶二进制转换的方法。      外加,小夜你就不能说话温柔点嘛。</span></div>呵呵,好,温柔一点。。。
夜风依旧
2009-04-14 12:47
5
PcrazyC很具创新精神、研究精神,继续加油吧!
游客请输入验证码
浏览195345次