haskell - 欧拉计划 #2 大极限

标签 haskell

我有一个 Haskell 解决方案 Project Euler Problem 2对于 400 万的限制以及高达 10^100000 的限制,它工作得很好,在我的机器上只需要几秒钟。

但是对于更大的事情,例如10^1000000,计算不会及时返回(如果有的话)(已尝试将其保留几分钟)。这里的限制因素是什么?

evenFibonacciSum :: Integer -> Integer
evenFibonacciSum limit = 
  foldl' (\t (_,b) -> t + b) 0 . takeWhile ((<=limit) . snd) . iterate doIteration $ (1,2) where
    doIteration (a, b) = (twoAB - a, twoAB + b) where
      twoAB = 2*(a + b)

最佳答案

问题在于您正在对(偶数)斐波那契数求和。这意味着您必须计算所有这些。但是

F(n) ≈ φ^n / √5, with  φ = (1 + √5)/2

所以你要添加很多大尺寸的数字,Θ(n) F(n) 的位。对于 10^1000000 的限制,您需要大约 800000×2 个大于 10^500000 的数字相加。一般来说,您需要Θ(n)数字相加Θ(n)位。

添加d的数字数字[以任何基数]是 O(d)手术。所以你的算法的指数是二次的。

为避免这种情况,请找到总和的封闭公式 S(k)第一个 k即使是斐波那契数(提示:这是一个相对简单的公式,涉及 一个 斐波那契数),找到最大的 k这样F(3*k) <= limit ,并使用公式和算法计算总和来计算 F(n)O(log n)步骤例如here .

关于haskell - 欧拉计划 #2 大极限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13923675/

相关文章:

haskell - 类型类 - 简要说明

haskell - 我是否应该为可能适合该接口(interface)的类型实例化 Num 类型类?

haskell - 如何检查树是否是满二叉树

Haskell 和函数组合

haskell - 从构造函数内部提取数据

haskell - 为什么类型实例 (a->a) 和 (a->a->a) 在 GHC 7.8 中发生冲突?

haskell - 如何在haskell中获取char的ascii值?以及如何将 ascii 值(假设为 65)转换为字符 (A)?

haskell - OO 接口(interface)转换为 Haskell

haskell - 有类似 `map2::(i -> a) -> (i -> b) -> [i] -> [(a,b)]` 的东西吗?

list - Haskell:根据第一个值在列表中查找元组的第二个值