math - 如何在Erlang中计算5 ^ 262144

标签 math erlang elixir bigdata

基于THIS问题,我意识到似乎无法以常规方式计算此类数字。
有什么建议?

最佳答案

可能,但是您需要的算法比朴素的解决方案聪明一点。如果您编写了幼稚的幂函数,则可以执行以下操作:

pow(_, 0) -> 1;
pow(A, 1) -> A;
pow(A, N) -> A * pow(A, N-1).

只是展开了幂函数。但是问题是,在您的情况下,这将是262144乘法,并且数字越来越大。诀窍是一个非常简单的见解:如果将N除以2,再乘以A平方,则几乎可以得到正确的答案,除非N为奇数。因此,如果我们为奇数情况添加一个固定项,我们将获得:
-module(z).

-compile(export_all).

pow(_, 0) -> 1;
pow(A, 1) -> A;
pow(A, N) ->
    B = pow(A, N div 2),
    B * B * (case N rem 2 of 0 -> 1; 1 -> A end).

这几乎可以立即在我的机器上完成:
2> element(1, timer:tc(fun() -> z:pow(5, 262144) end)).
85568

当然,如果进行许多操作,则85ms几乎是不能接受的。但是计算这实际上是相当快的。

(如果您需要更多信息,请查看:https://en.wikipedia.org/wiki/Exponentiation_by_squaring)

关于math - 如何在Erlang中计算5 ^ 262144,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38533797/

相关文章:

flash - 如何在 AS3 中使用抛物线公式来发射始终拦截给定点的箭头

javascript - 在一维数组中查找局部最大值

c - 为什么使用 enif_alloc 而不是 malloc

elixir - 如何测试 Elixir GenStage Consumer?

erlang - 如何从 mnesia 中仅选择 X 条记录

javascript - 如何在 2 个 div 上使用 substr?

javascript - 网络音频API : Dividing two AudioNodes' outputs

reactjs - Elixir/Erlang : How to find the source of high CPU usage?

erlang - 是否可以在不编译的情况下运行erlang?

pattern-matching - Elixir 复杂模式匹配顺序