Python-3.12.0文档解读-内置函数pow()详细说明+记忆策略+常用场景+巧妙用法+综合技巧


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

详细说明

功能描述

参数

返回值

使用规则

示例代码

基本使用

模运算

变动记录

记忆策略

常用场景

场景 1: 基本幂运算

场景 2: 计算倒数

场景 3: 幂运算结合模运算

场景 4: 计算倒数的模运算

场景 5: 处理复数结果

场景 6: 使用 pow 函数计算斐波那契数列的某一项

巧妙用法

技巧 1: 模逆的计算

技巧 2: 实现组合数计算

技巧3: 利用 pow 实现 RSA 加密和解密

综合技巧

技巧 1: 使用 pow 结合 itertools 生成密码学中的大素数

技巧2: 结合 multiprocessing 进行并行计算


详细说明

功能描述

pow 函数用于计算 base 的 exp 次幂。在提供 mod 参数时,返回 base 的 exp 次幂对 mod 取余。这比单独使用表达式 pow(base, exp) % mod 更高效。两参数形式 pow(base, exp) 等价于乘方运算符 base**exp。

参数

  • base (数值类型): 底数。
  • exp (数值类型): 指数。
  • mod (整数类型, 可选): 模数。如果提供,则返回结果为 base 的 exp 次幂对 mod 取余。如果不提供,则执行普通幂运算。

返回值

返回值的类型和输入参数类型有关:

  • 如果 base 和 exp 都是整数且不涉及负指数,则结果为整数。
  • 如果 exp 为负值,所有参数将被转换为浮点数,结果也为浮点数。
  • 如果 base 为负且 exp 为非整数,结果为复数。

使用规则

  1. 基本运算:
    • pow(10, 2) 返回 100。
    • pow(10, -2) 返回 0.01。
  2. 模运算:
    • pow(base, exp, mod) 将计算 (base ** exp) % mod。
  3. 负指数时的模运算:
  • 如果 exp 为负值且给定 mod,则 base 必须相对于 mod 不可整除。函数将计算 pow(inv_base, -exp, mod),其中 inv_base 是 base 的倒数对 mod 取余。

示例代码

基本使用
print(pow(10, 2)) # 输出 100

print(pow(10, -2)) # 输出 0.01
模运算
# 计算 2 的 5 次幂对 3 取余

print(pow(2, 5, 3)) # 输出 2



# 计算 38 的倒数对 97 取余

inv_38_mod_97 = pow(38, -1, 97)

print(inv_38_mod_97) # 输出 23

# 验证倒数

print((23 * 38) % 97 == 1) # 输出 True

变动记录

  • 版本 3.8 之前:
    • 三参数形式的 pow 不允许第二个参数为负值。
    • 仅支持位置参数。
  • 版本 3.8:
  • 三参数形式的 pow 现在允许第二个参数为负值,能够计算倒数的余数。

支持关键字参数。


记忆策略

pow 是单词 "power" 的缩写。在数学中,"power" 表示幂运算。因此,当看到 pow 时,可以联想到幂(power)运算。


常用场景

pow 函数在很多实际应用中都非常有用,尤其是在涉及幂运算和模运算的场景中。以下是几个详细的使用场景,每行代码都带有注释。

场景 1: 基本幂运算

计算一个数字的幂次方,例如科学计算或复利公式等。

# 计算 3 的 4 次幂
result = pow(3, 4)
# 预期输出 3 ** 4 = 81
print(result)  # 输出 81

场景 2: 计算倒数

当需要计算一个数的倒数时,使用负指数。

# 计算 5 的 -2 次幂,即 1 / (5 ** 2)
result = pow(5, -2)
# 预期输出 1 / (5 ** 2) = 1 / 25 = 0.04
print(result)  # 输出 0.04

场景 3: 幂运算结合模运算

常用于密码学中的大数计算,例如RSA算法。

# 计算 7 的 256 次幂对 13 取余
result = pow(7, 256, 13)
# 预期输出 (7 ** 256) % 13
print(result)  # 输出 9

场景 4: 计算倒数的模运算

在模运算中计算一个数的倒数,常用于加密算法和同余方程。

# 计算 38 的倒数对 97 取余
inv_38_mod_97 = pow(38, -1, 97)
# 检查 38 的倒数 (23) 和 38 相乘后对 97 取余是否为 1
# 预期输出 True
print((inv_38_mod_97 * 38) % 97 == 1)  # 输出 True

场景 5: 处理复数结果

处理负数底数和非整数指数的幂运算,会返回复数结果。

# 计算 -9 的 0.5 次幂,即 sqrt(-9)
result = pow(-9, 0.5)
# 预期输出复数 3j (即虚数单位 j)
print(result)  # 输出 3j

场景 6: 使用 pow 函数计算斐波那契数列的某一项

利用快速幂算法来计算斐波那契数列的第 n 项。

import math

def fibonacci(n):
    # 使用黄金比例公式计算 fib(n)
    phi = (1 + math.sqrt(5)) / 2
    psi = (1 - math.sqrt(5)) / 2
    
    # 计算 phi^n 和 psi^n
    phi_n = pow(phi, n)
    psi_n = pow(psi, n)
    
    # 按照公式计算斐波那契数列的第 n 项
    fib_n = (phi_n - psi_n) / math.sqrt(5)
    
    # 由于浮点数计算存在误差,这里使用四舍五入取整
    return round(fib_n)

# 计算 Fibonacci(10)
result = fibonacci(10)
# 预期输出 55
print(result)  # 输出 55

# 计算 Fibonacci(20)
result = fibonacci(20)
# 预期输出 6765
print(result)  # 输出 6765

巧妙用法

技巧 1: 模逆的计算

在数论和密码学中,经常需要计算模逆。一般方法可能需要扩展欧几里得算法,但 pow 函数可以巧妙地利用费马小定理快速计算模逆。

def mod_inverse(a, m):
    # 如果 m 是素数,利用费马小定理计算模逆
    return pow(a, m - 2, m)  # 这里假设 m 是素数

# 示例: 计算 3 在模 11 下的模逆
result = mod_inverse(3, 11)
print(result)  # 输出 4,因为 (3 * 4) % 11 = 1

技巧 2: 实现组合数计算

在组合数学中,计算组合数(即二项式系数)时,可以利用 pow 函数实现快速计算,特别是在模运算下。

def mod_comb(n, k, mod):
    if k > n:
        return 0
    if k == 0 or k == n:
        return 1
    
    # 计算 n! % mod
    num = 1
    for i in range(n, n - k, -1):
        num = (num * i) % mod
    
    # 计算 k! % mod
    denom = 1
    for i in range(1, k + 1):
        denom = (denom * i) % mod
    
    # 计算组合数: num * mod_inverse(denom, mod) % mod
    return (num * pow(denom, mod - 2, mod)) % mod

# 示例: 计算 C(10, 3) % 13
result = mod_comb(10, 3, 13)
print(result)  # 输出 10,因为 C(10, 3) = 120,120 % 13 = 10

技巧3: 利用 pow 实现 RSA 加密和解密

在 RSA 加密算法中,核心步骤是计算大整数的模幂。pow 函数的三参数形式非常适合这个任务。

# RSA 加密
def rsa_encrypt(message, e, n):
    return pow(message, e, n)

# RSA 解密
def rsa_decrypt(ciphertext, d, n):
    return pow(ciphertext, d, n)

# 示例参数(实际使用中参数应更大)
e = 65537
d = 2753
n = 3233

# 加密
message = 123
ciphertext = rsa_encrypt(message, e, n)
print(ciphertext)  # 输出密文

# 解密
decrypted_message = rsa_decrypt(ciphertext, d, n)
print(decrypted_message)  # 输出 123,解密后的明文

这些技巧展示了 pow 函数在计算效率和解决复杂数学问题上的强大功能,不仅能处理常见的幂运算,还能高效地计算模幂和模逆。


综合技巧

可以将 pow 函数与其他函数或方法结合使用来解决一些复杂问题,以下是几个巧妙的组合用法:

技巧 1: 使用 pow 结合 itertools 生成密码学中的大素数

在密码学中,大素数的生成和验证是一个重要的步骤。可以使用 itertools 生成候选素数,然后使用 pow 函数进行快速素数测试(如费马素性测试)。

import itertools
import random

def is_probable_prime(n, k=5):
    """使用费马素性测试检查一个数是否为素数"""
    if n <= 1:
        return False
    for _ in range(k):
        a = random.randint(2, n - 2)
        if pow(a, n - 1, n) != 1:
            return False
    return True

def generate_large_prime(bits):
    """生成指定位数的大素数"""
    while True:
        candidate = random.getrandbits(bits) | (1 << (bits - 1)) | 1
        if is_probable_prime(candidate):
            return candidate

# 示例:生成一个512位的大素数
large_prime = generate_large_prime(512)
print(large_prime)

技巧2: 结合 multiprocessing 进行并行计算

在大规模计算中,可以使用 multiprocessing 进行并行计算,并结合 pow 函数进行高效的数学运算。

from multiprocessing import Pool

def power_mod(base_exp_mod):
    base, exp, mod = base_exp_mod
    return pow(base, exp, mod)

# 示例:并行计算多个幂模运算
inputs = [(2, 100000000, 1000000007), (3, 200000000, 1000000007), (5, 300000000, 1000000007)]
with Pool() as pool:
    results = pool.map(power_mod, inputs)

print(results)  # 输出多个幂模运算结果的列表

以上这些例子展示了如何巧妙地将 pow 函数与其他函数或方法结合使用,解决实际中的复杂问题。这些技巧不仅高效,还能显著简化代码逻辑。


感谢阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/659708.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CAD石墨烯生成器 V1.0 渊鱼

插件介绍 CAD石墨烯生成器插件可用于在AutoCAD软件内参数化建立石墨烯几何模型。插件建立石墨烯的球棍模型&#xff0c;可控制模型的尺寸、碳原子环的尺寸、原子直径、化学键直径&#xff0c;并可控制模型的起伏形态。插件生成的实体模型可进行修改或绘图渲染&#xff0c;用于…

Java多线程(02)—— 线程等待,线程安全

一、如何终止线程 终止线程就是要让 run 方法尽快执行结束 1. 手动创建标志位 可以通过在代码中手动创建标志位的方式&#xff0c;来作为 run 方法的执行结束条件&#xff1b; public static void main(String[] args) throws InterruptedException {boolean flag true;Thr…

快速下载极客时间课程

仅供学习&#xff0c;切勿商用 1. 下载 下载geektime-downloader&#xff0c;安装到指定文件夹&#xff0c;注意路径尽量不要出现汉字 不想去github上下载的可以直接下载文章顶部的软件安装包。 2. 执行命令 在安装geektime-downloader目录下&#xff0c;点击鼠标右键&…

C++之运算符重载

1、运算符重载 //Complex.h #ifndef _COMPLEX_H_ #define _COMPLEX_H_class Complex { public:Complex(int real_, int imag_);Complex();~Complex();Complex& Add(const Complex& other); void Display() const;Complex operator(const Complex& other);privat…

Linux中常见的基本指令(上)

目录 一、ls指令 1. ls 2. ls -l 3. ls -a 4.ls -F 二、qwd指令 三、cd指令 1. cd .. 2. cd / / / 3. cd ../ / / 4. cd ~ 5. cd - 五、mkdir指令 六、rmdir指令和rm指令 一、ls指令 语法 &#xff1a; ls [ 选项 ][ 目录或文件 ] 。 功能 &#xff1a;对于目录…

手机号码携号转网查询保障用户权益、信息透明、优化用户体验

携号转网服务是指在同一本地网范围内&#xff0c;蜂窝移动通信用户&#xff08;不含物联网用户&#xff09;变更签约的基础电信业务经营者而用户号码保持不变的一项服务。近年来&#xff0c;随着通信行业的不断发展&#xff0c;携号转网服务已成为满足用户个性化需求、提升服务…

VBA让按钮消失

要求 用VBA搞小程序&#xff0c;有个录入数据的按钮&#xff0c;点击后进行录入数据的操作&#xff0c;操作完成后这个按钮就是灰的&#xff0c;点不动&#xff0c;这个怎么做&#xff1f; 实现过程 没找到让按钮变灰的方法&#xff0c;退而求其次&#xff0c;让按钮消失。 …

怎么更改图片格式?图片在线转格式的使用方法

现在很多的平台在上传图片的时候&#xff0c;都会有规定要求的大小、格式、尺寸&#xff0c;只有符合要求的图片才可以正常上传。在网上传图时想要快速的修改图片格式&#xff0c;比较简单的一个方法就是在使用在线图片格式转换的工具就能够快速处理&#xff0c;下面将图片转格…

发现没:随便搞个B端页面,就想在客户那里过关,难啦。

客户对B端界面要求越来越高的原因可以有以下几点&#xff1a; 用户体验要求提升&#xff1a;随着用户对移动应用和网页的使用经验增加&#xff0c;他们对于界面的交互、流畅性和易用性要求也越来越高。他们希望能够在使用B端应用时&#xff0c;能够快速、方便地完成任务&#…

Pooling Sequencing

1、混合(Pooling)样本测序研究 https://www.jianshu.com/p/19ce438ccccf 1.1 混合测序基础 测序成本虽然下降了,但对于植物育种应用研究来说还是很高,动不动就上百群体,小小植物个体价值又低,测完了很可能后面就用不到了。这时,混合样本测序是一种省钱的好办法。 混池…

Jetpack架构组件_4. 数据绑定库页面传递数据

本篇介绍数据源从activity_main&#xff08;1级页面&#xff09;传递给include布局&#xff08;2级页面&#xff09;。 1.实现步骤 step1.修改build.gradle文件 修改app模块下的build.gradle文件&#xff0c;增加如下内容&#xff1a; dataBinding {enabled true} step2.创建…

GPT-4o:引领人工智能新时代的强大引擎

前言 GPT-4o的推出&#xff0c;让我们再次感受到了人工智能技术的魅力。它不仅在技术上取得了显著突破&#xff0c;还为我们带来了广泛的应用前景。下面&#xff0c;我将从几个方面来谈谈GPT-4o的魅力。 一、技术突破&#xff0c;令人惊叹 1. 多模态处理能力的飞跃&#xff…

TC3xx分析--如何提高系统运行效率(1)

目录 1.Tricore寻址模式 2.lsl链接文件Section分析 3.小结 1.Tricore寻址模式 今天聊个好玩的事情。 之前ARM培训的时候&#xff0c;他们对于函数形参的先后顺序、数据类型、对齐方式等等做了介绍&#xff0c;详细分析了上述操作不同写法对于CPU的通用寄存器使用效率上的影…

【linux】运维-基础知识-认知hahoop周边

1. HDFS HDFS&#xff08;Hadoop Distributed File System&#xff09;–Hadoop分布式文件存储系统 源自于Google的GFS论文&#xff0c;HDFS是GFS的克隆版 HDFS是Hadoop中数据存储和管理的基础 他是一个高容错的系统&#xff0c;能够自动解决硬件故障&#xff0c;eg&#xff1a…

【旧文更新】基于OpenCV的Python人脸识别、检测、框选 (遍历目录下所有照片依次识别 视频随时标注)

【旧文更新】基于OpenCV的Python人脸识别、检测、框选 &#xff08;遍历目录下所有照片依次识别 视频随时标注&#xff09; 文章目录 关于旧文新发一、功能概览二、使用说明三、分部测试功能程序1.遍历目录功能2.界面获取目录功能3.人脸框选功能4.摄像头及框选功能5.延时功能 …

若依框架官网

RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架|RuoYi开源|RuoYi视频|若依视频|RuoYi开发文档|若依开发文档|Java开源框架|Java|SpringBoot|SrpingBoot2.0…

Linux--进程间通信(2)(有名管道)

目录 1.原理 2.创建命名管道 3.使用命名通道实现简单的通信 4.使用创建的命名管道 1.原理 匿名管道没有名称&#xff0c;它们是通过句柄在父进程和子进程之间传递的。这意味着匿名管道只能用于具有父子关系的进程之间。 但如果程序之间没关系&#xff0c;那么这时候就要用…

香橙派AIpro初体验

1.开发板资料 开发板资源 产品介绍主页&#xff1a;http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-AIpro.html开发板案例源码&#xff1a;https://gitee.com/ascend/EdgeAndRobotics工具&原理图&案例源码&开发手册&#x…

Centos安装,window、ubuntus双系统基础上安装Centos安装

文章目录 前言一、准备工作二、开始安装1、2、首先选择DATE&TIME2、选择最小安装3、 选择安装位置 总结 前言 因工作需要&#xff0c;我需要在工控机上额外装Centos7系统&#xff0c;不过我是装在机械硬盘上了不知道对性能是否有影响&#xff0c;若有影响&#xff0c;后面…

整理了六个正规靠谱的兼职赚钱软件,适合普通人做的兼职副业~

​随着互联网时代的到来&#xff0c;越来越多的人选择通过互联网赚钱。在这篇文章中&#xff0c;我们将探讨一些可以在网上长期赚钱的方法。 在网络上面其实有很多的赚钱方法&#xff0c;尽管方法很多&#xff0c;但是对于一些网络新手&#xff0c;刚进入互联网圈子不久的伙伴…