三十五、数学知识——快速幂(反复平方法 + 快速幂求逆元)

news2024/11/25 18:42:19

快速幂算法主要内容

  • 一、基本原理
    • 1、概念 + 暴力求解
    • 2、核心原理——反复平方法
    • 3、快速幂求逆元
  • 二、Java、C语言模板实现
  • 三、例题题解

一、基本原理

1、概念 + 暴力求解

  • 问题目标:
    • 快速求出 a^k mod p 的结果,时间复杂度为 O(logk),其中 a,p,k 为10的9次方。
  • 暴力求解:
res = 1;
for(int i  = 1; i <= k; i++)
{
	res = res * a mod p;
}
// 时间复杂度 O(k);

2、核心原理——反复平方法

  • 原理:
      1. 求解问题是 a^k mod p 。
      1. 方法是将 a^k 拆成若干项相乘的形式,即把 k 化成二进制形式,变成2的幂次相加。

在这里插入图片描述

  • 推导过程:反复平方法求解过程

在这里插入图片描述

  • 举例:

在这里插入图片描述

  • 算法步骤:
res = 1;
while(k != 0){
	if((k & 1) == 1)){
		res = res * a % p;
	}
	k >>= 1;
	a = (a * a) % p;
	return res;
}

3、快速幂求逆元

  • 乘法逆元定义:
    • 若整数 b,m互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得a/b ≡ a×x(modm),则称 x 为 b 的模 m 乘法逆元,记为 b^−1(modm)。b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m为质数时,b^(m−2) 即为 b 的乘法逆元。

在这里插入图片描述

  • 性质:

在这里插入图片描述

  • 求解问题与转化为:

在这里插入图片描述

  • 举例:

在这里插入图片描述

  • 无解条件:
    • b 为 p 的倍数,即两个数并不能做到互质,则 b * x ≡ 0 (mod p),无法满足余1的条件。

二、Java、C语言模板实现

// java 模板
// 快速幂求解
    static long qmi(long a, long k, long p){        // 快速幂求解
        
        long res = 1;
        
        while(k != 0){
            if((k & 1) == 1){
                res = res*a % p;
            }
            k >>= 1;
            a = a * a % p;
        }
        return res;
    }

// 快速幂求解

static long qmi(long a, long k, long p){        // 快速幂求解
        
    long res = 1;
        
    while(k != 0){
       if((k & 1) == 1){
           res = res*a % p;
       }
       k >>= 1;
       a = a * a % p;
   }
	return res;
}

if(a % p != 0){                             
   // 本题中只保证了p为质数,没保证ap互质
   // 此处判定两者a p是否能整除,如果整除,则代表不互质
      System.out.println(result);
}else{
      System.out.println("impossible");
}
// C++ 模板,由yxc实现
求 m^k mod p,时间复杂度 O(logk)int qmi(int m, int k, int p)
{
    int res = 1 % p, t = m;
    while (k)
    {
        if (k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}

三、例题题解

在这里插入图片描述

// java题解实现
import java.util.*;
import java.io.*;

public class Main{
    
    static long qmi(long a, long k, long p){            // 快速幂的求解
        long res = 1;                   // 结果存储
        
        while(k != 0){                  // 判断是否已经移位完毕,变成了0
            
            if((k & 1) == 1){           // 取出最后一位,如果等于1,则代表这一位的二进制可以用来构建幂次值
                res = res * a % p;      // a代表的就是不同幂次,相乘即指数相加,k等于指数相加
            }
            
            k >>= 1;                    // 右移一位
            a = (a * a) % p;            // 构成ak的幂次,每一个都是上一个幂次的 平方 + mod p
        }
        return res;
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String str1 = in.readLine();
        
        int n = Integer.parseInt(str1);
        
        for(int i = 0; i < n; i++){
            String[] str2 = in.readLine().split(" ");
            int a = Integer.parseInt(str2[0]);
            int k = Integer.parseInt(str2[1]);
            int p = Integer.parseInt(str2[2]);
            System.out.println(qmi(a, k, p));
        }
    }
}

在这里插入图片描述

import java.util.*;
import java.io.*;

public class Main{
    
    static long qmi(long a, long k, long p){        // 快速幂求解
        
        long res = 1;
        
        while(k != 0){
            if((k & 1) == 1){
                res = res*a % p;
            }
            k >>= 1;
            a = a * a % p;
        }
        return res;
    }
    
    
    public static void main(String[] args) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String str1 = in.readLine();
        
        int n = Integer.parseInt(str1);
        
        for(int i = 0; i < n; i++){
            String[] str2 = in.readLine().split(" ");
            long a = Integer.parseInt(str2[0]);
            long p = Integer.parseInt(str2[1]);
            long result = qmi(a, p - 2, p);             // 之所以是 p - 2 是费马定理得到的
            
            if(a % p != 0){                             
            // 本题中只保证了p为质数,没保证ap互质
            // 此处判定两者a p是否能整除,如果整除,则代表不互质
                System.out.println(result);
            }else{
                System.out.println("impossible");
            }
            
        }
    }
}

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

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

相关文章

华为OD机试真题B卷 Java 实现【字符串变换最小字符串】,附详细解题思路

一、题目描述 给定一个字符串s&#xff0c;最多只能进行一次变换&#xff0c;返回变换后能得到的最小字符串&#xff08;按照字典序进行比较&#xff09;。 变换规则&#xff1a;交换字符串中任意两个不同位置的字符。 二、输入描述 一串小写字母组成的字符串s。 三、输出…

人工智能-不确定性的量化

这一部分的重点内容有&#xff1a; 贝叶斯规则贝叶斯网络基于隐马尔可夫模型的概率推理 大概会有以下几种考察形式&#xff0c;有答案的历年期末考试题只解释一些注意的地方 贝叶斯网络-独立性 第二问答案很详细&#xff0c;第一问看↓ D-separation&#xff1a; 判断贝叶…

Stable-diffusion-webui 本地部署及使用

Stable-diffusion-webui 本地部署及使用 本地部署stable-diffusion-webui(windows)1.安装conda&#xff1b;2.创建conda env 和python 3.10.6&#xff1b;3.更新pip&#xff1b;4.安装cuda 11.8&#xff1b;5.克隆stable-diffusion-webui仓库 &#xff1b;6.下载SD模型7.运行sd…

Dubbo配置

dubbo配置官网参考 1.配置原则 JVM 启动 -D 参数优先&#xff0c;这样可以使用户在部署和启动时进行参数重写&#xff0c;比如在启动时需改变协议的端口。 XML 次之&#xff0c;如果在 XML 中有配置&#xff0c;则 dubbo.properties 中的相应配置项无效。 Properties 最后&a…

【群智能算法改进】一种改进的蝴蝶优化算法 改进蝴蝶优化算法 改进BOA[1]【Matlab代码#35】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始蝴蝶优化算法2. 改进蝴蝶优化算法2.1 动态转换概率策略2.2 最优邻域扰动策略2.3 随机惯性权重策略 3. 部分代码展示4. 仿真结果展示5. 资源获取6. 参考文献 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原…

React面试题和基础

React的特点&#xff1a; JSX它使用虚拟DOM &#xff0c;减少 DOM 操作&#xff0c;提升性能。便于和其他平台集成。它可以进行服务器端渲染。单向数据流。组件化 双向数据绑定和单向数据流区别&#xff1f; 单向绑定的优点在于清晰可控&#xff0c;缺点则在于模板代码过多。…

第一部分-基础篇-第二章:PSTN、PBX及呼叫中心业务

文章目录 序言上一篇文章&#xff1a;2.1 PSTN业务2.1.1 POTS2.1.2 商务业务2.1.3 其他增值业务 2.2 PBX业务2.2.1 呼叫转移2.2.2 同组代答 2.3 PBX与中继线2.4 IP-PBX业务2.5 呼叫中心2.5.1 什么是呼叫中心2.5.2 呼叫中心的历史2.5.3 呼叫中心的分类1.交换机类型的呼叫中心2.板…

C++——string

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月29日 内容&#xff1a;C——string内容讲解 目录 前言&#xff1a; 1.string&#xff08;续&#xff09;&#xff1a; 1.string::operator[]: 2.string:: length()&#xff1a; 3.string:: max_size(): 4.strin…

华南农业大学|图像处理与分析技术综合测试|题目解答:识别时钟上时间

设计任务 这是一幅表盘图像&#xff0c;试采用图像处理和分析技术&#xff0c;设计适当的算法和程序&#xff0c;计算出表盘上的指示时间&#xff08;要求精确到秒&#xff09;。请按统一要求写出算法原理、设计流程&#xff0c;并完成测试分析等报告内容。 算法设计 解题思路…

张小飞的Java之路——第四十二章——字节流

写在前面&#xff1a; 视频是什么东西&#xff0c;有看文档精彩吗&#xff1f; 视频是什么东西&#xff0c;有看文档速度快吗&#xff1f; 视频是什么东西&#xff0c;有看文档效率高吗&#xff1f; 诸小亮&#xff1a;下面我们学习——字节流 张小飞&#xff1a;什么是字…

article-并联机械手爪运动学分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3aNKIR4E-1685371700448)(data:image/svgxml;utf8, )] 2.4.3 基于Robotics Toolbox的工具箱的模型检测 上文中&#xff0c;我们已经对采摘机器手爪运动学理论模型进行了创建&#xff0c;接下来要用MA…

V3.0_用exec族函数替代system()

注意点&#xff1a;exec族函数的使用 以execl为例&#xff1a; &#xff08;1&#xff09; &#xff08;2&#xff09;exec族函数中的函数调用失败时会设置error并返回-1&#xff0c;然后从源程序调用点接着往下执行。 执行成功后不会返回&#xff0c;也不会从源程序调用点接…

Redis缓存一致性问题及解决方案

对于没有并发的用户请求 先更新缓存&#xff0c;后更新数据库先更新数据库&#xff0c;后更新缓存 两者第二步没成功&#xff0c;都有问题 如果更新缓存成功&#xff0c;更新数据库没成功&#xff0c;一旦缓存失效&#xff0c;读取的仍是旧值如果更新数据库成功&#xff0c;…

MySQL官网下载Linux版本安装包

步骤一&#xff1a;https://www.mysql.com/ 步骤二&#xff1a;https://www.mysql.com/downloads/ 步骤三&#xff1a;https://dev.mysql.com/downloads/ 步骤四&#xff1a;https://dev.mysql.com/downloads/mysql/

二十分钟秒懂:实现前后端分离开发(vue+element+spring boot+mybatis+MySQL)

目录 开发者介绍 什么是前后端分离开发 vue与springboot开发的优势 Vue.js 的优势&#xff1a; Spring Boot 的优势&#xff1a; vue与springboot如何实现前后端连接 demo简介 重要部分前端部分代码 重要部分后端代码 后端解决跨域问题 Controller部分 xml部分 se…

商城APP开发需要哪些功能,如何选择开发公司

商城APP开发的功能有很多&#xff0c;从功能上看主要分为以下几个大类&#xff1a; 一、商品展示类&#xff1a;商家可以在这里展示自己产品的种类、数量、价格等信息&#xff0c;消费者在浏览和选择的时候&#xff0c;能直观的看到商家介绍。 二、优惠促销类&#xff1a;商家…

JDBC与DBCP整合

DBCP:DataBase Connection Pool,数据库连接池负责分配、管理和释放数据库连接&#xff0c;它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是再重新建立一个&#xff1b;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接…

第四章 相似矩阵与矩阵对角化

引言 题型总结中推荐例题有蓝皮书的题型较为重要&#xff0c;只有吉米多维奇的题型次之。码字不易&#xff0c;如果这篇文章对您有帮助的话&#xff0c;希望您能点赞、评论、收藏&#xff0c;投币、转发、关注。您的鼓励就是我前进的动力&#xff01; 知识点思维导图 补充&…

【Web服务器集群】Apache配置与应用

文章目录 一、构建虚拟web主机1.概述2.httpd服务支持的虚拟主机类型3.构建虚拟Web主机3.1基于域名的虚拟主机3.2基于IP地址的虚拟主机3.3基于端口的虚拟主机 4.Apache连接保持5.Apache访问控制 二、Apache日志管理rotatelogs分隔工具 三、总结1.Web虚拟主机部署步骤2.网页根目录…

DN-DETR代码学习笔记

代码地址&#xff1a;GitHub - IDEA-Research/DN-DETR: [CVPR 2022 Oral]Official implementation of DN-DETR 论文地址&#xff1a; https://arxiv.org/pdf/2203.01305.pdf DN-DETR是在DAB-DETR的基础上完成的&#xff0c;DN-DETR的作者认为导致DETR类模型收敛慢的原因在于匈牙…