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

news2024/11/17 21:31:48


一个认为一切根源都是“自己不够强”的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 函数与其他函数或方法结合使用,解决实际中的复杂问题。这些技巧不仅高效,还能显著简化代码逻辑。


感谢阅读。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 下载安装Apache

一、官网下载 1、打开Apache官网http://httpd.apache.org&#xff0c;点击Download。 2、选择Windows版本&#xff0c;点击链接。 3、选择对应版本选择下载。 二、安装、设置 1、将下载好的解压。 2、依次打开Apache24-conf-httpd.conf,用记事本打开 1)、修改路径 2)、修改…

C# TcpClient

TcpClient 自己封装的话&#xff0c;还是比较麻烦的&#xff0c;可以基于线程&#xff0c;也可以基于异步写&#xff0c;最好的办法是网上找个插件&#xff0c;我发现一个插件还是非常好用的&#xff1a;STTech.BytesIO.Tcp 下面是这个插件作者的帖子&#xff0c;有兴趣的可以…

【深度学习实战—9】:基于MediaPipe的人脸关键点检测

✨博客主页&#xff1a;王乐予&#x1f388; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深度学习】【排序算法】 目录 &#x1f63a;一、Med…

IDEA中各种Maven相关问题(文件飘红、下载依赖和启动报错)

错误情况 包名、类名显示红色、红色波浪线&#xff0c;大量依赖提示不存在&#xff08;程序包xxx不存在&#xff09; 工程无法启动 一、前提条件 1、使用英文原版IDEA 汉化版的可能有各种奇怪的问题。建议用IDEA英文版&#xff0c;卸载重装。 2、下载maven&#xff0c;配置环…

PFC+LLC 概述

总电路图 方案为&#xff1a;PFC&#xff08;NCP1654D&#xff09;LLC&#xff08;NCPB97B&#xff09;同步整流 输入为220V&#xff08;正负20%&#xff09;输出48V&#xff0c;600W电源 组成 1.输入 零线&#xff0c;火线&#xff0c;大地线&#xff0c;有防雷电路&#…

后量子加密算法的数学原理

后量子加密算法是一类专为抵御量子计算机攻击而设计的加密算法。随着量子计算技术的迅速发展&#xff0c;传统的加密算法如RSA和椭圆曲线密码学在量子计算机面前变得脆弱&#xff0c;因此&#xff0c;开发能够在量子计算时代保持安全性的加密算法变得尤为重要。下面将详细介绍后…

使用小猪APP分发打造高效的App封装工具

你是否曾经因为App封装和分发的复杂性而头疼不已&#xff1f;在这个移动应用迅速发展的时代&#xff0c;开发人员不仅需要专注于应用的功能和用户体验&#xff0c;还必须面对繁琐的封装和分发过程。幸运的是&#xff0c;小猪APP分发www.appzhu.cn正好为我们提供了一个简便而高效…

STM32_HAL_使用FPEC实现闪存的读写

STM32的FLASH结构 主存储器&#xff08;Main Memory&#xff09;&#xff1a;这是STM32中最大的存储区域&#xff0c;用于存储用户的程序代码、常量数据以及程序运行时不变的数据。STM32的主存储器通常被组织为多个扇区&#xff08;sector&#xff09;&#xff0c;每个扇区的大…

构建高效稳定的运维服务体系:技术架构解析与最佳实践

在当今数字化时代&#xff0c;运维服务对于企业的稳定运行和业务发展至关重要。本文将深入探讨运维服务的技术架构&#xff0c;介绍如何构建高效稳定的运维服务体系&#xff0c;并分享最佳实践。 ### 1. 概述 运维服务的技术架构是支撑整个运维体系的核心&#xff0c;它涵盖了…

邻接矩阵广度优先遍历

关于图的遍历实际上就两种 广度优先和深度优先&#xff0c;一般关于图的遍历都是基于邻接矩阵的&#xff0c;考试这些&#xff0c;用的也是邻接矩阵。 本篇文章先介绍广度优先遍历的原理&#xff0c;和代码实现 什么是图的广度优先遍历&#xff1f; 这其实和二叉树的层序遍…

基于魔搭开源推理引擎 DashInfer实现CPU服务器大模型推理--理论篇

前言 在人工智能技术飞速发展的今天&#xff0c;如何高效地在CPU上运行大规模的预训练语言模型&#xff08;LLM&#xff09;成为了加速生成式AI应用广泛落地的核心问题。阿里巴巴达摩院模型开源社区ModelScope近期推出了一款名为DashInfer的推理引擎&#xff0c;旨在解决这一挑…

Ingress controller:Kubernetes 的瑞士军刀

原文作者&#xff1a;Brian Ehlert of F5 原文链接&#xff1a;Ingress controller&#xff1a;Kubernetes 的瑞士军刀 转载来源&#xff1a;NGINX 中文官网 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 许多人认为 Ingress controller&#xff08;Ingress 控制器&…

CCF20211201——序列查询

CCF20211201——序列查询 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; #define Max 10000000 int a[Max]{0},b[Max]{0}; int main() {int n,m;int sum0,x0,flag0;cin>>n>>m;for(int i1;i<n;i){cin>>a[i];}for(int i0,x0;i&l…

闪电加载:Hexo博客性能优化全攻略

巴索罗缪大熊 前言 这些年积累了很多前端性能优化的知识点和思路&#xff0c;日常工作很少涉及技术层极限优化&#xff0c;近期终于一点点把博客独立搭建并部署了&#xff0c;对之前的一些技术点进行了深度探索&#xff0c;最终结果也达到了预期效果&#xff0c;由于水平有限&…

【安装笔记-20240528-Linux-在 Vultr 云服务器上安装 OpenWRT】

安装笔记-系列文章目录 安装笔记-20240528-Linux-在 Vultr 云服务器上安装测试 OpenWRT 文章目录 安装笔记-系列文章目录安装笔记-20240528-Linux-在 Vultr 云服务器上安装测试 OpenWRT 前言一、软件介绍名称&#xff1a;OpenWRT主页官方介绍 二、安装步骤测试版本&#xff1a…

【html+css(大作业)】二级菜单导航栏

目录 实现效果 代码及其解释 html部分 CSS部分 hello&#xff0c;hello好久不见&#xff01; 今天我们来写二级导航栏&#xff0c;所谓二级导航栏&#xff0c;简单来说就是鼠标放上去就有菜单拉出&#xff1a; 实现效果 代码及其解释 html部分 <!DOCTYPE html> &l…

白酒:新兴产区的发展与市场前景展望

云仓酒庄豪迈白酒作为新兴产区的重要代表&#xff0c;其发展与市场前景备受关注。随着消费者对白酒品质和口感的不断追求&#xff0c;新兴产区在继承传统酿造工艺的基础上&#xff0c;不断创新和发展&#xff0c;逐渐在市场上崭露头角。 首先&#xff0c;新兴产区在酿造工艺方面…

[源码+搭建教程]西游伏妖篇手游_GM_单机+和朋友玩

为了学习和研究软件内含的设计思想和原理&#xff0c;本人花心血和汗水带来了搭建教程&#xff01;&#xff01;&#xff01; 教程不适于服架设&#xff0c;严禁服架设&#xff01;&#xff01;&#xff01;请牢记&#xff01;&#xff01;&#xff01; 教程仅限学习使用&…

卧式混料机:混合设备的智慧之选

卧式混料机&#xff0c;顾名思义&#xff0c;是一种采用卧式结构的混合设备。它的设计精巧&#xff0c;结构紧凑&#xff0c;不仅占用空间小&#xff0c;而且操作简便&#xff0c;维护方便。与传统的立式混料机相比&#xff0c;卧式混料机在混合效率、混合均匀度以及物料适应性…

Suno进阶手册 | 创作歌曲玩法全攻略!

Suno进阶手册:创作歌曲玩法全攻略! 前言1. 基础模式2. 高级模式总结前言 前段时间,Suno V3 横空出世,与此前的V2相比,V3生成的作品质量明显提升! 该说不说,对比同类型工具,Suno的体验“遥遥领先”,没有AI生成常有的机械感,歌词押韵,甚至还附带有和声、分段。 虽然…