【问题标题】:Fast multiplication of very large integers非常大整数的快速乘法
【发布时间】:2011-01-01 02:02:44
【问题描述】:

如何将两个大于 32 个字符的非常大的数字相乘,例如 100 的乘法!有122!或 22^122 和 11^200 在分而治之的帮助下,有没有人有 java 代码或 C# 代码?

【问题讨论】:

  • 用相关语言重新标记
  • “分而治之”听起来像是功课。如果正确请重新标记。
  • @ThorbjørnRavnAndersen - “homework”标签已弃用。
  • @HotLicks 不是三年前...

标签: c# java integer multiplication


【解决方案1】:

我自己写了一个,它使用数组来实现这一点,只是为了好玩。我相信 Java 的 BigInteger 类做同样的事情。

Here 是 C# 中的一个示例,可能对您有用。

【讨论】:

    【解决方案2】:

    Here's some integer multiplication algorithms

    Here's a class library for numbers

    它包括用于大整数相乘的 Karatsuba 和 Schonhage-Strassen 算法。

    【讨论】:

      【解决方案3】:

      您可能应该使用java.math.BigInteger。这允许整数值的表示远远超过 2^32 甚至 2^64。 BigInteger 值基本上仅受程序可用内存量的限制,即在 32 位系统上约为 4 GB,而在 64 位系统上几乎可用的物理+虚拟内存。

      import java.math.BigInteger;
      
      class Foo
      {
          public static void main(String args[])
          {
              BigInteger bigInteger100Fact = bigFactorial(BigInteger("100")); //where bigFactorial is a user-defined function to calculate a factorial
              BigInteger bigIntegerBar = new BigInteger("12390347425734985347537986930458903458");
      
              BigInteger product = bigIntegerFact.multiply(bigIntegerBar);
          }
      }
      

      编辑:如果您需要,这里是BigInteger factorial function

      【讨论】:

      • 请注意,BigInteger 使用的是一种简单的乘法算法,因此如果需要对大数进行 FAST 乘法,则应使用使用 Karatsuba 或其他 sub n^2 算法的 3rd 方库。
      【解决方案4】:

      Here is a patched version of java.lang.BigInteger 使用 Karatsuba 和 Toom-Cook:

      And here is a Java class 可以使用 Schönhage-Strassen 将 BigInteger 相乘:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-08
        • 1970-01-01
        • 2016-06-25
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        相关资源
        最近更新 更多