Project Euler Problem 12

三角数の数列は自然数の和で表わされ、7番目の三角数は 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 である。三角数の最初の10項は1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...となる。 最初の7項について、その約数を列挙すると、以下のとおり。 1: 1 3: 1,3 6: 1,2,3,6 10: 1,2,5,10 15: 1,3,5,15 21: 1,3,7,21 28: 1,2,4,7,14,28 これから、7番目の三角数である28は5つ以上の約数をもつことが分る。 では、501 個以上の約数をもつ最初の三角数はいくらか。

恐ろしく時間のかかるひどいコードである.もっといい方法があるに決まってるし,Webをあちこちみてると数秒で答えが出ると書いている人もいたが,これは数時間かかります.性能の低いPCなら途中でRが死ぬと思う.うーむ.まぁ,解けたらよしのスタンスでこれまでやってきたので,今回もこれで次に進むけど,ここまで時間がかかるなら別の方法を考えた方がいいんだろうなぁ.しないけど.

tri <- c(1:12400)*c(2:12401)/2
b <- numeric()
for (i in 1:12400){
  p <- eratosthenes(tri[i])
  a5 <-sum((tri[i]/(p*p*p*p))%%p==0)
  a4 <-sum((tri[i]/(p*p*p))%%p==0)
  a3 <-sum((tri[i]/(p*p))%%p==0)
  a2 <-sum((tri[i]/p)%%p==0)
  a1 <-sum((tri[i]%%p)==0)

  a1 <- a1-a2
  a2 <- a2-a3
  a3 <- a3-a4
  a4 <- a4-a5
  a5 <- a5-a6

  b <- c(b,6^a5*5^a4*4^a3*3^a2*2^a1)
}
tri[(1:length(b))[500 < b]]