java快速幂算法

快速幂算法

参考视频(参考五角七边up大佬)

幂运算的介绍

幂运算是指将一个数自身乘以自身多次的运算,其表达式为 a n a^n an,其中 a a a 是底数, n n n 是指数。

快速幂解释

快速幂算法是一种用于快速计算幂运算的算法,它利用了指数的二进制表示和幂运算的性质。通过将指数 n n n 进行二进制拆分,可以将幂运算的时间复杂度降低到 O ( log ⁡ n ) O(\log n) O(logn)

算法实现思路

快速幂算法的实现思路如下:

  • 将指数 n n n 转换为二进制形式。
  • 从二进制形式的最低位开始遍历,每次将底数 a a a 自乘,直到遍历完所有的二进制位。

在这里插入图片描述

Java代码实现

下面是快速幂算法的Java代码实现:

public class FastExponentiation {// 快速幂算法实现public static long fastExponentiation(long base, long exponent) {long result = 1;while (exponent > 0) {if (exponent % 2 == 1) {// 对2取余相当于”按位与“运算,exponent % 2 = exponent & 1result *= base;}base *= base;exponent /= 2;//除2向下取整相当于右移一位  exponent /= 2 相当于  exponent >>> 1}return result;}public static void main(String[] args) {// 测试long base = 2;long exponent = 10;System.out.println(base + " 的 " + exponent + " 次幂为:" + fastExponentiation(base, exponent));}
}
应用举例
问题描述
  1. 幂取模运算:计算 a b m o d m a^b \mod m abmodm
  2. 计算斐波那契数列第 n n n 项。
  3. 将线性变换重复 n n n 次。
运用快速幂算法解决思路分析
  1. 幂取模运算:根据快速幂算法,先计算 a b a^b ab,然后对结果取模即可。
  2. 计算斐波那契数列第 n n n 项:利用斐波那契数列的递推关系 F n + 1 = F n + F n − 1 F_{n+1} = F_n + F_{n-1} Fn+1=Fn+Fn1,通过快速幂算法快速计算斐波那契矩阵的 n n n 次幂。
  3. 将线性变换重复 n n n 次:通过快速幂算法,将线性变换的矩阵 A A A 进行 n n n 次幂运算,即 A n A^n An
代码设计思路
  1. 幂取模运算:先利用快速幂算法求出幂运算结果,再对结果取模。
  2. 计算斐波那契数列第 n n n 项:利用快速幂算法求解斐波那契数列的矩阵快速幂,再取出结果矩阵的第一项即为第 n n n 项的斐波那契数。
  3. 将线性变换重复 n n n 次:同样利用快速幂算法进行矩阵快速幂运算,得到最终的线性变换矩阵。
6. Java代码实现(应用举例)

下面是三个应用举例的Java代码实现:

public class FastExponentiationExamples {// 幂取模运算:计算 a^b % mpublic static long modularExponentiation(long base, long exponent, long modulus) {long result = 1;while (exponent > 0) {if (exponent % 2 == 1) {result = (result * base) % modulus;}base = (base * base) % modulus;exponent /= 2;}return result;}// 计算斐波那契数列第 n 项public static long fibonacci(int n) {long[][] matrix = {{1, 1}, {1, 0}};long[][] result = matrixPower(matrix, n - 1);return result[0][0];}// 矩阵快速幂public static long[][] matrixPower(long[][] matrix, int exponent) {int n = matrix.length;long[][] result = new long[n][n];for (int i = 0; i < n; i++) {result[i][i] = 1;}while (exponent > 0) {if (exponent % 2 == 1) {result = matrixMultiply(result, matrix);}matrix = matrixMultiply(matrix, matrix);exponent /= 2;}return result;}// 矩阵乘法public static long[][] matrixMultiply(long[][] A, long[][] B) {int n = A.length;long[][] result = new long[n][n];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {for (int k = 0; k < n; k++) {result[i][j] += A[i][k] * B[k][j];}}}return result;}public static void main(String[] args) {// 测试long a = 3, b = 7, m = 1000000007;System.out.println("幂取模运算:" + a + "^" + b + " % " + m + " = " + modularExponentiation(a, b, m));int n = 10;System.out.println("斐波那契数列第 " + n + " 项:" + fibonacci(n));long[][] linearTransform = {{1, 1}, {0, 1}}; // 二维线性变换矩阵int repeat = 5;long[][] resultMatrix = matrixPower(linearTransform, repeat);System.out.println("线性变换重复 " + repeat + " 次的结果矩阵:");for (int i = 0; i < resultMatrix.length; i++) {for (int j = 0; j < resultMatrix[0].length; j++) {System.out.print(resultMatrix[i][j] + " ");}System.out.println();}}
}

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

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

相关文章

[当人工智能遇上安全] 13.威胁情报实体识别 (3)利用keras构建CNN-BiLSTM-ATT-CRF实体识别模型

《当人工智能遇上安全》系列将详细介绍人工智能与安全相关的论文、实践&#xff0c;并分享各种案例&#xff0c;涉及恶意代码检测、恶意请求识别、入侵检测、对抗样本等等。只想更好地帮助初学者&#xff0c;更加成体系的分享新知识。该系列文章会更加聚焦&#xff0c;更加学术…

Unity中支持泰语--没有版权限制

在Unity中支持泰语主要涉及以下几个方面&#xff1a; 选择合适的字体&#xff1a;在Unity中&#xff0c;确保使用支持泰文字符的字体是至关重要的。例如&#xff0c;可以选择使用Noto Serif Thai字体&#xff0c;这是一个支持泰语的字体2。 处理Unity版本问题&#xff1a;某些…

CentOS 网卡ifcfg-eth0 ping不通外网(www.baidu.com)

1、如果确认好就直接激活网卡&#xff01; ifup eth0 2、慢慢找&#xff1a; cd /etc/sysconfig/network-scripts/ ls 找到你的网卡是啥&#xff0c;这里网卡是 ifcfg-eth0 执行1就好了&#xff01;

JetBrains PyCharm 2024.1 发布 - 面向专业开发者的 Python IDE

JetBrains PyCharm 2024.1 发布 - 面向专业开发者的 Python IDE 请访问原文链接&#xff1a;JetBrains PyCharm 2024.1 (macOS, Linux, Windows) - 面向专业开发者的 Python IDE&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org…

LINUX[网络编程]

sendto函数的应用&#xff1a;向to结构体指针指向的IP&#xff0c;发送UDP数据 细节请看我注释&#xff0c;注满细节 代码&#xff1a; #include <stdio.h> #include <sys/socket.h> //socket函数 #include <unistd.h> //close函数 #include <st…

「PHP系列」PHP表单及表单验证详解

文章目录 一、表单二、表单校验三、相关链接 一、表单 PHP 表单用于收集用户输入的数据&#xff0c;并将这些数据发送到服务器进行处理。在 PHP 中&#xff0c;通常使用 HTML 表单来收集用户输入&#xff0c;然后通过 PHP 脚本处理这些数据。 <!DOCTYPE html> <html…

acwing2060. 奶牛选美

题目&#xff1a; 代码&#xff1a; //acwing2060. 奶牛选美 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N55; const int dx[]{-1,0,1,0},dy[]{0,-1,0,1}; bool st[N][N]; int point[N][N]; char map[N][…

Go实现简单的协程池(通过channel实现)

go编程时&#xff0c;goroutine是非常有用的特性。然而&#xff0c;实践中最好不要无限制的使用goroutine&#xff0c;例如一次性开一万个goroutine去读写文件是很危险的。为了控制goroutine的并行量&#xff0c;有很多框架或库实现了协程池&#xff0c;例如ants&#xff08;很…

MYBATIS获取参数值

MYBATIS最核心的莫过于动态的获取各种的参数值, 为了将来更好的使用MYBATIS进行开发, 我们必须先打好 "获取参数值" 这一基础 一. MYBATIS获取参数值的两种情况: 1.${} 实质:字符串的拼接 注解:${}使用的字符串拼接的方式拼接SQL语句, 所以, 如果其中出现了字符串…

APP下载页前端自适应HTML源码

源码介绍 APP下载页前端自适应HTML源码&#xff0c;可以作为自己的软件介绍页或者app下载页&#xff0c;喜欢的朋友可以拿去研究 效果预览 HTML源码下载 https://www.qqmu.com/3026.html

Flink WordCount实践

目录 前提条件 基本准备 批处理API实现WordCount 流处理API实现WordCount 数据源是文件 数据源是socket文本流 打包 提交到集群运行 命令行提交作业 Web UI提交作业 上传代码到gitee 前提条件 Windows安装好jdk8、Maven3、IDEA Linux安装好Flink集群&#xff0c;可…

线上问题监控 Sentry 接入全过程

背景&#xff1a; 线上偶发问题出现后 &#xff0c;测试人员仅通过接口信息无法复现错误场景&#xff1b;并且线上环境的监控&#xff0c;对于提高系统的稳定性 &#xff08;降低脱发率&#xff09; 至关重要&#xff1b;现在线上监控工具这个多&#xff0c;为什么选择Sentry?…

Java并发(1)--线程,进程,以及缓存

线程和进程是什么&#xff1f; 进程 进程是程序的一次执行过程&#xff0c;系统程序的基本单位。有自己的main方法&#xff0c;并且主要由主方法运行起来的基本上就是进程。 线程 线程与进程相似&#xff0c;但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以…

vb.net textbox滚动显示到最后一行

调用&#xff1a; Private Sub TextBox18_TextChanged(sender As Object, e As System.EventArgs) Handles TextBox18.TextChanged show_textbox_endline(TextBox18) End Sub 函数&#xff1a; 显示textbox最后一行 Public Sub show_textbox_endline(Tbx As TextB…

MVCC(解决MySql中的并发事务的隔离性)

MVCC 如何保证事务的隔离性&#xff1f; 1.排他锁&#xff1a;如一个事务获取了一个数据行的排他锁&#xff0c;其他事务就不能再获取改行的其他锁。 2.MVCC&#xff1a;多版本并发控制。 MVCC&#xff1a; 1.隐藏字段 1.DB_TRX_ID&#xff1a;最近修改事务的id。默认值从0开…

Selenium自动填写验证码(偏小白版本OCR)

OCR基础示例 我直接 上代码 from PIL import Image import pytesseract# 0 Orientation and script detection (OSD) only. # 1 Automatic page segmentation with OSD. # 2 Automatic page segmentation, but no OSD, or OCR. # 3 Fully automatic page segmentation, but n…

【MYSQL】索引机制概述

由于MySQL是作为存储层部署在业务系统的最后端&#xff0c;所有的业务数据最终都要入库落盘&#xff0c;但随着一个项目在线上运行的时间越来越久&#xff0c;数据库中的数据量自然会越来越多&#xff0c;而数据体积出现增长后&#xff0c;当需要从表查询一些数据时&#xff0c…

symfony框架

Symfony框架是一种流行的PHP框架&#xff0c;用于快速开发高质量的Web应用程序。它是一个开源框架&#xff0c;遵循MVC&#xff08;模型-视图-控制器&#xff09;设计模式&#xff0c;提供了一套强大的工具和组件&#xff0c;帮助开发人员更轻松地构建复杂的Web应用程序。 Sym…

Apache Storm的详细配置

Apache Storm的详细配置主要涉及以下几个方面: Zookeeper配置:Apache Storm使用Zookeeper来进行协调和配置管理。你需要配置Zookeeper集群的连接信息,包括Zookeeper服务器的主机和端口。 Storm Nimbus配置:Nimbus是Storm的主节点,负责分配任务给各个工作节点。你需要配置N…

javaScript设计模式之简单工厂模式

简单工厂模式(Simple Factory):又叫静态工厂方法&#xff0c;由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。 场景一 假设我们需要计算圆形和矩形的面积 function Circle(radius) {this.radius radius;}Circle.prototype.getArea function() {re…