对10^9+7取模所得结果在现实业务场景中是否具备实用价值
模1e9+7结果的使用问题解答
先给你明确结论
这个结果能不能直接用,完全看你要解决的问题要求,没有固定的转换规则:
- 要是问题本身就要运算结果对
1e9+7取模的值,直接用就行,啥转换都不用 - 要是你要的是运算的完整精确值,那模的结果肯定没法直接用,得换大整数运算的方案
先澄清你认知里的一个误区
你把两个完全不同的概念搞混了:整数溢出后的被动回绕和主动执行的模运算根本不是一回事:
- 溢出回绕是类型存不下数值的时候,编程语言的默认处理逻辑,结果是不可控、没有数学正确性保障的
- 你代码里每一步算完主动做的
% N操作,是符合模运算基本数学规则的:对于加减乘三种运算,(a 运算 b) mod m = [(a mod m) 运算 (b mod m)] mod m这个等式是严格成立的,不管你运算的数有多大,只要每一步都按这个规则算,最终结果和你先把全量精确值算出来再取模的结果完全一样。
你示例里得到的754573817,就是实打实的5^100000 mod 1000000007的精确结果,不是什么出错的回绕值。
不同场景的具体用法
竞赛编程场景
99%的算法题只要要求了对1e9+7取模,本身要的就是模之后的结果,你算出来直接输出就行,完全符合题意。竞赛里选1e9+7当模数也是刻意的:
- 它是个大质数,方便算模逆元来处理除法的模运算
- 大小刚好是1e9级,两个模数范围内的数相乘结果是1e18级,刚好能存在64位长整型里,不会中间溢出
实际业务场景
- 如果你的业务本身就是要模结果,比如密码学加解密、哈希计算、组合计数的模统计之类的,直接用就行
- 如果你要的是完整的精确值,比如要输出
5^100000的全部几千位数字,那你就不能用取模的方案,得换大整数运算库(比如Python自带任意精度整数,C++可以用GMP库)来算全量值。
你的示例代码验证
你贴的快速幂代码是标准的模幂实现,计算5^100000 mod 1e9+7得到的754573817完全正确,作为模结果可以直接使用。
#define N 1000000007 // 质数模数 long int exponentiation(long int base, long int exp) { if (exp == 0) return 1; if (exp == 1) return base % N; long int t = exponentiation(base, exp / 2); t = (t * t) % N; // 指数为偶数 if (exp % 2 == 0) return t; // 指数为奇数 else return ((base % N) * t) % N; } int main() { long int base = 5; long int exp = 100000; long int modulo = exponentiation(base, exp); cout << modulo << endl; return 0; }
输出结果:
754573817
内容的提问来源于stack exchange,提问作者Razor Fire
相关产品推荐
相关产品推荐

