马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 无理想的闲鱼 于 2023-1-7 17:03 编辑
pow() -- BIF
函数原型:
参数解析:
参数 | 含义 | 是否可选 | 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("猜想正确")
|