Association schemes

  • こちらの続き
  • Latin squareが作るAssociation schemeの行列表現を作ってみる
  • ラテン方格は『n 行 n 列の表に n 個の異なる記号を、各記号が各行および各列に1回だけ現れるように並べたもの』
  • 今、n^2個の要素について、そのペアをとって関係を考える
    • 「自身」という関係
    • 「第一関係」という関係
      • ラテン方格において、行が一緒か、列が一緒か、入っている値が一緒だったら「第一関係」。ただし、「自身」という関係の場合を除く
    • 「第二関係」はそれ以外
  • 上記3つの関係として、それぞれの関係にある場合に1、ない場合に0となるような(n^2) \times (n^2)行列を3つ作る
# Latin square
# ラテン方格の文字の入り具合
X<-matrix(c("A","B","C","D","D","A","B","C","C","D","A","B","B","C","D","A"),4,4,byrow=TRUE)
# n^2要素に数値のIDをつける
Y<-matrix(1:16,4,4,byrow=TRUE)

M<-matrix(0,4^2,4^2)
# 自身という関係は対角成分がすべて1の行列
A0<-diag(rep(1,4^2))
# ラテン方格の行が一緒、列が一緒、ラテン方格の文字が一緒の関係を
# R, C, Lに入れる
R<-C<-L<-matrix(0,4^2,4^2)

for(i in 1:16){
	tmp1<-which(Y==i,arr.ind=TRUE)
	for(j in 1:16){
		tmp2<-which(Y==j,arr.ind=TRUE)
		if(tmp1[1]==tmp2[1]){
			R[i,j]<-1
		}
		if(tmp1[2]==tmp2[2]){
			C[i,j]<-1
		}
		if(X[tmp1]==X[tmp2]){
			L[i,j]<-1
		}
	}
}
# 3条件のいずれかに当てはまるものをA1で1にする
A1<-R+C+L-3*A0
# すべての要素が1の行列
J<-matrix(1,16,16)
# A2は「残り」
A2<-J-A1-A0

A1%*%J
A2%*%J
  • グラフ表示する
v<-16

t<-seq(from=0,to=1,length=v+1)*2*pi
t<-t[-length(t)]

plot(cos(t),sin(t))
As<-list()
As[[1]]<-A0
As[[2]]<-A1
As[[3]]<-A2

for(i in 1:length(As)){
	for(j in 1:length(As[[i]][,1])){
		for(k in 1:length(As[[i]][1,])){
			if(As[[i]][j,k]==1){
				segments(cos(t[j]),sin(t[j]),cos(t[k]),sin(t[k]),col=i,lwd=1)
			}
			
		}
	}
}