整数在C ++中如何相乘?

时间:2012-03-10 19:04:03

标签: c++ c algorithm math

我想知道在C ++中使用什么样的方法来乘以数字。这是传统的教科书长期乘法吗? Fürer's algorithmToom-Cook

我很想知道因为我需要增加极大的数字并且需要高效率。因此,传统的教科书长乘法O(n^2)可能效率太低,我需要采用另一种乘法方法。

那么C ++使用什么样的乘法?

8 个答案:

答案 0 :(得分:23)

你似乎在这里遗漏了几件重要的事情:

  1. 原生 算术和 bignum 算术之间存在差异。
  2. 您似乎对 bignum 算术感兴趣。
  3. C ++不支持 bignum 算术。原始数据类型通常是处理器的 native 算术。
  4. 要获得bignum(任意精度)算术,您需要自己实现它或使用库。 (例如GMP)与Java和C#(以及其他)不同,C ++没有用于任意精度算术的库。

    所有这些奇特的算法:

    • Karatsuba:O(n^1.585)
    • Toom-Cook:< O(n^1.465)
    • 基于FFT:~ O(n log(n))

    仅适用于在bignum库中实现的bignum算法。处理器用于其本机算术运算的内容有点无关紧要 通常是恒定的时间。


    无论如何,我不建议您尝试实现bignum库。我以前做过,而且要求很高(尤其是数学)。所以你最好使用图书馆。

答案 1 :(得分:3)

“超大数字”是什么意思?

与大多数其他编程语言一样,C ++使用处理器内置的乘法硬件。究竟如何工作不是由C ++语言指定的。但是对于普通整数和浮点数,你将无法在软件中更快地编写内容。

各种数据类型可以表示的最大数字可以在不同的实现之间变化,但是 int 的一些典型值是2147483647, long 的一些典型值是9223372036854775807,以及1.79769 e + 308 double

答案 2 :(得分:1)

在C ++中,整数乘法由芯片处理。在标准语言中没有Perl的BigNum,尽管我确信这些库确实存在。

答案 3 :(得分:0)

这一切都取决于所使用的库和编译器。

答案 4 :(得分:0)

它在硬件中执行。出于同样的原因,巨大的数字将无法运作。在64位硬件中可以表示的最大数字c ++是18446744073709551616.如果需要更大的数字,则需要任意精度库。

答案 5 :(得分:0)

plain c ++使用CPU多指令(或者如果你的CPU没有这样的指令,则使用位移和添加的教科书乘法。)

如果您需要对大数字进行快速乘法,我建议您查看gmp(http://gmplib.org)并使用gmpxx.h中的c ++接口

答案 6 :(得分:0)

如果使用大数字,c ++中的标准整数乘法将不再有效,您应该使用提供任意精度乘法的库,如GMP http://gmplib.org/

此外,在编写应用程序之前,您不必担心性能(=过早优化)。这些乘法将很快,并且很可能软件中的许多其他组件会导致更慢的速度。

答案 7 :(得分:0)

这些数字究竟有多大?甚至像python这样的语言也可以在标准处理器上以每秒超过300万次的任意精度整数进行1e100*1e100。这是100个重要位置的倍增,不到百万分之一秒。把它放到上下文中,可观察宇宙中只有大约10 ^ 80个原子。

首先编写您想要实现的内容,并在必要时进行优化。