比较pow(x,y)的实现算法

这篇博客对比了Python中使用递归和while循环实现`pow(x,y)`的不同方法,包括 PowRecursion、PowCircle、PowCircle2 和 PowInternet 函数。实验结果显示,内置的 `pow()` 函数速度最快,而 PowCircle2 的效率最低。文章最后提到递归调用在时间上较慢,暗示了对优化算法的关注。" 110767981,10295446,Python实现:水果大转盘抽奖程序,"['Python开发', '图形用户界面', '游戏开发', 'GUI编程', '交互设计']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

用python,比较pow的实现算法

思路

主要对比递归和while循环。PowCircle2函数和PowCircle类似,PowCircle2更容易理解一些。

源码

from time import ctime
from math import *


def PowRecursion(x,y):
    if(y==0):
        return 1
    if(y==1):
        return x

    t = PowRecursion(x, (int)(y / 2))
    if y&1 == 1:
        return x * t * t
    else:
        return t * t

def PowCircle(x,y):
    r=1
    if(y&1 == 1):
        r=x
        y=y-1
    y = y>>1
    while y>0:
        x = x*x
        y = y >> 1
    return r*x

def PowCircle2(x,y):
    r=1
    if(y&1 == 1):
        r=x
        y=y-1

    i=2
    while i<y:
        x = x*x
        i = i*2
    return r*x


def PowInternet(a, b):
    r = 1
    while b > 1:
        if b & 1 == 1:  #与运算一般可以用于取某位数,这里就是取最后一位。
            r *= a
        a *= a
        b = b >> 1 #这里等价于b//=2
    return r * a


X = 9
Y = 9
COUNT= 5000000


def main_recursion():
    print('%s main_recursion start' % ctime())
    for i in range(COUNT):
        PowRecursion(X, Y)
    print('%s main_recursion end\n' % ctime())


def main_pow():
    print('%s main_pow start' % ctime())
    for i in range(COUNT):
        pow(X, Y)
    print('%s main_pow end\n' % ctime())

def main_circle():
    print('%s main_circle start' % ctime())
    for i in range(COUNT):
        PowCircle(X, Y)
    print('%s main_circle end\n' % ctime())

def main_circle2():
    print('%s main_circle2 start' % ctime())
    for i in range(COUNT):
        PowCircle2(X, Y)
    print('%s main_circle2 end\n' % ctime())

def main_internet():
    print('%s main_internet start' % ctime())
    for i in range(COUNT):
        PowInternet(X, Y)
    print('%s main_internet end\n' % ctime())


if __name__=='__main__':
    print('PowRecursion(X, Y)',PowRecursion(X, Y))
    print('pow(X, Y)', pow(X, Y))
    print('PowCircle(X, Y)', PowCircle(X, Y))
    print('PowCircle2(X, Y)', PowCircle2(X, Y))
    print('PowInternet(X, Y)', PowInternet(X, Y))
    main_recursion()
    main_pow()
    main_circle()
    main_circle2()
    main_internet()

运行结果

PowRecursion(X, Y) 387420489
pow(X, Y) 387420489.0
PowCircle(X, Y) 387420489
PowCircle2(X, Y) 59049
PowInternet(X, Y) 387420489
Fri Sep 11 17:31:39 2020 main_recursion start
Fri Sep 11 17:31:46 2020 main_recursion end

Fri Sep 11 17:31:46 2020 main_pow start
Fri Sep 11 17:31:47 2020 main_pow end

Fri Sep 11 17:31:47 2020 main_circle start
Fri Sep 11 17:31:50 2020 main_circle end

Fri Sep 11 17:31:50 2020 main_circle2 start
Fri Sep 11 17:31:52 2020 main_circle2 end

Fri Sep 11 17:31:52 2020 main_internet start
Fri Sep 11 17:31:56 2020 main_internet end

后记

1、递归的函数调用要消耗时间,比while要慢
2、python内部的pow接口最快,待进一步研究?!

### Python 中 `pow` 函数的三参数形式 Python 的内置函数 `pow(x, y, z)` 提供了一种高效的方式来进行模幂运算(modular exponentiation)。该函数计算 `(x ** y) % z`,即先求 `x` 的 `y` 次方,再对结果取模 `z`。这种方法特别适用于处理大数运算中的性能优化问题[^1]。 以下是关于 `pow` 函数的具体说明: #### 基本语法 ```python result = pow(x, y, z) ``` 其中: - 参数 `x` 是底数。 - 参数 `y` 是指数。 - 参数 `z` 是模数。 返回的结果是 `(x ** y) % z`。 #### 性能优势 当涉及非常大的整数时,直接使用 `(x ** y) % z` 可能会因为中间结果过大而导致内存消耗过高甚至溢出。而 `pow(x, y, z)` 则通过算法优化,在不存储完整幂值的情况下完成模运算,从而显著提高效率并减少资源占用。 #### 示例代码 下面是一个具体的例子展示如何使用 `pow` 函数的三参数形式来执行模幂运算: ```python # 计算 (7 ** 59) % 100 result = pow(7, 59, 100) print(result) # 输出应为 3 ``` 在这个例子中,`pow(7, 59, 100)` 高效地完成了模幂运算而不必显式生成巨大的数值 `7 ** 59`。 --- ### 注意事项 需要注意的是,只有当第三个参数存在时,第一个和第二个参数都必须是非负整数;如果省略了第三个参数,则可以接受浮点数作为输入。 ```python # 正确用法 value = pow(2.5, 3) # 返回 15.625 # 错误用法 try: value = pow(-2, -3, 5) # 抛出 ValueError except ValueError as e: print(e) # 输出: pow() 3rd argument not allowed unless all arguments are integers and the second argument is nonnegative. ``` 上述错误提示表明,对于带三个参数的情况,不允许底数或指数为负数除非它们满足特定条件。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值