【发布时间】:2017-07-15 10:46:28
【问题描述】:
我正在使用Miller–Rabin primality test 在 Pascal 中编写素数生成器(最多 200 位)。
我已经实现了多个步骤,但我被困在模幂部分。我选择了Right-to-left binary method,其中(我假设)我必须实现 A mod B,其中 A 和 B 都是(在最坏的情况下为 200 位)。为了计算模数,我必须实现 2 个最多 200 位数字的除法。我在一个数组中表示我的长整数,其中每个元素都是一个数字 (0-9)。
我在谷歌上搜索过,但没有找到适合我的算法(这不会花费很多时间来实现)。所以我在这里问是否有人有这方面的经验。我不必是最快的算法,但它不应该像欧几里德除法那样“愚蠢”,这需要数年时间,而且应该很容易实现。我不想使用任何库(纯帕斯卡)
【问题讨论】:
-
为什么将它们存储在 base 10 中?
-
没有特别的原因,除了它的基数 10,我可以很容易地思考,而且我不必将基数 10 实现为二进制并返回。在此之前我实现的所有东西都可以轻松地使用基数 10。我想如果有一个相对简单的算法可以在二进制中工作,那么将其转换为二进制不会有问题
-
如果你不关心效率并且不想直接实现全除——如果你还没有这样做,实现乘法,实现除以2(一个很容易的特殊情况算出来),然后使用二分搜索找到整数商。
-
@harold:即使以 10 为底,如果数字达到 200 位(甚至只有 30 位),重复提取也会变得非常慢。我已经链接到我的 BigInteger 代码,它使用基数 2^32,但同样的原则也适用。基本情况划分(如 Knuth,IIRC 所述,即第 2 卷中的算法 D,但我可能错了)并不是非常复杂,尤其是在 base 10 中。
标签: algorithm math integer pascal division