【问题标题】:Algorithm for doing arithmetic operation on very large numbers对非常大的数进行算术运算的算法
【发布时间】:2011-08-05 06:43:47
【问题描述】:

我需要一种算法来对大数执行算术运算(远高于浮点数、双整数或任何其他数据类型的范围)。我需要用 C 编写代码。我试着在这里查找:Knuth, Donald, The Art of Computer Programming, ISBN 0-201-89684-2, Volume 2: Seminumerical Algorithms, Section 4.3.1: The经典算法,但受不了。我只需要算法而不是代码。

【问题讨论】:

  • 对于家庭作业,您可以使用链表作为大数。列表中的单个节点将包含一个数字。
  • 您可以随时对现有库进行逆向工程,例如 GMP (gmplib.org) 或 Java 的 BigInteger 类。源代码位于java2s.com/Open-Source/Java-Document/6.0-JDK-Core/math/java/…
  • 人类如何对非常大的数字进行算术运算?这就是你的算法,至少是一个起点……
  • @Ray Toal:我认为你不需要对开源代码进行逆向工程;)
  • 嘿,那么选词不好...... OP 只需要一个算法,它可以从阅读源代码中收集。应该说“您可以从现有代码中推断一种算法。”不过,好点。精确总是有价值的! +1

标签: c algorithm math largenumber


【解决方案1】:

除此之外,据我所知,您不会比简单的线性 O(n) 算法更好,即只需逐位添加。您可能无论如何都必须阅读整个输入,因此它至少是线性的。您也许可以采取各种技巧来降低常数。

由于基本长乘法算法的二次性质,您的主要问题将是乘法。您可能需要考虑给定here 的几种更快的方法之一。 Karatsuba 方法很难很好地实现,但可能是最简单的非平凡算法,它会给你带来好处。否则,您将不得不更多地研究快速傅立叶变换方法,例如 Schönhage-Strassen's algorithmFürer's algorithm

另见Big O notation

【讨论】:

  • 作为一名大学一年级学生,我在 C 中实现了一个简单的基于 FFT 的乘法(~Fürer 方法),用于学校项目。 Numerical Recipes中有一些有趣的材料,而且不是很难。
【解决方案2】:

我认为 Karatsuba 算法最适合对大数执行算术运算。对于足够大的 n,另一种概括,Schönhage–Strassen 算法甚至更快。 您可以在中查找算法 Karatsuba 或者 Karatsuba_Multiplication

【讨论】:

    【解决方案3】:

    没有算法可以对非常大的数字执行算术运算。算术运算保持不变。你需要的是在课堂上,比如http://www.codeproject.com/KB/cs/BigInt.aspx

    【讨论】:

      【解决方案4】:

      Riesel 的素数和因式分解的计算机方法一书有一个附录,其中包含易于阅读的多精度算术代码。

      【讨论】:

        【解决方案5】:

        对于算法,请阅读 Knuth vol 2 或 Crandall 和 Pomerance。对于编码,我建议先让显而易见的算法工作,然后再进行 Karatsuba 或傅立叶变换。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-23
          • 2013-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-02
          • 1970-01-01
          • 2021-11-02
          相关资源
          最近更新 更多