【问题标题】:Division (modulus) of large integers (max 200 digits)大整数的除法(模数)(最多 200 位)
【发布时间】: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


【解决方案1】:

阅读this answer 了解快速乘法,阅读this page 了解较慢但更易于理解的乘法。阅读this page 以了解使用该乘法算法的快速除法。时间复杂度将与乘法的时间复杂度成正比。

【讨论】:

  • 请注意,Fürer 的算法、Toom-Cook、Schönhage-Strassen、其他基于 FFT 的算法,甚至是相对简单的 Karatsuba 算法,仅在 非常 大的数字时速度更快。它们有相当多的开销,对于巨大的数字来说只能忽略不计,远远大于 200 位数字。那是实际时间复杂度真正发挥作用的时候。一个简单的教科书(或基本情况或“长”)乘法更适合这种 200 位(或 30 位)的数字。
【解决方案2】:

感谢大家的回复。我决定按照这里的建议使用二进制搜索来使用除法Division (modulus) of large integers (max 200 digits) 我意识到这可能不是我想要的,因为总的来说,对于较大的数字(60+ 位),我的模幂运算很慢,但算法非常简单

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多