求幂算法
1.简单递归
最简单的求幂算法是根据xn=x*xn-1,使用递归:
1 2 3 4 5 | def foo(x,n): if n==0: return 1 else : return x*foo(x,n-1) |
这样求x的n次方,会进行n-1次乘法运算,n较大时效率很低。
2.高效递归
一种更高效的算法,可以将运算次数降到LogN的级别,由于:
xn=xn/2*xn/2 , n为偶数时
xn=x(n-1)/2*x(n-1)/2*x , n为奇数时
1 2 3 4 5 6 7 8 | def foo(x,n): if n==0: return 1 else : if n%2==0: return foo(x,n/2)*foo(x,n/2) else : return foo(x,n/2)*foo(x,n/2)*x |
可以将运算次数降到LogN的级别。
3.快速求幂
还有一种快速求幂算法,称为二进制法:
比如求x的21次方,21的二进制为10101,由于x21=x16*x4*x1,可以看出根据二进制表示(10101),每当遇到1时,则乘以x,从右向左前进一位则将x自乘。
1 2 3 4 5 6 7 8 | def foo(x,n): result=1 while n: if (n&1): result*=x x*=x n>>=1 return result |
这个算法用来计算非常的大的数时是十分高效的。例如有很多的素数测试算法都是依赖这个算法的不同变式。
4.抽象化
然后在某个地方我看到一个很有意思的想法,就是把上面的算法中的自乘函数化:
1 2 3 4 5 6 7 8 9 10 | def foo(x,n,i,func): result=i while n: if (n&1): result=func(result,x) x=func(x,x) n>>=1 return result if __name__== '__main__' : print foo(2,16,1,lambda x,y:x*y) |
这样求x的n次方就能用foo(x,n,1,lambda x,y:x*y)来运算了。
如果求x*n,相当于将x自加n次,可以用foo(x,n,0,lambda x,y:x+y)来运算:
1 2 3 4 5 6 7 8 9 10 | def foo(x,n,i,func): result=i while n: if (n&1): result=func(result,x) x=func(x,x) n>>=1 return result if __name__== '__main__' : print foo(2,16,0,lambda x,y:x+y) |
如果要把某个字符x重复n次,可以用:
1 2 3 4 5 6 7 8 9 10 | def repeat(x,n,i,func): result=i while n: if (n&1): result=func(result,x) x=func(x,x) n>>=1 return result if __name__== '__main__' : print repeat( 'a' ,16, '' ,lambda x,y:x+y) |
把一个列表复制n次:
1 2 3 4 5 6 7 8 9 10 | def repeat(x,n,i,func): result=i while n: if (n&1): result=func(result,x) x=func(x,x) n>>=1 return result if __name__== '__main__' : print repeat([1,2],16,[],lambda x,y:x+y) |
参考自:http://videlalvaro.github.io/2014/03/the-power-algorithm.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探