项目欧拉#368(数学公式)

时间:2012-01-26 20:29:52

标签: ruby math calculus

在Project Euler中,a problem要求我编写一个程序,以便从谐波序列中找到20个项的收敛值:

1/111, 1/222, 1/333, 1/444, 1/555, 1/666, 1/777, 1/888, 1/999, 1/1000, 1/1110, 1/1111, 1/1112, 1/1113, 1/1114, 1/1115, 1/1116, 1/1117, 1/1118, and 1/1119

我想自己编写程序来解决这个问题,然而,没有处理过Calc II,我不得不阅读Divergence / Convergence。所有解释都涉及可以用公式表示的系列。据我所知,这个系列不能。

所以,问题是:

是否有表示此系列的公式,或者是否有一种方法可以在没有公式的情况下找到此系列的收敛?

3 个答案:

答案 0 :(得分:9)

以防任何人考虑暴力破解:

蛮力方法将在这里,就像大多数编号较高的Project Euler问题一样,不会在合理的时间内完成。

假设您的计算机每秒可以处理10个 9 数字(实际上它可以处理的数量远远少于)。要将n > 9的有效项加起来为10 n ,需要大约10 n-9 秒。

你需要多远才能确定小数点后十位的总和?

足够远,所有较大有效项的总和小于10 -10 。 10 12 是否足够远?不。考虑来自

的下一千个数字
1001001001001

其中的无效数字是

1001001001110
1001001001111
1001001001112
...
1001001001119
1001001001222
1001001001333
1001001001444
...
1001001001999
1001001002000

那些是19,所以有981个有效数字,相应的总和大于981/1001001002000,大于9 * 10 -10 。沿着这些方向进行进一步推理表明,你必须蛮力远高于10 15 - 事实上,你必须超过10 2000 剩余的有效期限小于10 -10

在宇宙开始时开始的蛮力甚至还远远不能接近可靠的答案。

答案 1 :(得分:0)

如果你仔细阅读这个问题,你会注意到实际上有一个公式。您正在处理的序列是一个谐波序列,从中删除了具有3个或更多相等连续数字的术语。这里的蛮力方法是对谐波系列的所有项进行求和,省略指定的项,直到达到所需的精度。具有Rational类的Ruby似乎是非常好的候选者。

答案 2 :(得分:0)

针对这个问题的天真和蛮力方法是编写循环迭代系列的分母,并将分母的倒数加到总和中,因为它不会被问题描述中规定的限制排除。

大纲与此类似:

for i in (1..1200)
  if is_valid(i) then
    sum += 1.0 / i
  end
end

def is_valid(_i)
  # implement the check here. hint: use modulo operator ;-)
end