プロジェクトオイラー(1)

Project Euler
http://projecteuler.net/index.php


存在を知ってはいたが、見たことはなかった。
最初から解いていこうと思う。
まず、Pythonで素直に書く。できれば数学的に考察した解も書く。

Q1.
3か5で割り切れる自然数で1000より小さいものの和。


a = filter(lambda x: x % 3 == 0 or x % 5 == 0, range(1000))
print reduce(lambda x, y: x + y, a)

mの倍数でnより小さいものの総和をSm,nと書くと、


p = [(n - 1) / m]
Sm,n = m + 2m + ... + pm
= (1 + p)mp/2

求める和は、


S3,1000 + S5,1000 - S15,1000


def sum(m, n):
p = (n - 1) / m
return (1 + p) * m * p / 2

N = 1000
print sum(3, N) + sum(5, N) - sum(15, N)