いろいろ数え上げる
数え上げ
#
- 順列
permN<-function(N=10,k=3){
return(exp(lgamma(N+1)-lgamma((N-k)+1)))
}
- 組み合わせ
combN<-function(N=10,k=3){
return( exp(lgamma(N+1)-lgamma((N-k)+1)-lgamma(k+1)) )
}
- 重複順列
repPermN<-function(N=10,k=3){
return(N^k)
}
- 重複組み合わせ
repCombN<-function(N=10,k=3){
return(combN(N+k-1,k))
}
- 分割と分割数
- N個の要素を持つ分割の数はベル数
- N個の要素を持つ分割の数はベル数
bellN<-function(N=10){
bs<-rep(0,N+1)
bs[1]<-1
for(i in 2:(N+1)){
for(j in 0:(i-2)){
bs[i]<-bs[i]+choose(i-2,j)*bs[j+1]
}
}
return(bs)
}
- N個の要素をk分割する場合の数は第2スターリング数
Stirling2N <- function(N=10,k=3)
{
if (0 > k || k > N) stop("'k' must be in 0..N !")
x <- 0:k
sig <- rep(c(1,-1)*(-1)^k, length= k+1)# 1 for k=0; -1 1 (k=1)
ga <- gamma(x+1)
round(sum( sig * x^N /(ga * rev(ga))))
}
- N個の要素の非交差な分割の総数はカタラン数:木の形の数も。
CatalanN<-function(N=10){
return(exp(lgamma(2*N+1)-lgamma(N+2)-lgamma(N+1)))
}
- 分岐木のトポロジー数
numTreeTopology<-function(n=3){
tmp<-rep(0,n)
if(n==1){
tmp[1]<-1
}else if(n==2){
tmp[1]<-1
tmp[2]<-1
}else{
tmp<-rep(0,n)
tmp[1]<-1
tmp[2]<-1
for(i in 3:n){
for(j in 1:(i-1)){
tmp[i]<-tmp[i]+choose(i,j)*tmp[j]*tmp[i-j]/2
}
}
}
tmp
}
- Acyclic directed graphの数
- 数列データベース "id":"A003024"
NADG<-function(N=5){
ret<-rep(0,N)
for(i in 1:N){
if(i==1){
ret[i]<-1
}else{
for(j in 1:i-1){
ret[i]<-ret[i]+(-1)^(j-1)*choose(i,j)*2^(j*(i-j))*ret[i-j]
}
ret[i]<-ret[i]+(-1)^(i-1)*choose(i,i)*2^(i*(i-i))
}
}
ret
}