将一个正方形的四条边用4种不同颜色(R,G,B,Y)着色,要求两个不同的正方形在经过旋转后没有相同的着色方案,问有多少种不同的着色方案使得至少有两条边的颜色为R?
解:将所有的着色方案看成集合X,order=4的循环群(cyclic group)为G,则X是一个G-Set。G={1, r, r^2, r^3, r^4} = {(), (1234), (13)(24), (1432)}, 则cycle index多项式为:
P(x1,x2, x3, x4) = 1/4 (x1^4 + x2^2 + 2 . x4)
其中x1~x4下标表示某个排列(G也是全排列群S4的一个子群)cycle长度为i (即cycle index)
根据Pólya计数定理:
所有不同的着色方案 = 不同的轨道(orbits) = 1/4 P(4,4,4,4) = 70
只有一条边颜色为R的着色方案 :设R的权重w(R)= x, 其他3种颜色的权重为默认值1,
则P(x+3,x^2+3,x^3+3,x^4+3) =1/4((x+3)^4 + (x^2+3)^2 + 2 . (x^4+3) )
得出x的系数1/4(4* 3^3)=27
没有任何边颜色为R的着色方案即等于常数项=1/4 (3^4 + 3^2 + 2.3)=24
所以符合要求的着色方案总数=70 - 27 - 24 = 19
candi = []
for c1 in ('R','G','B','Y'):
for c2 in ('R', 'G', 'B', 'Y'):
for c3 in ('R', 'G', 'B', 'Y'):
for c4 in ('R', 'G', 'B', 'Y'):
candi.append([c1,c2,c3,c4])
#print("size: {}".format(len(candi)))
#print(candi)
mark = []
for i in range(0,len(candi)):
count = 0
e = candi[i]
if e[0] == 'R':
count +=1
elif e[1] == 'R':
count +=1
if e[2] == 'R':
count +=1
if e[3] == 'R':
count +=1
if count < 2:
mark.append(False)
else:
mark.append(True)
#print(mark)
for i in range(0,len(candi)):
if mark[i]:
e = candi[i]
for j in range(i+1,len(candi)):
repeated = False
if candi[j] == [e[1],e[2],e[3],e[0]] or candi[j] == [e[2],e[3],e[0],e[1]] or candi[j] == [e[3],e[0],e[1],e[2]]:
repeated = True
if repeated:
mark[j] = False
#print(mark)
count = 0
for i in range(0,len(mark)):
if mark[i]:
count += 1
print(candi[i])
print("total:{}".format(count))
Output:
['R', 'R', 'R', 'R']
['R', 'R', 'R', 'G']
['R', 'R', 'R', 'B']
['R', 'R', 'R', 'Y']
['R', 'G', 'R', 'G']
['R', 'G', 'R', 'B']
['R', 'G', 'R', 'Y']
['R', 'G', 'G', 'R']
['R', 'G', 'B', 'R']
['R', 'G', 'Y', 'R']
['R', 'B', 'R', 'B']
['R', 'B', 'R', 'Y']
['R', 'B', 'G', 'R']
['R', 'B', 'B', 'R']
['R', 'B', 'Y', 'R']
['R', 'Y', 'R', 'Y']
['R', 'Y', 'G', 'R']
['R', 'Y', 'B', 'R']
['R', 'Y', 'Y', 'R']
total:19