当前位置: 首页 > news >正文

【算法设计-分治思想】快速幂与龟速乘

文章目录

    • 1. 快速幂
    • 2. 龟速乘
    • 3. 快速幂取模
    • 4. 龟速乘取模
    • 5. 快速幂取模优化

1. 快速幂

算法原理:

  • 计算 311
    • 311 = (35)2 x 3
    • 35 = (32)2 x 3
    • 32 = 3 x 3
    • 仅需计算 3 次,而非 11 次
  • 计算 310
    • 310 = (35)2
    • 35 = (32)2 x 3
    • 32 = 3 x 3
    • 仅需计算 3 次,而非 10 次

算法思路:

  • 若指数是偶数,则将底数平方,指数除以 2。
  • 若指数是奇数,则将底数平方,指数除以 2,再乘上底数。

算法代码:

typedef unsigned long long uLL;// 快速幂 a^b
uLL power (uLL a, uLL b){uLL r = 1;while (b != 0){if (b & 1) 	// (b % 2 == 1)r = r * a;b = b >> 1; // (b = b / 2)a = a * a;}return r;
}

举例:

  • 初始值:a = 3,b = 11
  • 第 1 轮:(11 % 2 == 1)r=1x3=3,b=5,a=32=9
  • 第 2 轮:(5 % 2 == 1)r=3x32=33=27,b=2,a=(32)2=34=81
  • 第 3 轮:(2 % 2 == 0)r 不变,b=1,a=(34)2=38
  • 第 4 轮:(1 % 2 == 1)r=33x38=311,b=0,a=(38)2=316
  • 得到 r = 33x38 = 311

2. 龟速乘

算法原理:将其中一个乘数分解成 2 的幂次相加。

12 x a = 23 x a + 21 x a

算法代码:

typedef unsigned long long uLL;// 龟速乘 a*b
uLL mul (uLL a, uLL b){uLL r = 0;while (b != 0){if (b & 1) 	// (b % 2 == 1)r = r + a;b = b >> 1; // (b = b / 2)a = a + a;}return r;
}

3. 快速幂取模

初等数论中有如下公式:

(a × b) % m = ((a % m) × (b % m)) % m

推广:

(a × b × c…) % m = ((a % m) × (b % m) × (c % m) × … ) % m

(ab) % m = (a × a × a…) % m = ((a % m) × (a % m) × (a % m) × … ) % m

算法代码:

typedef unsigned long long uLL;// 快速幂取模 (a^b) % p
uLL powerMod (uLL a, uLL b, uLL p){uLL r = 1;while (b != 0){if (b & 1) 	// (b % 2 == 1)r = (r * a) % p;b = b >> 1; // (b = b / 2)a = (a * a) % p;}return r;
}

4. 龟速乘取模

算法原理:(a × b) % m = ((a % m) × (b % m)) % m

算法代码:

// 龟速乘取模 (a*b) % p
uLL mulMod (uLL a, uLL b, uLL p){uLL r = 0;while (b != 0){if (b & 1) 	// (b % 2 == 1)r = (r + a) % p;b = b >> 1; // (b = b / 2)a = (a + a) % p;}return r;
}

5. 快速幂取模优化

算法原理:注意到快速幂取模算法中的相乘操作可能会超出数据范围,因此可以将相乘操作转化为龟速乘取模。

原理依然是此公式:(a × b) % m = ((a % m) × (b % m)) % m,其中((a % m) × (b % m))即为龟速乘取模。

算法思路:快速幂 + 龟速乘结合。

// 快速幂取模防止爆炸 (a^b) % p
uLL powerModBig (uLL a, uLL b, uLL p){uLL r = 1;while (b != 0){if (b & 1) 	// (b % 2 == 1)r = mulMod(a, b, p) % p;b = b >> 1; // (b = b / 2)a = mulMod(a, a, p) % p;}return r;
}
http://www.lryc.cn/news/22916.html

相关文章:

  • Kafka(十一) 如何保证数据的不重复和不丢失
  • 解决树莓派 bullseye (11) 系统无法通过 xrdp 远程连接的问题
  • 微信公众号历史作品定向采集
  • Vue学习笔记(3)
  • Marshmallow 库
  • 【BN层的作用】论文阅读 | How Does Batch Normalization Help Optimization?
  • re.sub()用法的详细介绍
  • 【Python数据挖掘入门】2.2文本分析-中文分词(jieba库cut方法/自定义词典load_userdict/语料库分词)
  • Meta利用视觉信息来优化3D音频模型,未来将用于AR/VR
  • openlayers加载离线地图并实现深色地图
  • socket,tcp,http三者之间的区别和原理
  • 红日(vulnstack)1 内网渗透ATTCK实战
  • ik 分词器怎么调用缓存的词库
  • ROS1/2机器人操作系统与时间Time的不解之缘
  • 华为OD机试真题2022(JAVA)
  • 【3】MyBatis+Spring+SpringMVC+SSM整合一套通关
  • 20道前端高频面试题(附答案)
  • android EditText设置后缀
  • prometheus+cadvisor监控docker
  • 正演(1): 二维声波正演模拟程序(中心差分)Python实现
  • 珠海数据智能监控器+SaaS平台 轻松实现SMT生产管控
  • 习题22对前面21节的归纳总结
  • 使用Vite快速构建前端React项目
  • 人工智能高等数学--人工智能需要的数学知识_微积分_线性代数_概率论_最优化---人工智能工作笔记0024
  • 阿里大数据之路总结
  • ABAP中Literals的用法(untyped literal vs. typed literal)
  • tensorflow1.14.0安装教程
  • C++赋值运算符重载
  • 网络性能总不好?专家帮你来“看看”— CANN 6.0 黑科技 | 网络调优专家AOE,性能效率双提升
  • Qss自定义属性