快速幂(求解原理+例题)

目录

反复平方法(快速幂):

代码: 

例题:快速幂求逆元


作用:

        快速求出 a^k \ mod \ p 的结果。

时间复杂度:

        O(logk)

        如果使用一般做法,从1循环到k,时间复杂度是O(k)

 

反复平方法(快速幂):

        将 k 用二进制表示:(k)_{10}=(....)_2

        那么  k = 2^{x_1}+2^{x_2} + ... +2^{x_t}\ \ \ x_t<=log_2k

        因此  a^k \ =\ a^{2^{x_1}+2^{x_2}+...+2^{x_t}} \ \ \ x_t<=log_2k

        我们可以把 a^k 拆分成  a^k \ =\ a^{2^{x_1}} * a^{2^{x_2}} *... * a^{2^{x_t}} \ \ \ x_t<=log_2k 

        因此我们只需要预处理出下面的,就可以解决上述方法:

         a^{2^0} \ mod \ p\\a^{2^1} \ mod\ p\\a^{2^2}\ mod\ p\\.\\.\\a^{2^{logk}}\ mod \ p

        如何求解这些需要预处理:

        每次乘2

        

qmi(long a,long k,long p){long res = 1;while(k!=0){if((k&1)==1) res = res*a%p; // 如果该位是1k = k>>1; // 右移一位a = a*a%p; //每次乘2}System.out.println(res);
}

         该代码使用了一种位运算技巧。

        位运算---求n的二进制表示中第k位是1还是0 (lowbit)-CSDN博客

例子:

 

 

标准例题代码: 

给定 n 组 ai,bi,pi,对于每组数据,求出 a_i^{b_i}\ mod\ p_i 的值。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含三个整数 ai,bi,pi。

输出格式

对于每组数据,输出一个结果,表示 a_i^{b_i}\ mod\ p_i 的值。

每个结果占一行。

数据范围

1≤n≤100000,
1≤ai,bi,pi≤2×10^9

输入样例:

2
3 2 5
4 3 9

输出样例:

4
1

import java.util.*;
import java.io.*;class Main{static final int N = 100010;static int n;public static void main(String[] args) throws IOException{BufferedReader in = new BufferedReader(new InputStreamReader(System.in));n = Integer.parseInt(in.readLine());while(n-->0){String[] s = in.readLine().split(" ");long a = Long.parseLong(s[0]);long b = Long.parseLong(s[1]);long p = Long.parseLong(s[2]);qmi(a,b,p); // 快速幂}}public static void qmi(long a,long b,long p){long res = 1;while(b!=0){if((b&1)==1) res = res*a%p; // 如果该位是1b = b>>1; // 右移一位a = a*a%p; //每次乘2}System.out.println(res);}
}

例题:快速幂求逆元

        费马定理。

给定 n 组 ai,pi,其中 pi 是质数,求 ai 模 pi 的乘法逆元,若逆元不存在则输出 impossible

注意:请返回在 0∼p−1 之间的逆元。

乘法逆元的定义

若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得 \frac{a}{b}\equiv a*x\ (mod \ m),则称 x 为 b 的模 m 乘法逆元,记为 b^{-1}\ (mod\ m)

b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,b^{m-2} 即为 b 的乘法逆元。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个数组 ai,pi,数据保证 pi 是质数。

输出格式

输出共 n 行,每组数据输出一个结果,每个结果占一行。

若 ai 模 pi 的乘法逆元存在,则输出一个整数,表示逆元,否则输出 impossible

数据范围

1≤n≤10^5,
1≤ai,pi≤2∗10^9

输入样例:

3
4 3
8 5
6 3

输出样例:

1
2
impossible

解决方法:

         \frac{a}{b}\equiv a*x\ (mod \ m)

       由题意可知: \frac{a}{b}\equiv a*b^{-1}\ (mod \ m)

        {a}\equiv a*b*b^{-1}\ (mod \ m)

        b*b^{-1}\equiv 1\ (mod \ m)

        x 为 b 的模 m 乘法逆元,记为 b^{-1}\ (mod\ m),因此 b*x\equiv 1\ (mod \ m)

        由费马定理可知:

                ​​​​​​​        ​​​​​​​        b^{p-1}\ \equiv \ 1\ (mod\ p)\\b*b^{p-2} \ \equiv \ 1\ (mod\ p)

        因此,x = b^{p-2}\ (mod \ p)

        再使用快速幂解决:

import java.util.*;
import java.io.*;
class Main{static int n;public static void main(String[] args) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));n = Integer.parseInt(br.readLine());while(n-->0){String[] s = br.readLine().split(" ");int a = Integer.parseInt(s[0]);int p = Integer.parseInt(s[1]);long res = qmi(a,p-2,p);if(a%p==0) System.out.println("impossible");else System.out.println(res);}}public static long qmi(int a,int k,int p){long res = 1;while(k!=0){if((k&1)==1) res = res*a%p;k = k>>1;a = (int)((long)a*a%p);}return res;}
}

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

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

相关文章

那些壁纸,不只是背景

1、方小童在线工具集 网址&#xff1a; 方小童 该网站是一款在线工具集合的网站&#xff0c;目前包含PDF文件在线转换、随机生成美女图片、精美壁纸、电子书搜索等功能&#xff0c;喜欢的可以赶紧去试试&#xff01;

kafka同步副本集及关键参数

上篇文章讲了副本机制是什么&#xff0c;一文读懂kafka内部怎么运行的-CSDN博客 这里深挖下同步副本集及里面的关键参数。副本会去leader副本拉去数据追加到自己日志中。 我们知道kafka副本的作用是提高系统的高可用。当leader副本挂了时&#xff0c;会从候选副本集中选者一个当…

ubuntu环境下docker容器详细安装使用

文章目录 一、简介二、ubuntu安装docker1.删除旧版本2.安装方法一3. 安装方法二&#xff08;推荐使用&#xff09;4.运行Docker容器5. 配置docker加速器 三、Docker镜像操作1. 拉取镜像2. 查看本地镜像3. 删除镜像4. 镜像打标签5. Dockerfile生成镜像 四、Docker容器操作1. 获取…

H12-821_113

113.如图所示是路由器现ATE输出的部分信息&#xff0c;以下关于这部分信息的描述&#xff0c;错误的是哪一项&#xff1f; A.display pim rp-info命令用来查看组播组对应的RP信息 B.RP地址是2.2.2.2 C.组地址是225.0.0.0 D.RP的优先级是0 答案&#xff1a;C 注释&#xff1a; …

STM32-BKP备份寄存器和RTC时钟

BKP介绍 BKP(Bckup Registers&#xff09;备份寄存器 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT&#xff08;备用电池电源&#xff09;维持供电。当系统在待机…

mprpc分布式RPC网络通信框架

mprpc 项目介绍 该项目是一个基于muduo、Protobuf和Zookeeper实现的轻量级分布式RPC网络通信框架。 可以把任何单体架构系统的本地方法调用&#xff0c;重构成基于TCP网络通信的RPC远程方法调用&#xff0c;实现同一台机器的不同进程之间的服务调用&#xff0c;或者不同机器…

Lua 篇(一)— 安装运行Hello World

目录 前言一、Lua 是什么&#xff1f;二、Lua和C#的区别三、安装 LuaLinux 系统上安装Mac OS X 系统上安装Window 系统上安装emmyluaRider 安装(推荐) 四、Lua学习资料 前言 Lua 是一种轻量级的嵌入式脚本语言&#xff0c;它可以与 C 语言无缝集成&#xff0c;提供了强大的编程…

关于Facebook,你真的足够了解吗?

一、前言 说到站外推广&#xff0c;各位跨境卖家都不陌生&#xff0c;当站内流量较难获取时&#xff0c;总会想着法子从外部获取流量&#xff0c;而Facebook形式的站外推广各位卖家肯定也耳熟能详&#xff0c;低投入高回报一直是服务商主打的“性价比首选”。 二、Facebook基…

PclSharp1.12.0--半径滤波

一、半径滤波 原理&#xff1a;对整个输入迭代一次&#xff0c;对于每个点进行半径R邻域搜索&#xff0c;如果邻域点的个数低于某一阈值&#xff0c;则该点将被视为噪声点并被移除。 二、代码部分 注&#xff1a;测试代码均使用PclSharp1.12.0库 /// <summary> …

【已解决】Word文档无法复制怎么办?

无法复制Word文档里面的内容&#xff0c;有可能是这3个原因造成的&#xff0c;一起来看看如何解决吧。 原因1&#xff1a;Word程序出现故障 Word程序出现故障&#xff0c;有可能会导致打不开Word文档&#xff0c;或者打开后无法进行复制粘贴等操作&#xff0c;可以试试关闭Wor…

如何合理布局子图--确定MATLAB的subplot子图位置参数

确定MATLAB的subplot子图位置参数 目录 确定MATLAB的subplot子图位置参数摘要1. 问题描述2. 计算过程2.1 确定子图的大小和间距2.2 计算合适的figure大小2.3 计算每个子图的position数据 3. MATLAB代码实现3.1 MATLAB代码3.2 绘图结果 4. 总结 摘要 在MATLAB中&#xff0c;使用…

复现nerfstudio并训练自己制作的数据集

网站&#xff1a;安装 - nerfstudio GitHub - nerfstudio-project/nerfstudio&#xff1a;NeRF 的协作友好工作室 安装之前要确保电脑上已经有CUDA11.8或以上版本&#xff08;更高版本的可以安装11.8的toolkit&#xff09; 创建环境 conda create --name nerfstudio -y pyt…