|
1
421
通过平方进行指数运算。
这是在非对称密码学中对巨大数字进行模幂运算的标准方法。 |
|
2
81
注意 exponentiation by squaring 不是最理想的方法。作为一种适用于所有指数值的通用方法,这可能是你能做的最好的事情,但对于特定的指数值,可能有一个需要更少乘法的更好的序列。 例如,如果你想计算x^15,平方求幂的方法会给你:
这总共是6次乘法。 事实证明,这可以通过“只”5次乘法来完成 addition-chain exponentiation .
没有有效的算法来找到这个最优的乘法序列。来自 Wikipedia :
|
|
|
3
28
如果你需要将2提升到幂。最快的方法是通过功率进行位偏移。
|
|
|
4
14
这是Java中的方法
|
|
|
5
8
一个非常特殊的情况是,当你需要2^(-x到y)时,其中x当然是负数,y太大而无法在整数上进行移位。你仍然可以通过使用浮点数在恒定时间内进行2^x。
使用double作为基本类型,可以获得2的更多幂。 (非常感谢评论者帮助整理这篇文章)。 还有可能了解更多关于 IEEE floats ,其他求幂的特殊情况可能会出现。 |
|
6
8
复杂性=O(log(exp))
复杂性=O(log(exp)) |
|
|
7
8
如果你想得到一个2的整数的幂次方,最好使用shift选项:
这要高效得多。 |
|
8
6
|
|
|
9
4
正如对平方求幂效率的评论的后续。 这种方法的优点是它在log(n)时间内运行。例如,如果你要计算一些巨大的东西,比如x^1048575(2^20-1),你只需要遍历循环20次,而不是使用朴素的方法计算100多万次。 此外,就代码复杂度而言,这比试图找到最佳乘法序列更简单,这是la Pramod的建议。 编辑: 我想在有人给我贴上溢出的标签之前,我应该澄清一下。这种方法假设你有某种巨大的库。 |
|
10
2
迟到的聚会:
下面是一个解决方案,也涉及
这段代码使用了一个永久循环
|
|
|
11
1
考虑负exponeet的更通用解
|
|
|
12
1
除了Elias的回答,当用有符号整数实现时,会导致未定义行为,当用无符号整数实现时高输入值不正确, 这是Exponential by Squareing的一个修改版本,它也适用于有符号整数类型,并且不会给出不正确的值:
此功能的注意事项:
如果要发生任何溢出或包裹,
使用
|
|
|
13
0
Swift中的O(log N)解。..
|
|
|
14
0
是的,它是递归的,但一个好的优化编译器会优化递归。 |
|
|
15
0
还有一个实现(Java)。可能不是最有效的解决方案,但迭代次数与指数解决方案相同。
|
|
|
16
0
我使用递归,如果exp是偶数,5^10=25^5。
|
|
|
17
0
我已经实现了一种算法,可以存储所有计算出的功率,然后在需要时使用它们。例如,x^13等于(x^2)^2^2*x^2^2*x,其中x^2^ 2取自表,而不是再次计算。这基本上是@Pramod答案的实现(但用C#)。 所需的乘法次数为Ceil(Log n)
|
|
|
18
-1
这是一个O(1)算法,用于计算
对于较小的值
在溢出时,C标准允许任何行为,包括崩溃。然而,我决定对LUT索引进行绑定检查,以防止内存访问违规,这可能是令人惊讶和不受欢迎的。 伪代码:
C代码:
|
|
|
19
-1
我的情况有点不同,我试图用一种力量创造一个面具,但我想无论如何我都会分享我找到的解决方案。 显然,它只适用于2的幂。
|
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |