当前位置: 首页 > news >正文

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.comb(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 个元素的所有不同组合的个数,不考虑元素的顺序,组合数的计算公式为:C(n,k) = \frac{n!}{k!(n-k)!}

其中 n! 表示 n 的阶乘,即 n! = n *(n-1) *... * 1,并且规定 0! = 1

排列数(perm

数学定义

排列是指从 n 个不同元素中取出 k 个元素进行排列的所有不同排列的个数,考虑元素的顺序,排列数的计算公式为:P(n,k) = \frac{n!}{(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时可用,大数需特殊处理

四、常见坑点及规避方法

  1. 浮点精度陷阱

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

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

    # 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]

相关文章:

  • 【大模型】-名词手册-扫盲
  • 分类预测 | MFO-LSSVM飞蛾扑火算法优化最小二乘支持向量机多特征分类预测Matlab实现
  • swupdate升级文件系统内文件与分区的差异
  • 高德地图android sdk(备忘)
  • 科普:“Docker Desktop”和“Docker”以及“WSL”
  • Windows桌面系统管理6:计算机故障排查
  • 组合总和力扣--39
  • 如何安装虚拟机cenos7系统
  • Unity 聊天气泡根据文本内容适配
  • 解锁 AIoT 无限可能,乐鑫邀您共赴 Embedded World 2025
  • 当使用vcpkg安装的qt5时,在VS调用出现libcrypto-*-x64.dll不是有效路径时
  • Design Compiler:边界优化(Boundary Optimization)
  • nginx ngx_http_module(7) 指令详解
  • 从函数到神经网络
  • 解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱
  • Unity性能优化个人经验总结(不定期更新)
  • 如何在本机上模拟IP地址
  • 金融交易算法单介绍
  • 在系统中如何集成限流组件单机和集群
  • 车载音频配置(二)
  • 巴防空系统击落印度无人机,印称巴方违反停火协议
  • 被取消总统候选人资格,金文洙:将采取政治法律措施讨回公道
  • 习近平会见斯洛伐克总理菲佐
  • 长期对组织隐瞒真实年龄,广元市城发集团原董事韩治成被双开
  • 上海国际电影节推出三大官方推荐单元,精选十部优秀影片
  • 2024年上市公司合计实现营业收入71.98万亿元