Problem 101

数列のk個の項を与えられたときに, 次の項を確実に求めることは不可能である. その数列に合うような多項式が無限個存在するからである.
例として, 立方数の数列を考えよう. これは生成関数 un = n^3 で定義され, 1, 8, 27, 64, 125, 216, ...となる.
この数列の最初の2項のみが与えられているとしよう. "Simple is best"の法則にのっとり, 線形の関係があると仮定し, 3つ目の項が15であると予想する (差分が7). もし最初の3項のみが与えられていたとしても, 同じ原則により, 二次の関係があると仮定して次の項を予測する.
数列の最初のk項を生成できる最適な多項式のn項を OP(k, n) で表すことにする. 明らかに, n ≦ k について OP(k, n) は正しい. 最初の異なる項 (First Incorrect Term, FIT) は OP(k, k+1) であろう. これを bad OP (BOP) と呼ぶことにする.
原則より, 最初の項しか与えられていない場合には, 定数項とするのが理に適っているだろう; 即ち, n ≧ 2, OP(1, n) = u1.
従って, 立方数の数列について以下のOPを得る.

OP(1, n) = 1 1, 1, 1, 1, ...
OP(2, n) = 7n−6 1, 8, 15, ...
OP(3, n) = 6n^2−11n+6 1, 8, 27, 58, ...
OP(4, n) = n^3 1, 8, 27, 64, 125, ...

明らかに, k ≧ 4 のときにはBOPは存在しない.
BOPのFIT (上の例では赤で示されている) の和は, 1 + 15 + 58 = 74 である.
以下の10次多項式からなる生成関数を考える:
un = 1 − n + n^2 − n^3 + n^4 − n^5 + n^6 − n^7 + n^8 − n^9 + n^10
BOPのFITの総和を求めよ.

65ms.しかしこんな解き方でいいのやら…いいよな.Rだし.

## n個のデータを持つx, y=f(x)にn-1次多項式のモデルを当てはめて係数を返す
nth.poly.coefs <- function(x, y){
  n <- length(x)
  model <- "y ~ 1 + x"
  if(n >= 3){
    for(i in 2:(n-1)){
      model <- paste(model, "+I(x^", i , ")")
    }
  }
  data <- data.frame(x, y)
  round(lm(model, data=data)$coefficients)
}

## n個の係数をn-1次多項式f(x)に復元したときのf(n+1)の値を求める
get.FIT <- function(coefs){
  n <- length(coefs)
  FIT <- coefs[1]
  if(n > 1){
    for(i in 2:n){
      FIT <- FIT + coefs[i] * (n + 1)^(i - 1)
    }
  }
  return(FIT)
}

gen <- function(n) 1 - n + n^2 - n^3 + n^4 - n^5 + n^6 - n^7 + n^8 - n^9 + n^10

n <- 1:11
gn <- gen(n)

## FITの総和
sum.FIT <- 1
for(i in 2:10){
  x <- n[1:i]
  y <- gn[1:i]
  sum.FIT <- sum.FIT + get.FIT(nth.poly.coefs(x, y))
}
sum.FIT