过去几天我一直在研究这个问题,但我一直无法得出答案。我想出了一个算法,如果除数只有一个词,它就可以工作。但是,如果除数是多个单词,那么我会得到一些奇怪的答案。我知道这个问题已经在这里被问了几次,但除了使用教科书方法或者去找一本关于这个主题的书之外,没有确切的答案。我已经能够使我的大整数库中的每个函数都能工作,除了除法。似乎有些人认为大整数划分是NP难题,而且我遇到麻烦,我倾向于同意。
数据存储在一个结构中,该结构包含指向uint16_t或uint32_t数组的指针,具体取决于是否支持long long数据类型。如果不支持long long,则uint16_t用于捕获乘法和加法运算中的任何进位/溢出。我有的当前函数是加法,减法,乘法,2 +补码否定,比较,和,或者,或者,xor,not,左移,右移,左旋,右旋,位反转(反射),a几个转换例程,一个随机数填充例程,以及一些其他实用程序例程。所有这些都正常工作(我在计算器上检查了结果)除了除法。
typedef struct bn_data_t bn_t;
struct bn_data_t
{
uint32 sz1; /* Bit Size */
uint32 sz8; /* Byte Size */
uint32 szw; /* Word Count */
bnint *dat; /* Data Array */
uint32 flags; /* Operational Flags */
};
这与我询问inline assembler的另一个问题有关,因为这就是它的用途。
到目前为止我发现了什么:
Algorithm for dividing very large numbers
What is the fastest algorithm for division of crazy large integers?
https://en.wikipedia.org/wiki/Division_algorithm
Newton-Raphson Division With Big Integers
关于这个问题的一堆学术论文。
到目前为止我尝试了什么:
我有一个基本的例程工作,但是它将一个多字大整数除以一个单词。我试图实现一个Newton-Raphson算法,但由于我得到了一些非常奇怪的结果,因此无法正常工作。我从微积分中了解牛顿的方法,但这是整数数学,而不是浮点数。我理解Goldschmidt除法算法背后的数学,但我不清楚如何用整数数学来实现它。其中一些算法存在的部分问题是它们需要基数为2的对数函数。我知道如何使用浮点和泰勒级数来实现对数函数,但是在使用整数数学时则不行。
我试过看GMP库,但是划分算法没有很好的记录,它有点过头了。他们似乎在不同的点使用不同的算法,这增加了混乱。
对于学术论文,我主要了解数学(我已经清除了基本的微积分数学,多变量微积分和常微分方程),但是再一次,我的数学之间存在脱节使用整数数学的知识和实现。我已经看到了建议的小学方法,从我可以确定的方法类似于移位 - 减法方法,但我也不太确定如何实现那个方法。有任何想法吗?代码会很好。
修改
这是我个人的学习经历。我想了解它是如何完成的。
编辑:4-JUN-2016
我已经有一段时间了,因为我在火灾和其他项目中有其他工作。现在我已经重新审视了这个项目,我终于使用两种不同的算法实现了大整数除法。基本的一个是概述here的移位减法方法。仅当除数为一个字时,才调用使用CPU除法指令的高速算法。两种算法都已经确认可以正常工作,因为它们生成的结果已经使用online big number calculator进行了检查。所以现在,所有基本的数学和逻辑功能都已实现。这些函数包括加,减,乘,除,除模,模,和,或不,xor,否定,反向(反射),向左移,向右移,向左旋转,向右旋转。我可能会根据需要添加其他功能。感谢所有回复的人。
答案 0 :(得分:0)
答案 1 :(得分:0)