円周上を n 等分する点を,順に「点 1」から「点 n」とする。
これらの点から m 個の点を選ぶ( m ≦ n )。
m 個の点において,その内の 3 個の点を頂点とする三角形は mC3 個あるが,形の異なるものはいくつあるか。ただし,裏返さずに回転してぴったり重ねられる三角形は同じものとする。
添付図は,n=8,m=5 で,選ばれる点が 1,3,4,6,7 の場合である。
a, j は同じ形
b, d, e は同じ形
f, g は同じ形
残り c, h, i は,他に同じものはない
よって,形の異なる三角形は 6 種類
以下がプログラム。
dist = function(x) {
p = pos[x]
d = combn(3, 2, function(y) {
res = abs(p[y[1]]-p[y[2]])
ifelse(res > n %/% 2, n-res, res)
})
min.pos = which.min(d)
if (min.pos == 3) d[c(3, 1, 2)]
else if (min.pos == 2) d[c(2, 3, 1)]
else if (d[1] == d[3]) d[c(3, 1, 2)]
else d
}
n = 26 で,全ての点を使ってできる三角形の種類は
> n = 26
> pos = 1:n
> nrow(unique(t(combn(length(pos), 3, dist))))
[1] 100