主页 > 其他  > 

Python中的数学问题3-math、pow

Python中的数学问题3-math、pow
一、math模块核心功能详解 1. 基础数值运算 import math # 平方根(返回浮点型) print(math.sqrt(25)) # 5.0 # 对数计算 math.log(100, 10) # 2.0 (以10为底) math.log2(8) # 3.0 math.log10(1000) # 3.0 # 三角函数(参数为弧度) math.sin(math.pi/6) # 0.49999999999999994(近似1/2) 2. 数论专用工具 # 最大公约数(Python 3.5+) math.gcd(48, 18) # 6 # 阶乘计算(返回整型) math.factorial(5) # 120 # 判断浮点数性质 math.isfinite(1.0/0.0) # False(检测无穷大) math.isnan(float('nan')) # True(检测非数字) 3. 特殊函数 # 组合数计算(Python 3.10+) math b(5, 2) # 10(C(5,2)) # 排列数计算(Python 3.10+) math.perm(5, 2) # 20(P(5,2)) # 精确求和(Python 3.12+) math.sumprod([1,2], [3,4]) # 1*3 + 2*4 = 11

 这里解释一下comb和perm两个概率中常用到的数。

组合数(comb) 数学定义

组合是指从 n 个不同元素中取出 k 个元素的所有不同组合的个数,不考虑元素的顺序,组合数的计算公式为: 其中  表示 n 的阶乘,即 ,并且规定 。

排列数(perm) 数学定义

排列是指从 n 个不同元素中取出 k 个元素进行排列的所有不同排列的个数,考虑元素的顺序,排列数的计算公式为:。

组合数不考虑顺序,排列数还要考虑顺序。


二、pow()函数深度解析 1. 三种调用形式对比 # 基础幂运算(返回整型/浮点型) pow(2, 3) # 8 2 ** 3 # 等效写法 # 带模数的快速幂(返回整型) pow(2, 100, 13) # 2^100 mod 13 # math.pow与内置pow对比 import math math.pow(2, 3) # 8.0(强制返回浮点) pow(2, 3) # 8(根据输入类型决定) 2. 实战技巧

场景1:大数取模(避免中间结果溢出)

# 计算 (a^b) mod m,其中b可能极大 a = 123456789 b = 10**1000 m = 10**9+7 result = pow(a, b, m) # 直接计算,无需处理中间值

场景2:组合数逆元计算

mod = 10**9+7 n = 10**5 k = 5000 # 预处理阶乘 fact = [1]*(n+1) for i in range(1, n+1): fact[i] = fact[i-1] * i % mod # 快速计算组合数:C(n,k) = fact[n] / (fact[k]*fact[n-k]) mod mod comb = fact[n] * pow(fact[k], mod-2, mod) % mod comb = comb * pow(fact[n-k], mod-2, mod) % mod
三、性能关键对比表 操作类型math模块内置函数/运算符适用场景幂运算math.pow()** 运算符小整数快速计算大数模幂不支持pow(a,b,mod)加密算法、组合数计算最大公约数math.gcd()自定义欧几里得算法推荐使用math版本浮点精度运算math.sqrt()等运算符需要高精度时使用大整数阶乘math.factorial()自定义实现n≤20时可用,大数需特殊处理
四、常见坑点及规避方法

浮点精度陷阱

# 错误示例 math.sqrt(2)**2 == 2 # False(实际约为2.0000000000000004) # 正确做法 abs(math.sqrt(2)**2 - 2) < 1e-9 # 设置误差阈值

类型不匹配问题

# math模块函数多返回float type(math.gcd(15, 25)) # int(例外情况) type(math.sqrt(9)) # float

负数处理差异

# math模块函数多返回float type(math.gcd(15, 25)) # int(例外情况) type(math.sqrt(9)) # float
五、竞赛高频应用场景 1. 质数快速判断(结合pow) def is_prime(n): if n < 2: return False for p in [2,3,5,7,11,13,17,19,23,29]: if n % p == 0: return n == p d = n-1 s = 0 while d % 2 == 0: d //= 2 s += 1 for a in [2,325,9375,28178,450775,9780504,1795265022]: if a >= n: continue x = pow(a, d, n) if x ==1 or x ==n-1: continue for _ in range(s-1): x = pow(x, 2, n) if x == n-1: break else: return False return True 2. 快速矩阵幂运算 def matrix_pow(mat, power, mod): result = [[1 if i==j else 0 for j in range(len(mat))] for i in range(len(mat))] while power > 0: if power % 2 == 1: result = matrix_mult(result, mat, mod) mat = matrix_mult(mat, mat, mod) power //= 2 return result def matrix_mult(a, b, mod): return [[sum(x*y for x,y in zip(row,col))%mod for col in zip(*b)] for row in a]

标签:

Python中的数学问题3-math、pow由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Python中的数学问题3-math、pow