快速幂算法【算法 08】

news2024/11/12 11:47:37

快速幂算法详解

请添加图片描述

在计算机编程中,快速幂算法是一种高效计算大整数幂次的算法。相较于直接的暴力计算,快速幂能够在对数级别的时间复杂度下完成运算,因此它在许多算法和问题中(如数论、组合数学、密码学等)都有广泛的应用。

1. 什么是快速幂?

快速幂算法的核心思想是将指数分解为二进制形式,利用“幂的二次方”特性,将时间复杂度从O(n)(常规幂运算需要乘法 n 次)降低到O(log n)

举个例子

假设我们要计算 (a^{13}):

  • 直接计算的话需要 (a) 乘以自己 13 次。
  • 但是通过快速幂,我们可以先将 13 表示为二进制数:(13 = 1101_2)。

于是,可以利用以下公式快速计算:

a 13 = a 110 1 2 = a 8 × a 4 × a a^{13} = a^{1101_2} = a^8 \times a^4 \times a a13=a11012=a8×a4×a
每次将幂指数减半,同时将基数平方,从而减少计算量。

2. 算法的核心思想

快速幂的核心是通过分治法的思想,将一个大问题分解为若干个小问题。假设我们要计算 (a^b),可以分为两种情况:

  1. b 为偶数时
    a b = ( a b / 2 ) 2 a^b = (a^{b/2})^2 ab=(ab/2)2

    例如:
    ( a 4 = ( a 2 ) 2 ) (a^4 = (a^2)^2) (a4=(a2)2)

  2. b 为奇数时
    a b = a × a b − 1 a^b = a \times a^{b-1} ab=a×ab1
    例如:
    ( a 5 = a × a 4 ) (a^5 = a \times a^4) (a5=a×a4)

利用这种递归分解的方式,可以在对数级别的时间内完成大幂次计算。

3. 代码实现

递归实现

def fast_pow(a, b):
    if b == 0:
        return 1
    temp = fast_pow(a, b // 2)
    if b % 2 == 0:
        return temp * temp
    else:
        return temp * temp * a

非递归实现

非递归实现的版本使用循环,可以避免递归深度过深的问题。

def fast_pow_iterative(a, b):
    result = 1
    base = a
    while b > 0:
        if b % 2 == 1:
            result *= base
        base *= base
        b //= 2
    return result

4. 时间复杂度分析

在上面的算法中,指数 (b) 每次都被减少一半,因此总的递归或循环次数为 (O(\log b))。相较于普通幂运算的时间复杂度 (O(b)),快速幂大大提高了计算效率,尤其在处理大整数时,优势更加明显。

5. 快速幂的应用

快速幂算法在多个领域都有应用,包括但不限于:

  1. 模幂运算:快速幂常用于计算大数取模。例如,在RSA算法中,需要计算巨大的幂次模运算。
  2. 矩阵快速幂:快速幂同样适用于矩阵的幂次计算,特别是在求解递归数列(如斐波那契数列)时能大大加速计算。
  3. 数论问题:如欧拉定理、费马小定理等都可以通过快速幂来实现高效运算。

示例:模幂运算

def mod_exp(a, b, m):
    result = 1
    base = a % m
    while b > 0:
        if b % 2 == 1:
            result = (result * base) % m
        base = (base * base) % m
        b //= 2
    return result

在上述代码中,模幂运算的复杂度同样是 (O(\log b)),这是因为幂指数每次都减少一半,同时确保结果在每一步都进行模运算以防止数值溢出。

6. 总结

快速幂算法通过减少幂运算的次数,从而将时间复杂度降到了对数级别。它在各种实际场景中的应用展现了其高效性和实用性。如果你需要处理大整数幂次运算,快速幂无疑是一个理想的选择。

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

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

相关文章

web常见漏洞之——SSRF

ssrf 概述工具环境实验一 概述 SSRF(Server-Side Request Forgery)叫做服务器请求伪造,因为服务器提供了从其他服务器应用获取数据的功能且没有对目标地址进行过滤和限制导致黑客可以对服务器请求的地址进行伪造。 ssrf漏洞的主要用处就是对服务器进行资源扫描&am…

YOLOv9改进策略【损失函数篇】| Slide Loss,解决简单样本和困难样本之间的不平衡问题

一、本文介绍 本文记录的是改进YOLOv9的损失函数,将其替换成Slide Loss,并详细说明了优化原因,注意事项等。Slide Loss函数可以有效地解决样本不平衡问题,为困难样本赋予更高的权重,使模型在训练过程中更加关注困难样…

【回溯Ⅱ】组合问题

用回溯(递归)解决组合问题 第一类组合问题77.组合216.组合问题Ⅲ 第二类组合问题39. 组合总和递归法一:组合位置填空递归法二:遍历数组 40. 组合总和 II递归法一:组合位置填空递归法二:遍历数组❌ 常规思路…

SpringBoot集成kafka-监听器手动确认接收消息(主要为了保证业务完成后再确认接收)

SpringBoot集成kafka-监听器手动确认接收消息 1、说明2、示例2.1、application.yml2.2、消费者2.3、生产者2.4、测试类2.5、测试 1、说明 kafak中默认情况下是自动确认消息接收的,也就是说先启动消费者监听程序,再启动生产者发送消息,此时消…

【动态规划】第 N 个泰波那契数

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 题目讲解算法原理代码实现 题目 题目如下: 讲解算法原理 我们先说一下动态规划题目的整体做题思路: 第一步: 状态表示 什么是状态表示? 做动态规划类题目一般…

跟李沐学AI:样式迁移

样式迁移需要两张输入图像:一张是内容图像,另一张是样式图像。 我们将使用神经网络修改内容图像,使其在样式上接近样式图像,得到合成图片。类似手机相册中的滤镜效果。 奠基性工作:基于CNN的样式迁移 任务&#xff1…

vue3+vite+axios+mock从接口获取模拟数据实战

文章目录 一、安装相关组件二、在vite.config.js中配置vite-plugin-mock插件三、实现mock服务四、调用api接口请求mock数据方法一、直接使用axios 请求mock 数据方法二、对axios进行封装统一请求mock数据 五、实际运行效果 在用Vue.js开发前端应用时通常要与后端服务进行交互&a…

WPF 选择对应控件技巧

当界面控件过多,选择对应的控件是比较困难的。

白酒与青年文化:潮流与传统的碰撞

在时代的洪流中,青年文化如同一股涌动的潮流,不断冲击着传统的边界。而白酒,作为中国传统文化的瑰宝,也在这一潮流中找到了新的表达方式。今天,我们就来探讨一下白酒与青年文化之间的碰撞与整合,以及豪迈白…

项目问题 | vscode连接远程Linux服务器报错: “> Host key verification failed. > 过程试图写入的管道不存在”

远程连接服务器时报错: Please contact your system administrator. Add correct host key in C:\Users\LiHon/.ssh/known_hosts to get rid of this message. Offending ECDSA key in C:\Users\LiHon/.ssh/known_hosts:9 Host key for 124.71.71.215 has changed a…

七种有效将msvcp140.dll丢失的解决方法,快速修复msvcp140.dll错误

在使用Windows操作系统的计算机上安装或运行软件时,用户可能遭遇“msvcp140.dll丢失”这一常见错误。这个问题通常发生在尝试启动某些程序时,系统会弹出一个警告窗口,提示“无法继续执行代码,因为系统未找到msvcp140.dll”。这样的…

【学习笔记】AD实现原理图的元器件自动标号

【学习笔记】AD24实现原理图的元器件自动标号 在原理图绘制过程中,载入的元器件封装并不会默认标号,而是“?”的形式显示,为避免手动标号所带来的大量繁琐工作,自动标号会是一个很好的选择。 在 Altium Designer&…

【网络】传输层协议——TCP协议(初阶)

目录 1.TCP协议 1.1.什么是TCP协议 1.2.为什么TCP叫传输控制协议 1.2.TCP是面向字节流的 2.TCP协议段格式 2.1.流量控制——窗口大小(16位) 2.2.确认应答机制 2.2.1.什么是确认应答机制 5.2.2.推导确认应答机制 5.3.2.确认号和序列号 2.3.六位…

日志审计-graylog ssh登录超过6次告警

Apt 设备通过UDP收集日志,在gray创建接收端口192.168.0.187:1514 1、ssh登录失败次数大于5次 ssh日志级别默认为INFO级别,通过系统rsyslog模块处理,日志默认存储在/var/log/auth.log。 将日志转发到graylog vim /etc/rsyslog.conf 文件末…

四、前后端分离通用权限系统(4)

🌻🌻 目录 一、前端开发和前端开发工具1.1、前端开发介绍1.2、下载和安装 VS Code1.2.1、下载地址1.2.2、插件安装1.2.3、创建项目1.2.4、保存工作区1.2.5、新建文件夹和网页1.2.6、预览网页1.2.7、设置字体大小 二、Node.js2.1、Node.js 简介2.1.1、什么…

汇编知识MOV,MRS,MSR,PUSH和POP指令

处理器做得最多的事情就是在处理器内部来回的进行数据传递 1) 将数据从一个寄存器传递到另一个寄存器中 2) 将数据从一个寄存器传递到特殊寄存器,例如CPSR,SPSR寄存器 3) 将立即数传递到寄存器。 数据传输常用的三个指令:MOV,MRS,MSR指令 常用的…

微信小程序模板与配置(三)app.json对小程序进行全局性配置

全局配置文件及常用的配置项 小程序根目录下的app.json文件是小程序的全局配置文件。常用的配置项如下: pages 记录当前小程序所有页面的存放路径window 全局设置小程序窗口的外观tabBar 设置小程序底部的tabBar效果style 是否启用新版的组件样式 一、全局配置-w…

Python测试框架Pytest的使用

pytest基础功能 pytset功能及使用示例1.assert断言2.参数化3.运行参数4.生成测试报告5.获取帮助6.控制用例的执行7.多进程运行用例8.通过标记表达式执行用例9.重新运行失败的用例10.setup和teardown函数 pytset功能及使用示例 1.assert断言 借助python的运算符号和关键字实现不…

解决 VMware 中 Ubuntu文件系统磁盘空间不足

目录 问题引入 解决方案 第一步、在VMware中扩展容量: 第二步、查看磁盘空间使用情况: 第三步、安装分区工具: 第四步、启动该分区工具: 第五步、操作分区: 第六步、修改挂载文件夹的读写权限: 第七…

全网最全的yolo系列转换工具,从txt转xml,再从xml转txt,亲自测试好用

在训练yolo的过程中,难免涉及标注的数据格式转化,经过了几次修改和迭代,最终把转化代码跟大家一起分享。 先把xml转txt部分的代码分享一下,py_convert_xml2txt.py: # -*- coding:utf-8 -*-import os import shutil im…