互いに等距離

  • ある点から等距離にある点の集合は(超)球をなす
  • 相互に等距離にあるk個の点はk-1次元空間に配置することができて、それは(正)単体をなす(正三角形・正四面体・・・一般化)
  • 今、k次元空間にある、単位超球(半径1の球)面の点を位置座標とするk次元ベクトルを考える
  • このk次元ベクトルは互いに\cos\theta = r^2となっているとする
  • このようなベクトルは、最大でk本作ることができる
  • k-1本を作ることも容易である
  • k本、k-1本それぞれを作ってみる
  • それらは、単位(超)球面上にある正単体となっている
  • 正単体の連結する2辺は(正三角形の一部なので)60度の角をなす
ip<-function(x,y){ #内積
	sum(x*y)
}

angle<-function(x,y){ # cosine
	ip(x,y)/sqrt(ip(x,x)*ip(y,y))
}
# 正単体の頂点座標
CategoryVector<-
function (nc = 3) 
{
    df <- nc - 1
    d <- df + 1
    diagval <- 1:d
    diagval <- sqrt((df + 1)/df) * sqrt((df - diagval + 1)/(df - 
        diagval + 2))
    others <- -diagval/(df - (0:(d - 1)))
    m <- matrix(rep(others, df + 1), nrow = df + 1, byrow = TRUE)
    diag(m) <- diagval
    m[upper.tri(m)] <- 0
    as.matrix(m[, 1:df])
}

k<-10
r<-0.8
R<-sqrt(1/k*(r^2*(k-1)+1))
A<-cbind(rep(R,k),CategoryVector(k)*sqrt(1-R^2))
A # k個作成

B<-cbind(rep(r,k-1),diag(rep(sqrt(1-r^2),k-1)))
B # k-1 個作成(直交座標を使うので、こちらの方が簡単(だけれど本数が1本少ない)
# r^2になる
angle(A[1,],A[2,])
angle(B[1,],B[2,])
# 0.5が返る→角度が1/3 pi
angle((A[1,]-A[2,]),(A[1,]-A[3,]))
angle((B[1,]-B[2,]),(B[1,]-B[3,]))