【问题标题】:How does a calculator (such as wolfram alpha) calculate extremely large factorials?计算器(例如 wolfram alpha)如何计算极大的阶乘?
【发布时间】:2016-12-16 20:32:01
【问题描述】:

我很好奇,并将越来越大的阶乘作为阶乘插入到 wolfram alpha 中。例如,I calculated 10,000!。这是2.846... x 10<sup>35659</sup>

我检查了他们的代码解释,似乎他们将所有整数存储在一个数组中,并对它们执行某种算法。我很好奇是否有人可以扩展这是什么算法,或者它的代码或伪代码实现是什么样的。

【问题讨论】:

  • 只是从110000BigInteger 的循环计算70 毫秒的阶乘;但是这种幼稚的方法不适用于100000!(大约需要 10 秒)
  • 我不知道他们使用的是哪种算法,但您可以使用基于素数的算法:10! = 3628800 = 2^(10 / 2 + 10 / 4 + 10 / 8) * 3^(10 / 3 + 10 / 9) * 5^(10 / 5) * 7^(10 / 7) = 2^8 * 3^4 * 5^2 * 7
  • 大概是分治和一些有效的乘法。问题也很容易并行化,结果真的不大
  • 只有 10,000 次乘法,但相乘的数字是巨大的。他们可能使用the Karatsuba algorithm 或类似的东西。

标签: algorithm calculator factorial


【解决方案1】:

对于大整数算术,目标是同时减少必须对大整数进行的运算次数,并尽可能高效地执行基本运算(求和、除法、乘积等)。

在阶乘的情况下,有许多可用的算法可以减少乘法的次数(例如递归方法)。此外,乘法是使用可用的最佳算法完成的,通常按大小递增的顺序是:

基本乘法 --> karatsuba --> Tom-Cook --> Schönhage–Strassen 算法

一种算法比另一种算法更好的精确大小尚不清楚,通常是机器敏感的。

话虽如此,一切都有其局限性。这是 (10^i) 时间的输出!在 Mathematica 中计算 i 从 1 到 8。

Table[Timing[(10^i)!][[1]], {i, 1, 8}]
{0.000011, 0.00002, 0.000028, 0.000911, 0.015209, 0.20903, 3.99917, 58.9894}

更新:正如我所怀疑的,Wolfram 使用 GMP 进行一些大整数运算。

http://library.wolfram.com/infocenter/Conferences/7518/Macalester_talk.txt

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2015-04-19
    • 2011-04-16
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多