数论-快速幂

news/2025/1/15 12:37:28/

快速幂

  • 模板代码
  • 推导过程

求 A^B mod C,时间复杂度 O(logB)

模板代码

using ll = long long;  // 可以在头文件中添加这行ll qmi(ll a, ll b, ll c)
{ll ans = 1;       // 初始化结果为 1a %= c;           // 将 a 取模 c,确保 a 小于 cwhile (b)         // 当 b 不为零时循环{if (b & 1)    // 如果 b 是奇数{ans = (ans * a) % c;  // 更新结果}a = (a * a) % c;  // 将 a 平方并取模 cb >>= 1;          // 将 b 右移一位(相当于除以 2)}return ans;          // 返回结果
}

推导过程

在这里插入图片描述

要计算 ( a × b ) m o d p (a \times b) \bmod p (a×b)modp ,我们已经知道 a = k 1 p + q 1 a=k_1 p+q_1 a=k1p+q1 b = k 2 p + q 2 b=k_2 p+q_2 b=k2p+q2 。接下来我们先回顾一下 a × b a \times b a×b 的表达式:

a × b = k 1 k 2 p 2 + ( k 1 q 2 + q 1 k 2 ) p + q 1 q 2 a \times b=k_1 k_2 p^2+\left(k_1 q_2+q_1 k_2\right) p+q_1 q_2 a×b=k1k2p2+(k1q2+q1k2)p+q1q2

现在我们需要对这个结果取模 p p p ,即计算 ( a × b ) m o d p (a \times b) \bmod p (a×b)modp
逐项取模:

  1. k 1 k 2 p 2 m o d p : k_1 k_2 p^2 \bmod p: k1k2p2modp:
  • p 2 p^2 p2 p p p 的倍数,所以 k 1 k 2 p 2 m o d p = 0 k_1 k_2 p^2 \bmod p=0 k1k2p2modp=0
  1. ( k 1 q 2 + q 1 k 2 ) p m o d p \left(k_1 q_2+q_1 k_2\right) p \bmod p (k1q2+q1k2)pmodp :
  • 这一项中有一个 p p p ,所以也是 p p p 的倍数,因此 ( k 1 q 2 + q 1 k 2 ) p m o d p = 0 \left(k_1 q_2+q_1 k_2\right) p \bmod p=0 (k1q2+q1k2)pmodp=0
  1. q 1 q 2 m o d p : q_1 q_2 \bmod p: q1q2modp:
  • 这项中不含 p p p ,所以我们直接取模, q 1 q 2 m o d p q_1 q_2 \bmod p q1q2modp 就是结果。

结论:

( a × b ) m o d p = q 1 q 2 m o d p (a \times b) \bmod p=q_1 q_2 \bmod p (a×b)modp=q1q2modp

因此, ( a × b ) m o d p (a \times b) \bmod p (a×b)modp 等于 q 1 q 2 m o d p ∘ ↓ q_1 q_2 \bmod p_{\circ} \downarrow q1q2modp

例如计算310
在这里插入图片描述

计算步骤:

  1. 初始化:
  • ans = 1 , a = 3 , b = 10 =1, a=3, b=10 =1,a=3,b=10 (二进制 101 0 2 1010_2 10102 ) 。
  1. 第一步 ( b = 1010 _ 2 ) : \left(b=1010 \_2\right): (b=1010_2):
  • 最低位为 0 ,跳过乘法。
  • 更新 a = 9 ( 3 2 ) a=9\left(3^2\right) a=9(32)
  1. 第二步 ( b = 101 _ 2 ) \left(b=101 \_2\right) (b=101_2) :
  • 最低位为 1 ,乘以 ans = 9 × 3 = 27 =9 \times 3=27 =9×3=27
  • 更新 a = 81 ( 9 2 ) a=81\left(9^2\right) a=81(92)
  1. 第三步 ( b = 10 _ 2 ) : \left(b=10 \_2\right): (b=10_2):
  • 最低位为 0 ,跳过乘法。
  • 更新 a = 6561 ( 8 1 2 ) a=6561\left(81^2\right) a=6561(812)
  1. 第四步 ( b = 1 _ 2 ) : \left(b=1 \_2\right): (b=1_2):
  • 最低位为 1 ,乘以 ans = 27 × 6561 = 177147 =27 \times 6561=177147 =27×6561=177147
  • 更新 a = 43046721 ( 656 1 2 ) a=43046721\left(6561^2\right) a=43046721(65612)
    1. 结果:
  • 3 10 = 177147 3^{10}=177147 310=177147

http://www.ppmy.cn/news/1526164.html

相关文章

Go语言现代web开发05 指针和结构体

指针 Pointers are complex data types that store the memory address of value. Simply put, if we have a value stored in the memory address as 100 and a pointer to that value, the pointer value will be 100. The default value for a pointer is nil. Nil pointer…

重修设计模式-创建型-建造者模式

重修设计模式-创建型-建造者模式 允许用户通过链式调用方法来逐步构建复杂对象,让复杂对象的构建与它的表示分离,即对象的表示和对象的构造过程解耦。 建造者模式的原理和实现非常简单,重点在于复杂对象的构建过程和定制化。具体实现中&#…

OkHttp Interceptor日志上报

最近为了做一些网络上的优化,所以就得提前埋点,为后续网络优化提供数据支持。 主要是对发起请求埋点,请求错误埋点,客户端请求耗时埋点。 事件上报到阿里云,接入的是阿里的应用实时监控服务。 网络请求使用的是OhHttp…

【移动端】Flutter与uni-app:全方位对比分析

文章目录 一、含义1. Flutter2. uni-app 二、开发程序步骤1. Flutter2. uni-app 三、基本语言区别四、优缺点1. Flutter2. uni-app优点:缺点: 五、如何选型 一、含义 1. Flutter Flutter是由Google开发的一款跨平台移动应用开发框架,采用Da…

怎么选择适合的服务器

大家都知道,不管是公司还是个人,在数字化浪潮已经席卷全球的环境下,大家对服务器的需求是日渐增长的。很多人在买服务器的时候,多少都有点选择困难,今天我们就来对比下物理服务器和弹性云服务器,看看选哪个…

【leetcode C++】动态规划

16. 123. 买股票的最佳时机3 题目: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售…

Linux下write函数

在 Linux 中,write 函数是操作系统提供的最基础的系统调用之一,用于向文件描述符写入数据。它的使用非常广泛,不仅仅限于普通文件,还包括管道、套接字、字符设备等。 Linux 中的 write 函数详解 一、函数定义与头文件 write 函…

C# winform 字符串模糊查询,也就是查找子串

C# winform 字符串模糊查询,也就是查找子串。 1. String.Contains() Contains() 方法通常使用内部的 IndexOf() 实现,所以它的性能与 IndexOf() 相近。这是一个非常快速的方法,适合于一般的应用场景。 2. String.IndexOf() IndexOf() 方法…