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…

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][…

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;可…

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

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

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

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

【MYSQL】索引机制概述

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

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

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

总结SQL相对常用的几个字符函数

目录 字符的截取 substr() trim()、ltrim()、rtrim() 字符串的拼接 ||、 字符的大小写转换 upper(column_name):大写 lower(column_name):小写 字符替换 replace() 搜索字符 instr(column_name, substring_to_find,start,n_appearence) charindex(substring_to_fi…

【问题解决】ubuntu安装新版vscode报code-insiders相关错误

问题 目前 vscode官网 最新的包为 insiders_1.89.0-1712297812_amd64.deb &#xff0c;双击或者使用sudo dpkg -i code-insiders_1.89.0-1712297812_amd64.deb安装后报错&#xff0c;执行其他命令也报错。 安装环境&#xff1a;ubuntu18.04 dpkg: 处理软件包 code-insiders (…

火绒安全软件:程序员的网络守护天使

目录 前言 系统防护 网络防护 隐私保护 高级设置 软件安全 响应速度 持续更新 总结 前言 在这个充满机遇与挑战的数字时代&#xff0c;程序员们如同探险家&#xff0c;不断探索着代码的新大陆。然而&#xff0c;网络世界也充斥着各种未知的风险和威胁。火绒安全软件&a…

基于java+springboot+vue实现的药品管理系统(文末源码+Lw)23-297

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;药品信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署

文章目录 简介支持的模型列表2. 添加自定义数据集3. lora 微调4. 大模型 lora 权重&#xff0c;部署问题 参考资料 简介 llama-factory SFT系列教程 (一)&#xff0c;大模型 API 部署与使用本文为 llama-factory SFT系列教程的第二篇&#xff1b; 支持的模型列表 模型名模型…

Composer安装与配置

Composer&#xff0c;作为PHP的依赖管理工具&#xff0c;极大地简化了PHP项目中第三方库的安装、更新与管理过程。本文将详细介绍Composer的安装步骤、基本配置方法&#xff0c;以及一些实用的操作示例&#xff0c;帮助读者快速上手并熟练运用Composer。 一、Composer安装 环…

C++内存分布

C代码编译过程 预处理 宏定义展开、头文件展开、条件编译&#xff0c;这里并不会检查语法编译检查语法&#xff0c;将预处理后文件编译生成汇编文件汇编将汇编文件生成目标文件(二进制文件)链接将目标文件链接为可执行程序 进程的内存分布 程序运行起来(没有结束前)就是一个…

SQL Server 存储函数(funGetId):唯一ID

系统测试时批量生成模拟数据&#xff0c;通过存储函数生成唯一ID。 根据当前时间生成唯一ID&#xff08;17位&#xff09; --自定义函数&#xff1a;根据当前时间组合成一个唯一ID字符串:yearmonthdayhourminutesecondmillisecond drop function funGetId;go--自定义函数&…