SGI

类别:算法 组件类型:函数

原型

Power是一个重载名称;实际上有这两个功能。
template <class T, class Integer>
inline T power(T x, Integer n);

template <class T, class Integer, class MonoidOperation>
T power(T x, Integer n, MonoidOperation op);

描述

Power是广义求幂:它将值x求幂n,其中n是一个非负整数。

的第一个版本返回x求幂于nth 幂;也就是说,它返回x * x ... * x,其中x重复n时代。[1]如果n == 0,那么它返回identity_element(multiplies<T>()).

的第二个版本就像第一个版本一样,但它使用了任意 Monoid Operation 来代替multiplies<T>,返回identity_element(op)n == 0.

重要说明: 不假设乘法满足交换律,但它确实依赖乘法满足结合律这一关键事实。如果您已定义*MonoidOperation为非结合运算符,那么 将给您错误的结果[2]

定义

在标准头 numeric 中和非标准向后兼容头 algo.h 中定义。此函数是 SGI 扩展;它不是 C++ 标准的一部分。

对类型的要求

对于第一个版本对于第二个版本

先决条件

复杂度

乘法次数(或在第二个版本的情况下,应用程序次数MonoidOperation)是lg(n) + nu(n)其中lg是 2 为底的对数,nu(n)的数量1s 二进制表示中n. [3]

示例

int main() {
  cout << "2 ** 30 = " << power(2, 30) << endl;
}

说明

[1]这是一个概念性描述'的返回值是什么;它不是如何实际实现。如果以这种方式实现,那么它将需要n-1乘法,这将极大地降低效率。Power使用“俄罗斯农民算法”实现,该算法仅需要O(log n)乘法。请参见高德纳 (D. E. Knuth, The Art of Computer Programming. 第 2 卷:半数值算法,艾迪生-韦斯利,1981 年) 来讨论第 4.6.3 节中问题。

[2]请参见 Monoid Operation 要求来讨论结合性。

[3]实际上,这不是可能的乘法最小次数:可以利用仅五个乘法来计算x'的第十五次方power(x, 15)使用六个。

另请参见

Monoid Operation, 乘法, 加法
[Silicon Surf] [STL Home]
版权 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息