强基初中数学&学Python——第199课 Python内置函数详解数学篇之七:pow


  pow()函数 

  调用方式1:pow(base, exp),base是底数,exp是指数。

  返回 base 的 exp 次幂,等价于乘方运算符: base**exp。

>>>pow(3,2), 3**2

(9,9)

>>>pow(-3,2), (-3)**2

(9,9)

>>>pow(-3,0), (-3)**0

(1,1)

>>>pow(3.0,2), 3.0**2

(9.0,9.0)

>>>pow(3,2.0), 3**2.0

(9.0,9.0)

>>>pow(3.0,2.0), 3.0**2.0

(9.0,9.0)

>>>pow(3,-2), 3**-2

(0.1111111111111111, 0.1111111111111111)

>>>from fractions import Fraction

>>>pow(Fraction(3,2), 2), Fraction(3,2) ** 2

(Fraction(9, 4), Fraction(9, 4))

>>>pow(Fraction(3,2), -2), Fraction(3,2) ** -2

(Fraction(4, 9), Fraction(4, 9))

>>>pow(Fraction(3,2), 2.0), Fraction(3,2) ** 2.0

(2.25, 2.25)

>>>pow(3, Fraction(1,2)), 3 ** Fraction(1,2)

(1.7320508075688772, 1.7320508075688772)

>>>pow(Fraction(3,1),Fraction(1,2)), Fraction(3,1)**Fraction(1,2)

(1.7320508075688772, 1.7320508075688772)

总结:只有base是整数和exp是非负整数时才返回整数;只有base是分数,exp是整数才返回分数;其它实数总是返回浮点数。

  支持负实数偶次开方、虚数和复数运算,当结果只有虚部,返回这个虚数,否则返回结果复数。

>>>pow(-1,0.5),(-1)**0.5

((6.123233995736766e-17+1j), (6.123233995736766e-17+1j))

>>>pow(1J,2),(1J)**2

((-1+0j), (-1+0j))

>>>pow(1,1J),1**1J

((1+0j), (1+0j))

>>>pow(1,2J),1**2J

((1+0j), (1+0j))

>>>pow(2,2J),2**2J

((0.18345697474330172+0.9830277404112437j), (0.18345697474330172+0.9830277404112437j))

>>>pow(1.0+1.0J,2),(1.0+1.0J)**2

(2j, 2j)

>>>pow(1+1J,1+2J),(1+1J)**(1+2J)

((0.027082057503447513+0.2927360563526886j), (0.027082057503447513+0.2927360563526886j))

 

  调用方式2:pow(base, exp, mod),base是底数,exp是指数,mod是取余除数,三个参数都只能是整数,mod≠0。

  exp是正整数,返回 base 的 exp 次幂对mod取余,比pow(base, exp) % mod高效:

>>>pow(0.5,2,3)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: pow() 3rd argument not allowed unless all arguments are integers

>>>pow(10,2,3)

1

>>>pow(10,2,-3)

-2

>>>pow(-10,3,3)

2

>>>pow(-10,3,-3)

-1

余数与mod同号,与pow(base,exp)的符号无关。   

  exp是负整数,这时base不能被mod整除,算法与是正整数不一样。它寻找一个绝对值最小的整数,使这个整数与底的|exp|幂的乘积,如果mod<0则这个积还要加上|mod|,再取|mod|的余数是1。另一种说法,它寻找一个绝对值最小的整数,使这个整数与底的|exp|幂的乘积取|mod|的余数,如果余数小于0,该余数加|mod|,结果等于1 。

>>>pow(10,-2,3)

1

>>>1*10**2%3 == 1

True

>>>pow(10,-2,-3)

-2

>>>(-2*10**2+3)%3 == 1

True

>>>a=-2*10**2%3

>>>a = a+3 if a<0 else a

>>>a == 1

True

>>>pow(-10,-3,-3)

-1

>>>(-1*(-10)**3+3)%3 == 1

True

>>>a=-1*(-10)**3%3

>>>a = a+3 if a<0 else a

>>>a == 1

True

 

  1 阿基米德从古希腊的最大数字单位开始,引进新数万万(亿)作为第二阶单位,然后是亿亿(第三阶单位),亿亿亿(第四阶单位),等等,每阶单位都是它前一阶单位的1亿倍。编程计算阿基米第八阶单位1后面有多少个0

  程序代码(文本代码附录1):

 

  运行结果:

 

  练习题

1、填写下面的运行结果(问号处),然后拷贝运行验证。

>>>pow(5,3)

?

>>>pow(-5,3)

?

>>>pow(-5,0)

?

>>>pow(5.0,3.0)

?

>>>from fractions import Fraction

>>>pow(Fraction(2,3), 2)

?

>>>pow(Fraction(2,3), -2)

?

>>>pow(Fraction(5,2), 2.0)

?

2、填写下面的运行结果(问号处),然后拷贝运行验证。

>>>pow(2021,2022,3)

?

>>>pow(2022,2022,-10)

?

>>>pow(-2022,2023,5)

?

>>>pow(-112,111,-3)

?

3、求一个数,使它与38的积除以97的余数是1

4、用2,3,4三个数字组成最大的数是多少?

 

 

附录1:

#阿基米德八阶单位

j1=10000

print("1阶单位:",j1)

j2=pow(j1,2)

print("2阶单位:",j2)

for i in range(3,9):

    j = pow(j2,i-1)

    print("%d阶单位:%d" % (i, j))