【发布时间】:2011-09-02 03:03:20
【问题描述】:
有谁知道我在哪里可以获得关于如何对存储在部分中的整数进行乘法和除法(甚至可能是模数)的说明?我正在制作一个将uint128_t 存储为uint64_t UPPER, LOWER 的库。
【问题讨论】:
-
This question 包含几个有用的答案。
标签: c++ math operator-overloading uint
有谁知道我在哪里可以获得关于如何对存储在部分中的整数进行乘法和除法(甚至可能是模数)的说明?我正在制作一个将uint128_t 存储为uint64_t UPPER, LOWER 的库。
【问题讨论】:
标签: c++ math operator-overloading uint
您熟悉GMP 库吗?你为什么不使用它而不是实现你自己的?
从上面的链接,您可以下载tar.bz 文件,用于基于 Unix 的操作系统。
对于 Windows,请参阅此链接:
它有很多关于 MinGW、MSVC++ 和 CgyWin 的信息和安装文件。下载适合您的需求。您还可以查看以下链接:
完成安装和配置后,您想了解如何使用 GMP 进行编程,请浏览以下链接:
【讨论】:
以这种方式拆分您的号码是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
当然问题是如何处理溢出。
【讨论】:
http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic 可能是一个好的开始。已经有很多开源库了
【讨论】:
查看各种 Big Integer 库。这是谷歌找到的https://mattmccutchen.net/bigint/
【讨论】: