模幂计算器
使用快速平方乘算法,高效计算大整数乘方后对另一整数取模的结果。
计算乘方对 m 取模
输入整数底数、非负指数,以及大于一的模数。
关于模幂运算
模幂运算是将整数底数提升到非负整数次幂,再求除以正模数后的余数。表达式 a^b mod m 求的是从 0 到 m - 1 之间、与 a^b 同余的唯一余数。即使最终余数很小,幂值也会迅速变得极其庞大,使直接计算变得不切实际。本计算器无需构造这个巨大的中间整数。
这种高效方法称为二进制快速幂、反复平方或平方乘算法。它将指数写成二进制并逐位处理。首先将底数对 m 取模,然后在每一步将当前因子平方并对 m 取模。当相应的指数位为一时,将该因子乘入结果,并立即再次取模。由于每个中间值都会取模,计算中的数值始终小于模数的平方。
该算法所需步骤数仅与指数的对数成正比。因此,计算十亿次幂只需约三十个平方阶段,而非重复十亿次乘法。显示的运算次数分别统计平方运算,以及与指数中值为一的二进制位对应的选定乘法。指数为零时会正确返回 1 mod m。
模运算将余数相同的数视为等价。例如,17 和 5 模 12 同余,因为两者的余数都是 5。本工具也支持负底数,会先将其规范化为非负剩余类代表元。这里的指数必须非负。负模指数需要求模乘法逆元,而逆元仅在底数与模数互质时存在。
模幂是数论和现代密码学的基础运算。RSA 加密与签名会对消息进行大指数乘方,再对合数取模。Diffie-Hellman 密钥交换和许多离散对数系统使用对素数取模的幂运算。该运算也用于素性测试、伪随机数生成器、校验和、周期规律和编程竞赛题目。
三个输入字段均以任意精度整数处理,而非浮点数。因此,即使数值超出 JavaScript 通常的安全整数范围,每一位数字仍能保留。模数必须大于一,且输入不得包含逗号或小数点。手动核对时,可以先对底数取模,再对较小指数反复相乘,每一步都求余。
模幂计算示例
以下示例涵盖简单算术核对和常见数论规律。
| 表达式 | 结果 | 说明 |
|---|---|---|
| 3^4 mod 5 | 1 | 81 除以 5 的余数为 1 |
| 7^10 mod 13 | 4 | 一个简洁的类密码学示例 |
| 123^456 mod 789 | 699 | 快速幂无需生成完整幂值 |
| 2^16 mod 17 | 1 | 费马小定理的一个示例 |
如何计算模幂
- 输入整数底数,可以为正数、零或负数。
- 输入非负整数指数。
- 输入大于一的整数模数。
- 点击“计算”,获取精确余数和快速算法的运算次数。
模幂常见问题
为什么不先计算完整幂值?
完整幂值可能包含数百万位数字,浪费时间和内存。每次相乘后取模可以得到相同的最终余数,同时使中间整数保持在可处理范围内。
什么是平方乘算法?
它逐位读取指数的二进制表示,反复对当前底数的余数求平方。仅将与值为一的二进制位对应的因子乘入结果。
底数可以是负数吗?
可以,计算器会将负底数规范化为模 m 下等价的非负余数。最终结果始终介于零与 m - 1 之间。
指数为零时会怎样?
任何非零底数的零次幂均为一,模运算结果为 1 mod m。对于底数和指数都为零的情况,本计算器采用相同约定。
此计算器能处理密码学规模的整数吗?
它使用任意精度整数运算,因此输入不受普通浮点精度限制。极大的指数仍需更多计算,但二进制快速幂使阶段数保持对数级增长。