分割数とフラクタル

  • こちらで単体とか複体とかをやっている
    • ある意味では、これは「分割」の方法の幾何的表現
    • そこに入れ子を作って、配列の時間発展則を考えたい
    • 以下の話は、非常に興味深い
  • 数学セミナーの2012年11月号に「分割数とフラクタル」という記事がある

数学セミナー 2012年 11月号 [雑誌]

数学セミナー 2012年 11月号 [雑誌]

  • 分割数(こちら)
    • オンライン整数列大辞典では数列IDがA000041で、こちら
      • こちらで、分割数の初めの方の値「1,2,3,5,7,11,15,22」を入れて検索すれば得られる
  • 分割数には母関数(母関数とは)があって
  • 分割数には合同算術(合同式)があって
  • 近似式もあるという
  • この分割数の合同式が、フラクタルを導くという
  • セミの記事で、「数が好きな小学生ならば'ゴハンデスヨ'と呼ばれるまで実行するだろう」という、手続きが以下
    • 4=3+1=2+2=2+1+1=1+1+1+1
    • 5=4+1=3+2=3+1+1=2+2+1=2+1+1+1=1+1+1+1+1
  • このルールは、与えられた値nについて、i=n,n-1,...1まで順に考える。n=i+(n-i)としたら、n-iに関して同じく(再帰的に)考える。ただし、n-iの分割に関しては、i以下の数だけでできた分割であることを採用の条件とする、と、こういうルール
    • Rで書いてみよう
  • 2013/08/26 別の書き方
# nを最大数kで分割する分割数

my.seq.8 <-function(n,k){
	ret <- 0
	if(n==1 & k==1){
		return(1)
	}
	for(i in 1:k){
		a <- n-i
		if(a==0){
			ret <-ret+1
		}else{
			ret <- ret+my.seq.8(a,min(i,a))
		}
		
	}
	ret
}

#my.seq.8(1,1)
#my.seq.8(2,2)

# いわゆる分割数は、nを最大数nで分割する場合の数
for(i in 1:20){
	print(my.seq.8(i,i))
}
partitions1 <- function(n){
	ret <- list()
	cnt <- 1
	# 再帰処理のスタート(n=1の分割を教える)
	if(n == 1){
		ret[[1]] <- c(1)
	}else{
		# n自身から1まで
		for(i in n:1){
			# n = i + (n-i)に分ける
			first <- i
			second <- n-i
			# n=nはそれ以上分割しない
			if(second == 0){
				ret[[cnt]] <- c(first)
				cnt <- cnt+1
			# 分割したら、第2項を再帰的に分割する
			}else{
				tmp <- partitions1(second)$partitions
				for(j in 1:length(tmp)){
					# ただし、第2項の分割の構成数は第1項以下
					if(max(tmp[[j]]) <= first){
						ret[[cnt]] <- c(first,tmp[[j]])
						cnt <- cnt+1
					}
					
				}
			}
			
		}
	}
	# 分割パターンと、分割数とを返す
	return(list(partitions = ret, n.partitions = length(ret)))
}

list.partitions <- list()
n.partitions <- c()

n <- 15

for(i in 1:n){
	#print(paste("i=",i))
	#print(partitions1(i))
	p.out <- partitions1(i)
	list.partitions[[i]] <- p.out$partitions
	n.partitions[i] <- p.out$n.partitions
}
n.partitions
> n.partitions
 [1]   1   2   3   5   7  11  15  22  30  42  56  77 101 135 176 231 297 385