Problem 113

Problem 112に引き続いてbouncy numberに関連した問題.
bouncy numberで無い数の割合は調べる範囲を広げるほど減っていって,例えば100万未満だと12951個で,10^{10}未満まで範囲を広げても27732個しかない.
探索範囲を1 googol(10^{100})未満の数字にしたとき,bouncy numberでない数はいくつあるか.
これはProblem 112に比べたらずっと簡単で,計算時間も380msだった.gmp使ったけど…
ところでbigzクラス用にsum.bigzという名前で関数定義したらこんな感じでエラー出てなんか上手く行かなかった.

> library(gmp)
> sum.bigz <- function(z) rev(cumsum(z))[1]
> x <- as.bigz(1:5)
> sum(x)
 以下にエラー sum.bigz(c(05, 00, 00, 00, 01, 00, 00, 00, 01, 00, 00, 00, 01,  : 
   使われていない引数 (na.rm = FALSE)

何かやり方間違えてるんだろうか.

library(gmp)
sum <- function(z){
  rev(cumsum(z))[1]
}

dec.nums <- function(d){
  if(d < 2) return(9)
  d <- d - 1
  pattern <- as.bigz(c(0, rep(1, 9)))
  sum.p <- sum(pattern)
  for(i in 1:d){
    pattern <-
      c(sum(pattern),                   #0
        sum(pattern[2:10]),             #1
        sum(pattern[3:10]),             #2
        sum(pattern[4:10]),             #3
        sum(pattern[5:10]),             #4
        sum(pattern[6:10]),             #5
        sum(pattern[7:10]),             #6
        sum(pattern[8:10]),             #7
        sum(pattern[9:10]),             #8
        sum(pattern[10]))               #9
    sum.p <- sum.p + sum(pattern)
  }
  return(sum.p)
}

inc.nums <- function(d){
  if(d < 2) return(9)
  d <- d - 1
  pattern <- as.bigz(rep(1,9))
  sum.p <- sum(pattern)
  for(i in 1:d){
    pattern <-
      c(sum(pattern),                   #9
        sum(pattern[2:9]),              #8
        sum(pattern[3:9]),              #7
        sum(pattern[4:9]),              #6
        sum(pattern[5:9]),              #5
        sum(pattern[6:9]),              #4
        sum(pattern[7:9]),              #3
        sum(pattern[8:9]),              #2
        sum(pattern[9]))                #1
    sum.p <- sum.p + sum(pattern)
  }
  return(sum.p)
}

bouncy.nums <- function(d){
  pow.bigz(10, d) - 1 - (dec.nums(d) + inc.nums(d) - d * 9)
}
pow.bigz(10, 100) - bouncy.nums(100) - 1