多様性を確保する

  • n個の要素を使って多様性を作りたいとする
  • 多様性は1,2,...,nの並び方で表現されているとする
  • このときn!通りのパターンができるわけだが、これをすべて実現するためには、このn!空間を巡るルールを整備する必要があって、面倒臭いかもしれない
  • 面倒臭くないルールは、1,2,...,n個を順繰りに回すような単純なルールを使うことかもしれない
  • n個を回すだけだと、作れる並び方はたったのn通り
  • これを、n1+n2=nに分けて、n1個で順繰り回し、n2個でも順繰り回しにすると、うまくするとn1xn2通りが実現できる
  • たとえばn=30を13+17=30に分ければ、13x17=221通りができる
  • 一方、n=30を14+16=30に分けるとどうなるかというと、14x16=224で13x17=221よりわずかに大きいが、実は、14と16の最小公倍数は112なので、112通りしか実現できない
  • 最小公倍数が関係するので、素数が適切に思えるし、確かに、13,17は素数だが…
  • では、n=30のときにどのように分けてぐるぐるまわしをするのが「もっとも多彩」か、というと、30=11+7+5+4+3としたときの4620通りである
  • ではnを1,2,...と増やしてやると、どんな分け方によって、何通りが作れるかを地道に計算してやろう
  • 1 2 3 4 6 6 12 15 20 30 30 60 60 84 105 140 210 210 420 420 420 420 840 840 1260 1260 1540 2310 2520 4620
  • これを数列大辞典で調べれば…Landau's function g(n)
1, 1, 2, 3, 4, 6, 6, 12, 15, 20, 30, 30, 60, 60, 84, 105, 140, 210, 210, 420, 420, 420, 420, 840, 840, 1260, 1260, 1540, 2310, 2520, 4620, 4620, 5460, 5460, 9240, 9240, 13860, 13860, 16380, 16380, 27720, 30030, 32760, 60060, 60060, 60060, 60060, 120120

library(partitions)
library(numbers)

mcycle <- function(n){
	p <- parts(n)
	tmp <- rep(1,length(p[1,]))
	for(j in 1:length(p[1,])){
		q <- p[,j]
		q. <- q[which(q>1)]
		if(length(q.)==1){
			tmp[j] <- q.[1]
		}
		if(length(q.)>1){
			tmp[j] <- mLCM(q.)
		}
	}
	s <- which(tmp==max(tmp))
	return(list(mcycle=tmp[s],parts = p[,s]))
}
ns <- 1:30
ret <- list()
parts <- list()
for(i in 1:length(ns)){
	tmp <- mcycle(ns[i])
	ret[[i]] <- tmp$mcycle
	parts[[i]] <- tmp$parts
}
ret
parts