多項格子

  • \sum_{i=i}^k x_i = L; x_i \ge 0となる整数ベクトル\mathbf{x}=(x_1,...,x_k)のとる格子点を再帰的な関数で作る
  • 計算させてみないで作る方がよいのでこれこそHaskellが得意そうだが
grid.multinom<-function(L,k){
	ret<-list()
	if(k==1){
		ret[[1]]<-c(L)
	}else{
		cnt<-1
		for(i in 0:L){
			tmp<-grid.multinom(L-i,k-1)
			for(j in 1:length(tmp)){
				ret[[cnt]]<-c(i,tmp[[j]])
				cnt<-cnt+1
			}
		}
	}
	
	ret
}
grid.multinom(4,1)
  • もちろん、高次元になるとすごく重いのだが、3次元くらいで1辺が短いものや、「頂点付近」に限定すれば、まあ、動く
# 周辺部分だけ作ろう
LLL<-list()
minL<-990
L<-1000
k<-3
cnt<-1
for(i in minL:L){
	tmp<-grid.multinom(L-i,k-1)
	for(j in 1:length(tmp)){
		LLL[[cnt]]<-c(i,tmp[[j]])
		cnt<-cnt+1
	}
}
LLL