将数字提高到一个巨大的指数
Raising a number to a huge exponent
我得到数字3和一个变量'n',可以高达1 000 000 000(十亿(。我必须打印3^n modulo 100003
的答案.我尝试了以下方法:
- 我尝试使用函数
std::pow(3,n)
,但它不适用于大指数(在此过程中无法应用模数(。
我 - 尝试实现我自己的函数,将数字 3 提高到 n 的幂,以便我可以在需要时应用模数,但是当用非常大的数字进行测试时,这种方法被证明太慢了。 最后,我尝试了数字"n"的
质因式分解,然后使用"n"的因数(以及它们出现的次数(来构建答案,这似乎是我能想到的最好的方法(如果它是正确的(。问题是,对于已经是素数的大量数字,我会怎么做?
所以这些是我的想法,如果有人认为有更好的方法(或者如果我的方法之一是最佳的(,我将不胜感激任何指导。
利用模算术的属性
(a × b) modulo M == ((a module M) × (b modulo M)) modulo M
通过使用上述乘法规则
(a^n) modulo M
= (a × a × a × a ... × a) modulo M
= ((a module M) × (a modulo M) × (a modulo M) ... × (a modulo M)) modulo M
通过分而治之的方法计算结果。递归关系将为:
f(x, n) = 0 if n == 0
f(x, n) = (f(x, n / 2))^2 if n is even
f(x, n) = (f(x, n / 2))^2 * x if n is odd
以下是C++实现:
int powerUtil(int base, int exp, int mod) {
if(exp == 0) return 1;
int ret = powerUtil(base, exp / 2, mod) % mod;
ret = 1LL * ret * ret % mod;
if(exp & 1) {
ret = 1LL * ret * base % mod;
}
return ret;
}
double power(int base, int exp, int mod) {
if(exp < 0) {
if(base == 0) return DBL_MAX; // undefined
return 1 / (double) powerUtil(base, -exp, mod);
}
return powerUtil(base, exp, mod);
}
这是为了补充凯杜尔的答案。
100003
是一个素数,它立即投射到费马小定理:任何提高到素幂的数都与该素数的自身模全等。这意味着你不需要提高到n
的幂。n % 100002
的力量就足够了。
编辑:示例。
比如说,n
是200008,这是100002 * 2 + 6
.现在
3 ^ 200007 =
3 ^ (100002 + 100002 + 6) =
3 ^ 100002 * 3 ^ 100002 * 3 ^ 6
FLT声称(3 ^ 100002) % 100003 == 1
,以及上面的最后一行,模100003,简化为3 ^ 6
。一般来说,对于一个素数p
,
(k ^ n) % p == k ^ (n % p)
当然,它只有在指数n
大于p
时才加快计算速度。根据您的要求(指数100
,模100003
(,没有什么可以减少的。直接进入凯杜尔的方法。
相关文章:
- 将数字提高到一个巨大的指数
- 使用C++对一个巨大文件中的文本行进行字典式外部排序
- 如何在一个巨大的文本文件中对整数进行排序
- 在 Ubuntu(linux OS)中将一个巨大的文件读入C++向量
- 在C 中创建一个巨大的标志地图
- 我的函数总是返回一个巨大的数字
- 迭代一个巨大的 std::vector of std::vectors 并修改元素
- g++:编译一个巨大的静态std::vector
- 为什么我的程序输出一个巨大的小数
- C++程序在访问一个巨大的数组时会冻结
- 如何将一个巨大的二维数组初始化为类中的空间
- std::queue::size() 可以在 size() == 0 的 pop() 之后返回一个巨大的数字
- 使用C++解析一个巨大而复杂的CSV文件
- K的意思是有一个巨大的阵列
- 为什么这个int会随机变成一个巨大的负值
- 如何在Objective-C中包装一个巨大的静态c++库
- 在Java中使用SWIG,我如何有选择地SWIG一个巨大的C/ c++头文件的某些部分
- 内存映射一个巨大的文件在32位软件运行在64位操作系统
- 在c++中将一个巨大的文本文件(2Gb以上)分成2个块
- 计算pow(double,2)得到一个巨大的数字(C)