【问题标题】:Multiplication and division on integers split into parts整数的乘法和除法分成几部分
【发布时间】:2011-09-02 03:03:20
【问题描述】:

有谁知道我在哪里可以获得关于如何对存储在部分中的整数进行乘法和除法(甚至可能是模数)的说明?我正在制作一个将uint128_t 存储为uint64_t UPPER, LOWER 的库。

【问题讨论】:

标签: c++ math operator-overloading uint


【解决方案1】:

您熟悉GMP 库吗?你为什么不使用它而不是实现你自己的?

从上面的链接,您可以下载tar.bz 文件,用于基于 Unix 的操作系统。

对于 Windows,请参阅此链接:

它有很多关于 MinGW、MSVC++ 和 CgyWin 的信息和安装文件。下载适合您的需求。您还可以查看以下链接:


完成安装和配置后,您想了解如何使用 GMP 进行编程,请浏览以下链接:

【讨论】:

  • @calccrypto:当然,在使用它之前你必须下载并安装它。
  • 安装???我以为它只是解压缩,复制到某个文件夹,然后将编译器链接到它
  • @calccrypto:是的。整个过程就是安装、配置等等。
  • tar.gz 中没有“gmp.h”文件
  • @calccrypto: 可以肯定的是,你下载了错误的文件,或者下载有问题。
【解决方案2】:

以这种方式拆分您的号码是Karatsuba multiplication 的理想先决条件。考虑:

x = x1 * 2^k + x2
y = y1 * 2^k + y2

使用学校乘法,您需要 4 次乘法:

x*y = (x1*y1) * 2^(2*k) + (x1*y2 + x2*y1) * 2^k + x2*y2

Karatsuba 需要更多的加法,但只有 3 次乘法:

p1 = x1 * y1
p2 = x2 * y2
x*y = p1 * 2^(2*k) + ((x1+x2)*(y1+y2) - p1 - p2) * 2^k + p2      

当然问题是如何处理溢出。

【讨论】:

  • 在我的测试中,Karatsuba 乘法速度较慢,除非我的“数字”多于两个。
【解决方案3】:

http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic 可能是一个好的开始。已经有很多开源库了

【讨论】:

    【解决方案4】:

    查看各种 Big Integer 库。这是谷歌找到的https://mattmccutchen.net/bigint/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-06
      • 2011-08-21
      • 1970-01-01
      • 2012-09-27
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多