无理想的闲鱼 发表于 2023-1-6 23:20:37

pow() -- BIF

本帖最后由 无理想的闲鱼 于 2023-1-7 17:03 编辑

pow() -- BIF
函数原型:
pow(base, exp[, mod])

参数解析:

参数 含义 是否可选
base底数 必选参数
exp (exponent)指数 必选参数
mod (modulo)取模运算 可选参数
注意:
1.双参数形式pow(base, exp)相当于使用幂运算符, 返回值是base**exp。
2.如果第三个参数mod存在,返回值是(base**exp)%mod。为什么引入第三个参数呢?因为使用第三个参数比pow(base, exp) % mod计算效率更高。
3.参数必须是数值类型,数值类型有三类,int整数,float浮点数,complex复数


难点解析:一、取模运算 Modulo Operation 取模运算(Modulo Operation)和取余运算(Remainder Operation)两个概念有重叠的部分但是又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。对于整数a, b来说,取模和取余的方法都是:1.求整数商 c = a / b (它们在第一步时候不同,取模是向负无穷方向取整,取余是向0方向取整。假如 a= -9, b = 2, 那么取模c = -5, 取余c = -4)2.计算模或者余数 r = a - (c * b)-9 % 2
1
# python中的 % 是取模运算,这里的 c = -5, r = -9 -(-5 * 2) = 1总的来说,当a和b正负号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。当a和b正负号不一致,两者的结果也就不一定一致。
二、当第三个参数存在并且第二个参数是复数
pow(2, -2, 3)
1
pow(2, -2, 5)
4
pow(2, -2, 7)
2当第三个参数存在,并且第二个参数是负数,base不能是mod的约数(比如pow(2, -4, 4)就是违法的)
在这个情况下,返回值是pow(inv_base, -exp, mod),第一个参数变成了inv_base,是base关于mod的模逆元素, 第二个参数变成了-exp

这里要引入模逆运算,当 a*b % n = 1, 我们称b为a关于n的模逆,
比如 3 * 5 % 7 = 1, 3关于7的模逆元素就是5
比如 3 * 3 % 8 = 1, 3关于8的模逆元素就是3
模逆元素有很多个,比如2关于3的模逆元素有2, 5, 8, ……, 3n-1
2 * 2 % 3 = 1
2 * 5 % 3 = 1
2 * 8 % 3 = 1
………………
是的,它们都是可以代入计算的,但是为了效率,我们一般取最小的模逆元素代入计算即可

pow(2, -2, 3) #先求出2关于3的(最小)模逆元素,是2, 其实返回值是pow(2, -(-2), 3)
1
pow(2, -2, 5) #先求出2关于5的(最小)模逆元素,是3, 返回值是pow(3, -(-2), 5)
4
pow(2, -2, 7) #先求出2关于7的(最小)模逆元素,是4, 返回值是pow(4, -(-2), 7)
2

题外话:
验证我的思路, 如果第三个参数存在并且第二个参数是负数,
while True:
    base = int(input("请输入base:"))
    exponent = int(input("请输入exp:"))
    modulo = int(input("请输入mod:"))
    b = 0 #b是base关于mod的模逆元素
    while True:
      if base * b % modulo == 1:
            break
      else:
            b += 1
    print(f"{base}关于{modulo}的最小模逆元素是{b}")
    ans = b ** (-exponent) % modulo
    standard = pow(base,exponent,modulo)
    if ans == standard:
      print("猜想正确")










象棋爱好者 发表于 2023-1-6 23:28:26

所以说模逆运算和第二个参数有啥关系吗

无理想的闲鱼 发表于 2023-1-6 23:31:42

本帖最后由 无理想的闲鱼 于 2023-1-6 23:41 编辑

象棋爱好者 发表于 2023-1-6 23:28
所以说模逆运算和第二个参数有啥关系吗

pow函数里的模逆运算和第二个参数exp没有关系,只是base和mod之间的模逆运算,inv_base是base关于mod的模逆元素
python官方文档如下
In that case,pow(inv_base, -exp, mod) is returned, where inv_base is an inverse to base modulo mod.

象棋爱好者 发表于 2023-1-6 23:35:33

无理想的闲鱼 发表于 2023-1-6 23:31
pow函数里的模逆运算和第二个参数exp没有关系,只是base和mod之间的模逆运算,
python官方文档如下
In...

哇偶,我完全理解了,谢谢

小甲鱼 发表于 2023-1-7 03:12:30

{:10_307:} 支持干货分享,调整一下文字排版可以申请加精华哈~

zsy0226 发表于 2023-1-7 08:15:50

okk明白了

zsy0226 发表于 2023-1-7 08:17:01

无理想的闲鱼 发表于 2023-1-6 23:31
pow函数里的模逆运算和第二个参数exp没有关系,只是base和mod之间的模逆运算,inv_base是base关于mod的模 ...

第二个参数也明白了,谢谢

zsy0226 发表于 2023-1-7 08:21:58

python官方文档全是机翻,都没法读

tiger20100907 发表于 2023-1-7 08:52:28

{:10_333:}

眸战冷宸 发表于 2023-1-7 09:18:36

{:10_257:}{:10_257:}{:10_257:}

tommyyu 发表于 2023-1-7 09:35:39

{:10_275:}{:10_275:}{:10_275:}

liuhongrun2022 发表于 2023-1-7 09:41:45

看看

chinajz 发表于 2023-1-7 09:56:32

pow(b,-e m):
b*inv_base%m=1

pow(inv_base,e,m)

三体—夜航星 发表于 2023-1-7 09:58:30

谢谢楼主撒币

元豪 发表于 2023-1-7 10:23:06

Wow!膜拜大佬{:10_303:}

元豪 发表于 2023-1-7 10:24:16

{:10_275:}

无理想的闲鱼 发表于 2023-1-7 10:34:18

本帖最后由 无理想的闲鱼 于 2023-1-7 10:45 编辑

小甲鱼 发表于 2023-1-7 03:12
支持干货分享,调整一下文字排版可以申请加精华哈~

好的、小甲鱼老师、我已经修改完毕、请您过目、
现在申请精华帖子{:10_332:}

虽然还是有点冗长、但是这冗长&详细的讲解我感觉还是有必要的{:10_319:}

有什么需要修改的地方,您再提出,不吝赐教{:10_329:}

sfqxx 发表于 2023-3-24 17:40:05

鱼币没领到qwq
@小甲鱼 @不二如是 申请精华
页: [1]
查看完整版本: pow() -- BIF