【问题标题】:Division algorithm for calculating quotient without keeping track of remainder在不跟踪余数的情况下计算商的除法算法
【发布时间】:2019-06-03 07:28:07
【问题描述】:

作为一个业余项目,我正在尝试使用独立的 C 来实现一些加密算法——即没有标准库函数的 C 变体(标准库类型和常量仍然可用),并且没有可选VLA(可变长度数组)等功能。

我做过的一件事是为大整数(大小 > 128 位)实现了一些函数。但是,此设置中的整数除法函数需要以当前形式跟踪余数,并且由于我使用的是独立环境,因此调用者必须为其提供空间。

是否可以实现除法算法来计算商而不依赖于跟踪余数,并且可能使用位切片技术?使用调用递归将变量保留在堆栈中是可以接受的。

我们假设大整数的类型是 bigint_t:

#define N 8
typedef uint32_t bigint_t[N]; // least-significant word first. 

【问题讨论】:

  • 为什么不跟踪余数?是随意的限制,还是有原因的?
  • 由于是独立的,调用者必须为剩余部分提供空间。
  • 如果没有答案中建议的二进制方法(可以使用类似的方法来取整数平方根),您如何在 跟踪余数的情况下进行除法?想想用铅笔和纸做除法的方法:进位在计算中移动并变成余数。但是,在实现 % 模数运算符时,保留余数而不是商是可行的。
  • 我不明白您如何负担得起带有变量但没有余数的递归调用堆栈。
  • 为什么不使用 Newton Raphson Division?有了正确的初始猜测,它需要大约 5 步来收敛,大约需要 10 次乘法和加法。

标签: c algorithm cryptography division


【解决方案1】:

我了解到您担心剩余部分需要的额外空间,因为您不能调用 malloc。

请注意,在正常的长除法实施过程中,商的长度会随着被除数缩小为余数而增长。在每个阶段,商和余数一起最多需要一个恒定的空间,而不是原始股息所需的空间。

如果将被除数余数和增长商保持在同一个数组中,则额外数字只需要几个变量。

【讨论】:

  • 虽然这不需要调用者为余数提供空间,但它需要提供一个可写的除数。
  • 你要求调用者为商提供多少空间?
  • 如问题中所问,8 个 32 位字(共 256 位),以最低有效字的第一顺序排列。
  • 如果您要求整个 256 位的商,那么您可以在工作时将正在进行的商和被除数的余数存储在其中。
【解决方案2】:

您可以使用二进制搜索。选择一个数字,乘以除数。如果结果太大,减少数字;如果结果太小,请增加数字。控制增量/减量,使其呈指数趋于零。

【讨论】:

  • 您可以从 MSB 开始。设置它,如果产品太大,取消它。对 LSB 的每一位重复。但在示例中,需要 256 次长乘法来计算商。
  • 似乎是唯一可行的解​​决方案,它需要重量级乘法运算作为构建块,甚至不是恒定时间。
  • 试用产品是否还需要临时空间?我认为目标是使用 O(1) 临时人员完成这项工作。
  • 不清楚目标是什么。也不清楚 N 是否为 O(1)。
  • 我的评论是基于 OP 在对问题的第二条评论中的澄清:“因为独立,调用者必须为剩余部分提供空间。”当然,该澄清应该编辑到问题中。
猜你喜欢
  • 2014-10-06
  • 1970-01-01
  • 2012-09-02
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多