正方形四边着色-Pólya计数

将一个正方形的四条边用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值