- 注册时间
- 2015-10-15
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 2202
- 在线时间
- 小时
|
楼主 |
发表于 2021-7-8 23:18:54
|
显示全部楼层
本帖最后由 TSC999 于 2021-7-9 09:11 编辑
下面是用改正错误后的程序进行计算,并与常新德公式计算结果对比。有时二者完全相同,但有时二者不一样,需要判定是哪个有错。例如下面的例子:
下面是四色珠子,黄色 1 颗、蓝色 1 颗、绿色 2 颗、红色 3 颗。手串共由这 7 颗珠子穿成。
按程序计算,共有 30 种花色如下图所示。但是按照常新德的公式计算,却有 31 种花色。问题来了,是公式错了还是程序错了?
上图中有没有花色重复的? 有没有遗漏的?
下面是程序计算和常新德公式计算,程序代码放在一起了。
有个疑问,公式计算中,算出了有 2 个圆排列是对称的,结果就折算成了 1 个环排列。我咋看不出哪个环排列是对称的?
- Clear["Global`*"];
- m = 4; n[1] = 1; n[2] = 1; n[3] = 2; n[4] = 3;
- Subscript[S, n] = \!\(
- \*UnderoverscriptBox[\(\[Sum]\), \(i = 1\), \(m\)]\(n[i]\)\);
- ss = {}; (* 所有的方案数列表 *)
- a = Permutations[{"黄", "蓝", "绿", "绿", "红", "红", "红"}, {Subscript[S,
- n]}]; (* Subscript[S, n] 个有重复元素的全排列 *)
- L = Length[a]; (* 共有多少种线排列? *)
- k = 0;
- While[L > 0,
- s = a[[1]]; (* 候选方案*)
- ss = Append[ss, s];
- s1 = Reverse[s]; (* 候选方案反排*)
- Do[If[a[[i]] == s || a[[i]] == s1, a[[i]] = {}], {i, 2, L}]; (*
- s 左移,s1右移之前,先筛一次 *)
- Do[s = RotateLeft[s]; s1 = RotateRight[s1]; (* s 左移一位,并存到 s 中;
- s1右移一位,并存到 s1 中*)
- Do[If[a[[i]] == s || a[[i]] == s1, a[[i]] = {}], {i, 2, L}];
- , {i, 1, Subscript[S, n] - 1}]; (*
- s每左移一位、s1每右移一位,与其余的比较,若有一个是相同的,将那个其余清空。共筛 Subscript[S, n] 次 *)
- a = DeleteCases[a, {}]; (* 去掉 a 中的所有空集 *)
- a = Delete[a, 1]; (* 去掉 a 中的候选方案 a[[1]] 后的 a 列表 *)
- L = Length[a]; (* 筛一轮后的 a 还有多少种线排列? *)
- k = k + 1;
- If[L == 0, Print[ss, " 所有花色方案展示,方案数 = ", k]];
- ];
- (*以下是按常新德公式计算*)
- Q = Sum[EulerPhi[d] *(Subscript[S, n]/d)!/\!\(
- \*UnderoverscriptBox[\(\[Product]\), \(i = 1\), \(m\)]\(\((
- \*FractionBox[\(n[i]\), \(d\)])\)!\)\), {d,
- Divisors[GCD[n[1], n[2], n[3], n[4]]]}]/Subscript[S, n](*圆排列数*)
- M = (\!\(
- \*UnderoverscriptBox[\(\[Sum]\), \(i = 1\), \(m\)]\(\[LeftFloor]
- \*FractionBox[\(n[i]\), \(2\)]\[RightFloor]\)\))!/\!\(
- \*UnderoverscriptBox[\(\[Product]\), \(i = 1\), \(m\)]\(\[LeftFloor]
- \*FractionBox[\(n[i]\), \(2\)]\[RightFloor]!\)\)(*圆排列中的对称排列数*)
- \[CapitalPhi] = (Q + M)/2(*环排列数*)
复制代码
上面程序运行结果是: 程序算出环排列数为 30,它们的具体排列方案见上图。常新德公式计算圆排列数为 Q = 60 种,其中对称排列的为 M = 2 种,所以环排列数 Φ =(Q+M)/2 = 31 种,比程序算的多了一种。
我看不出来存在 2 种对称的圆排列,如果有,它是什么模样的? 黄珠 1 颗、蓝珠 1 颗、绿珠 2 颗、红珠 3 颗。它们的圆排列咋能有对称的呢? 哪位网友发现有对称的,请告知一下。
补充内容 (2021-7-15 08:57):
最终发现程序没错,常新德公式也没错,错在我马虎了,没有认真看常新德老师的论文。各色珠子个数有奇有偶,若奇数个数大于 2 则 M=0,不存在对称圆排列,不用按公式计算了。当奇数个数是0、1、2 时才按公式计算。 |
|