0

0

C++如何进行大整数模幂运算?(快速幂算法)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-19 14:30:45

|

837人浏览过

|

来源于php中文网

原创

std::pow不能用于大整数模幂,因其返回double导致2⁵³后精度丢失;而模幂需每步取模防溢出,须手写迭代快速幂,配合__int128或mul_mod保证中间乘法不溢出。

c++如何进行大整数模幂运算?(快速幂算法)

为什么 std::pow 不能直接算大整数模幂

因为 std::pow 返回 double,精度在 2⁵³ 之后就丢失了;而大整数模幂(比如 RSA 中的 a^b mod m)要求每一步都严格取模,防止中间结果溢出。用 long long 直接乘再取模也撑不住:两个 10⁹ 级数字相乘就超 LLONG_MAX 了。

所以必须手写快速幂,且每轮乘法后立刻模 m

  • 核心原则:(a * b) % m == ((a % m) * (b % m)) % m,允许把大数拆进模运算里
  • 避免用递归实现——栈深可能达 64 层(64 位指数),虽不炸但没必要
  • 注意 m == 1 时结果恒为 0,提前返回,否则 base % 1 在某些编译器下行为未定义

手写迭代版快速幂(C++17,支持 long long

迭代比递归更稳,空间 O(1),且方便加防溢出乘法。下面这个版本能处理 baseexpmod 全在 [0, 1e18) 范围内的情况:

long long mod_pow(long long base, long long exp, long long mod) {
    if (mod == 1) return 0;
    base %= mod;
    long long res = 1;
    while (exp > 0) {
        if (exp & 1) {
            res = (__int128)res * base % mod; // 用 __int128 防乘法溢出
        }
        base = (__int128)base * base % mod;
        exp >>= 1;
    }
    return res;
}
  • __int128 是 GCC/Clang 扩展,不是标准 C++,但对 long long 模幂足够可靠;若需跨平台,得自己写 mul_mod 拆位乘法
  • 别漏掉第一行 base %= mod——否则 base >= mod 时初始平方就溢出
  • 指数为 0 时返回 1(数学定义),但若 mod == 1,仍得返回 0,优先级更高

遇到 mod 超过 long long 怎么办

如果模数本身超过 2⁶³−1(比如用 __int128 当模),那连 __int128 都不够存平方结果。这时必须换算法:

网趣网上购物系统HTML静态版
网趣网上购物系统HTML静态版

网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使

下载

立即学习C++免费学习笔记(深入)”;

  • unsigned long long + 二分乘法(mul_mod)替代直接乘,时间多一次 log,但安全
  • 或者改用 boost::multiprecision::cpp_int,但会显著拖慢,只适合调试或极低频调用
  • 注意:标准库无任意精度整数,别指望 <numbers></numbers><bit></bit> 能帮忙

简单 mul_mod 示例(仅当 a, b, mod 时可用):

long long mul_mod(long long a, long long b, long long mod) {
    long long res = 0;
    a %= mod; b %= mod;
    while (b > 0) {
        if (b & 1) res = (res + a) % mod;
        a = (a << 1) % mod;
        b >>= 1;
    }
    return res;
}

常见报错和静默错误

这类函数最容易“算得出来但结果错”,因为没触发崩溃,只因溢出或符号问题悄悄变负:

  • 输入负的 base:C++ 中 -5 % 3 == -2,不是 1,要先做 ((base % mod) + mod) % mod
  • int 存指数,结果 1 溢出成负数,循环不退出——务必用 <code>long longunsigned
  • 忘记检查 mod == 0:除零未定义行为,运行时可能 SIGFPE,但不总触发
  • 在竞赛环境(如 Codeforces)中开 -O2 时,某些手写 mul_mod 可能被误优化,加 volatileasm volatile("" ::: "r0") 干扰优化器(小众但真实)

最麻烦的其实是模数为合数且与底数不互质时的数学边界——这时候快速幂本身没错,但你依赖的欧拉定理降幂就不适用了。别想省事套公式,老老实实按题意走迭代。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

770

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

574

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

254

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

254

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

419

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

594

2023.08.10

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.7万人学习

C 教程
C 教程

共75课时 | 4.8万人学习

C++教程
C++教程

共115课时 | 18.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号