【发布时间】: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