【发布时间】:2018-08-31 08:31:31
【问题描述】:
我有 32 个字节的数字,我将它们存储在 uint8_t* 缓冲区中。 如何在 C 中计算一个 32 字节的数字? 示例:加法、模法、乘法 谢谢!
【问题讨论】:
-
Use GMP. 不客气。
-
32 位数字?还是 32 字节的数字?
-
是 32 字节数
标签: c biginteger
我有 32 个字节的数字,我将它们存储在 uint8_t* 缓冲区中。 如何在 C 中计算一个 32 字节的数字? 示例:加法、模法、乘法 谢谢!
【问题讨论】:
标签: c biginteger
你基本上需要像我们在小学学习的那样做数学:添加单个元素and保持一个进位字节;或多个每对字节元素,应用适当的偏移量并总结所有内容。自然,这都是循环。这些可以通过各种方式进行改进(例如 Karatsuba 的乘法算法,除此之外 - 离散 FFT can be used 用于固定大小元素数量的 O(n log(n)) 的乘法) - 但你应该从简单开始。
现在,您不必自己重新发明轮子;这些类型的“大整数”或 BigInt 结构有几个 FOSS 库,例如this one 或@deamentiamundi 建议的更受欢迎的LibTomMath。如果您不仅限于 C,那么 C++ 中的这些功能甚至更多。
最后 - 而不是使用单个字节 - 假设字节数可以被 2、4 或 8 整除,您可以使用 uint16_t、uint32_t 或 uint64_t 作为您使用的基本单位。
【讨论】:
在https://github.com/libtom/libtommath 可以找到的公共领域大整数 C 库 Libtommath 有一个优点:它包含对 libtommath/doc 中算法的完整且易于理解的描述(您将需要 Latex 来构建它从头开始,否则请向 Google 索取tommath.pdf 的副本)。与例如相比,即使是源代码也具有很好的可读性。 GMP!
【讨论】: