双重枚举
置换树的
操作° |
交叉 |
联盟 |
减 |
逆- |
对称差分 |
高度° 宽度 |
|
|
|
|
|
高度° 取代 |
|
|
|
|
|
宽度° 取代 |
|
|
|
|
|
这是7月份博客的延续:置换类型和排列树.
编辑:缺失的序列号指的是下面解释的序列,但这些序列从未提交给OEIS。
乔治·贝克给seqcomp的消息
乔治·贝克最近在groups.google.com/group/seqcomp上写道:
“双重枚举的想法似乎很自然二分法计数原理的推广不同的方式。"
更具体地说,贝克写道:“…假设我们有一个函数f[n,k]从n个对象中计算对于ff[x]=k的对象x,以及类似的g,那么矩阵fg[i,j]将计算ff[x]对应的对象x=i和gg[x]=j。行总和将等于列总和。"
据我所知,贝克的想法基本上可以形式化为
DoubleEnum:=进程(对象,f,g,n)局部M,i,j,S,r,k;M:=矩阵(n,n,[seq(0,i=1..n^2)]);对于i从1到n do对于j从1到ndoM[i,j]:=nops(f(objs,i)与g(objs,j)相交);od od;打印(M);#行和和列和S:=序列(添加(行(M,r)[k],k=1..n),r=1..n;打印(“行”,[S],添加(r,r=S));S:=seq(加上(列(M,r)[k],k=1..n),r=1..n);打印(“列”,[S],添加(r,r=S));NULL结尾:
因此,双枚举是由四个元素组成的对于一组对象objs,有两个过滤函数f和g类型(对象,标准)→ 子对象返回满足条件的objs对象以及描述f和g的范围[1,n]的参数n。
贝克把他的想法用于列举排列以两种方式计算物体,按上升次数和循环数,从而给出双重枚举通过欧拉数和第一类斯特林数。(见贝克的演示.)
排列树
显然,这个想法可以应用于类似的双重枚举更简单的描述是:树的枚举,首先是关于树的宽度,然后是关于到树的高度。
这正是我们在前面的文章中所做的置换树. 让我们进一步探索这些树,现在是关于贝克对双重枚举的形式化。
为了方便起见,我们重复我们的基本工具,转换器函数置换→ 树。
perm2树:=进程(perm)本地树,i,next,根,分支,当前;树:=[];根:=0;分支:=[根];i:=1;下一个:=perm[i];虽然是真的while next<分支[nops(分支)]dobranch:=subsp(nops(branch)=NULL,branch);od;电流:=根;while next>当前做分支:=[op(分支),next];i:=i+1;如果i>nops(perm),则树:=[op(tree),branch];RETURN(树)fi;当前:=下一个;下一个:=烫发[i];od;树:=[op(tree),branch];od端:
使用此工具,我们可以定义对象集。
对象:=n->convert(map(perm2tree,combint[permute](n)),set);
接下来我们定义两个过滤器函数。(对于那些不熟悉的人用枫叶语读“卡”而不是“不”。)
高度:=T->max(op(map(b->max)(nops(b)),T))-1;树按高度:=(T,h)->选择(T->高度(T)=h,T):TreesByWidth:=(T,h)->选择(T->nops(T)=h,T):
高度与宽度配对
宏将把事情绑定在一起。
DoubleEnumPermutationTreesByHeightAndWidth:=n->DoubleEnum(对象(n),树按高度,树按宽度,n):
现在我们开始:
对于从1到6的n,执行DoubleEnumPermutationTreesByHeightAndWidth(n)od;[ 1 ]1, 1[0 1][1 0]2、2[0 0 1][0 4 0][1 0 0]6, 6[0 0 0 1][0 3 11 0][0 8 0 0][1 0 0 0]24, 24[0 0 0 0 1][0 0 25 26 0][0 13 41 0 0][0 13 0 0 0][1 0 0 0 0]120, 120[0 0 0 0 0 1][0 0 15 130 57 0][0 10 183 172 0 0][0 28 104 0 0 0][0 19 0 0 0 0][1 0 0 0 0 0]720, 720
树木穿越和位移
想象一下,一条蠕虫在树的周围爬行。它从左手边开始,顺时针旋转树。访问完所有节点后,它将停止。我们会打电话的距蠕虫初始位置(树根)和最终位置的距离树的位移。它也是节点的级别蠕虫停止的位置(根级别为0)。它也是从根位置到最终位置减去1的分支上的节点。最后,根据我们关于遍历的约定,它也是树的最左边的树枝。
带位移的配对高度
正如我在置换树博客中的命题3中所说:“斯特林循环数根据第一个(最左侧)分支的长度。这个描述有点简单然后使用循环安排的标准定义。"所以让我们也实现这个枚举。
TreesByDisplacement:=(T,h)->选择(T->nops(T[nops(T)])-1=h,T):DoubleEnumPermutationTreesByHeightAndDisplacement:=n->DoubleEnum(对象(n),树按高度,树按置换,n):对于从1到6的n,执行DoubleEnumPermutationTreesByHeightAndDisplacement(n)od;[ 1]1, 1[1 0][0 1]2、2[1 0 0][1 3 0][0 0 1]6, 6[1 0 0 0][4 10 0 0][1 1 6 0][0 0 0 1]24, 24[1 0 0 0 0][14 37 0 0 0][ 8 12 34 0 0][ 1 1 1 10 0][ 0 0 0 0 1]120, 120[ 1 0 0 0 0 0][51 151 0 0 0 0][54 104 207 0 0 0][13 18 17 84 0 0][ 1 1 1 1 15 0][ 0 0 0 0 0 1]720, 720
将宽度与位移配对
DoubleEnumPermutationTreesByWidthAndDisplacement:=n->DoubleEnum(对象(n),树按宽度,树按置换,n):对于从1到6的n,执行DoubleEnumPermutationTreesByWidthAndDisplacement(n)od;[ 1]1, 1[0 1][1 0]2、2[0 0 1][1 3 0][1 0 0]6, 6[0 0 0 1][1 4 6 0][4 7 0 0][1 0 0 0]24, 24[ 0 0 0 0 1][1 5 10 10 0][11 30 25 0 0][11 15 0 0 0][ 1 0 0 0 0]120, 120[ 0 0 0 0 0 1][ 1 6 15 20 15 0][26 91 120 65 0 0][66 146 90 0 0 0][26 31 0 0 0][ 1 0 0 0 0 0]720, 720
平展正方形序列
将三个矩阵序列展平为整数序列通过行的串联,现在可以为OEIS生成三个新序列。
[AX5]DoubleEnumPermutationTreesBy高度和宽度1,0,1,1,0,0,0,1,0,4,0,1,0,0,0,0,0,1,0,3,11,0,0,8,0,0,1,0,0,0,0,0,0,0,1,0,0,25,26,0,0,13,41,0,0,0,13,0,0,0,1,0,0,0,0,[AX6]按高度和位移排列的DoubleEnumPermutationTrees1,1,0,0,1,1,0,0,1,3,0,0,0,1,1,0,0,0,4,10,0,0,1,1,6,0,0,0,0,1,1,0,0,0,0,14,37,0,0,0,8,12,34,0,0,1,1,1,10,0,0,0,0,0,1,[AX7]双枚举排列树(按宽度和位移)1,0,1,1,0,0,0,1,1,3,0,1,0,0,0,0,0,1,1,4,6,0,4,7,0,0,1,0,0,0,0,0,0,0,1,1,5,10,10,0,11,30,25,0,0,11,15,0,0,0,1,0,0,0,0,
使用集合操作进行泛化
我们的故事到此结束吗?恰恰相反!我们的抽象方法便于进一步推广。我们现在介绍五种类型通过将第五个参数(操作)添加到DoubleEnum过程,现在是GenDoubleEnum(objs,f,g,n,op)。我们将考虑And、Or、Minus、ConverseMinus和对称差异。
- DoubleEnumAnd:=GenDoubleNum(objs,f,g,n,intersect)
- DoubleEnumOr:=GenDouble枚举(objs,f,g,n,union)
- 双枚举减:=GenDoubleEnum(objs,f,g,n,减号)
- DoubleEnumConvMinus:=GenDoubleNum(objs,g,f,n,减号)
- DoubleEnumSymmDiff:=GenDoubleEnum(objs,g,f,n,symmdiff)
在Maple实施方面,我们要做的就是:
替换:DoubleEnum:=proc(objs,f,g,n,op)由:GenDoubleEnum:=进程(objs,f,g,n,op);替换:M[i,j]:=nops(f(objs,i)与g(objs,j)相交);通过:M[i,j]:=nops(op(f(objs,i),g(objs,j)));
例如,我们现在可以定义以下函数:
排列树(按高度和宽度):=n->GenDoubleEnum(对象(n),树按高度,树按宽度,n,`相交`):
类似地,我们可以定义另外14个函数(参见下面的Maple代码)。以下列表给出了简短的总结。
- 按高度和宽度排列树;
- 排列树(按高度或宽度);
- 排列树(按高度减去宽度);
- 排列树(按宽度减去高度);
- 排列树按宽度SymmdiffHeight;
- 按高度和位移排列树;
- 按高度或位移排列树;
- 按高度最小位移排列的置换树;
- 置换树(按置换减去高度);
- 按高度排列树Symmdiff置换;
- 按宽度和位移排列树;
- 按宽度或位移排列的置换树;
- 按宽度减去位移排列树;
- 置换树按置换减去宽度;
- 按宽度排列树Symmdiff置换;
我们还将使用三个字母格式的快捷方式|class|set-operation|class|。下表显示了他们的使用。
操作° |
交叉 |
联盟 |
减 |
逆- |
对称差分 |
高度° 宽度 |
高/宽 |
HáW(高宽) |
高\W |
宽\H |
HΔW |
高度° 取代 |
H∈D |
HüD(高密度) |
H\D公司 |
D\H公司 |
HΔD |
宽度° 取代 |
宽/深 |
WáD(宽密度) |
W\D公司 |
天\天 |
WΔD |
这些新的计数有意义吗?我确实相信。因为基本集,排列,是许多组合的基础问题和所使用的运算是基本的集合论问题。
我们知道欧拉和斯特林的行和列案例总和为n!。新案例中这些实体的总和是多少?
HIW:高度交叉宽度:A000142号,n!HID:高度相交位移:A000142号,n!WID:宽度相交位移:A000142号,n!HMW:高度减去宽度:A062119号,n*(n-1)HMD:高度减去位移:A062119号,n*(n-1)WMH:宽度减去高度:A062119号,n*(n-1)WMD:宽度减去位移:A062119号,n*(n-1)DMH:位移减去高度:A062119号,n*(n-1)DMW:位移减去宽度:A062119号,n*(n-1)HUW:高度和宽度:A175925号,n*(n+1)(2n+1)HUD:高度联合位移:A175925号,n*(n+1)(2n+1)WUD:宽度活接头位移:A175925号,n*(n+1)(2n+1)WSH:宽度symmdiff高度:A052609型,n*(n-1)2WSD:宽度symmdiff位移:A052609型,n*(n-1)2HSD:高度symmdiff位移:A001105号,2n^2
斯特林·欧拉跳跃杰克
虽然直觉的意思乍一看有点隐藏这种形式演算很容易重构。例如乔治·贝克案在他的演示中考虑到“欧拉数与斯特林数“第一类”对应于交叉口的设置操作并在我们的树解释框架中描述了置换树的第一个分支的长度和该树的叶子数。
|
如果我必须实现这个关系的动画演示,我会画一个置换树(固定节点数),并让长度用户可以调整最左侧分支的。如果用户拉动此“腿”,则位移增加,宽度减小。如果用户再次松开,树就会变宽。在每个阶段,树可以用几种方式重组其余的分支。 这基本上就是“欧拉数对第一类斯特林数”的含义。我将这部动画命名为“Der Stirling-Eulersche Hampelmann”(斯特林-欧拉跳跃杰克),因为它让我想起了几乎每个孩子都玩过的玩具。 |
约翰·利奇(John Leech)的图像,摘自:吉尔伯特·阿伯特·A·贝克特(Gilbert Abbott A Beckett)、布拉德伯里(Bradbury)、埃文斯公司(Evans&Co)的《罗马喜剧史》(The Comic History of Rome),伦敦,1850年代。文件属于公共领域,取自维基百科。 |
双枚举三角形:行和
[A179454号]行(hiw)“行”,[1],1“行”,[1,1],2“行”,[1,4,1],6“行”,[1,14,8,1],24“行”,[1,51,54,13,1],120“行”,[1,202,365,132,19,1],720“行”,[1,876,2582,1289,265,26,1],5040[AX8]行(huw)“行”,[1],1“行”,[3,3],6“行”,[8,14,8],30“行”,[27,66,48,27],168“行”,[124,324336172124],1080“罗”,[725,1730,2545,1380,815,725],7920“行”,[5046102962053212774663051965046],65520[AX9]行(hmw)“行”,[0],0“行”,[1,1],2“行”,[2,8,2],12“行”,[3,42,24,3],72“行”,[4,204,216,52,4],480“行”,[5,1010,1825,660,95,5],3600“行”,[6,5256,15492,7734,1590,156,6],30240
[AX1]行(wmh);另请参见:[A062119号]“行”,[0],0“行”,[1,1],2“行”,[2,8,2],12“行”,[3,33,33,3],72“行”,[4104,264,104,4],480“行”,[5285151015102855],3600“行”,[672071461449671467206],30240[AX2]行(wsh);另请参见:[A052609型], [A030495号(n) -1]“行”,[0],0“行”,[2,2],4“行”,[7,10,7],24“行”,[26,46,46,26],144“行”,[1231983198123],960“罗”,[724948192819281928948724]7200“行”,[5045564010995171201099556405045],60480
[A179454号]行(隐藏)“行”,[1],1“行”,[1,1],2“行”,[1,4,1],6“行”,[1,14,8,1],24“行”,[1,51,54,13,1],120“行”,[1,202,365,132,19,1],720“行”,[1,876,2582,1289,265,26,1],5040[AX10]行(hud)“行”,[1],1“行”,[3,3],6“行”,[8,14,8],30“行”,[27,66,48,27],168“行”,[124,324336172124],1080行´,[725、1730、2545、1380、815、725]、7920“行”,[5046102962053212774663051965046],65520[AX11]行(hmd)“行”,[0],0“行”,[1,1],2“行”,[2,8,2],12“行”,[3,42,24,3],72“行”,[4204,216,52,4],480“行”,[5,1010,1825,660,95,5],3600“行”,[6,5256,15492,7734,1590,156,6],30240[AX12]行(dmh)“行”,[0],0“行”,[1,1],2“行”,[4,6,2],12“行”,[18,33,18,3],72“行”,[96,200,140,40,4],480“行”,[600,1370,1125,425,75,5],3600“行”,[4320,10584,9744,4410,1050,126,6],30240[A111650型]行(hsd)´行´,[2],2“行”,[4,4],8“行”,[6,6,6],18“行”,[8,8,8],32“行”,[10,10,10,10],50“行”,[12,12,12,12,12],72“行”,[14,14,14,14,14,14],98[A008292号]行(宽)“行”,[1],1´行´,[1,1],2“行”,[1,4,1],6“行”,[1,11,11,1],24“行”,[1,26,66,26,1],120“行”,[1,57,302,302,57,1],720“行”,[1,1201191,2416,1191,120,1],5040
[AX3]行(wud);另请参见:[A030495号], [A175925号]“行”,[1],1“行”,[3,3],6“行”,[8,14,8],30“行”,[27,57,57,27],168“行”,[124224384224124],1080“行”,[7251005223022301005725],7920“罗”,[5046576012186195361218657605046],65520
[AX1]行(wmd)“行”,[0],0“行”,[1,1],2“行”,[2,8,2],12“行”,[3,33,33,3],72“行”,[4104,264,104,4],480“行”,[5285151015102855],3600“行”,[672071461449671467206],30240[AX12]行(dmw)“行”,[0],0“行”,[1,1],2“行”,[4,6,2],12“行”,[18,33,18,3],72´行´,[962014040,4],480“行”,[600,1370,1125,425,75,5],3600“行”,[4320,10584,9744,4410,1050,126,6],30240[AX2]行(wsd);另请参见:[A052609型], [A030495号(n) -1]“行”,[0],0“行”,[2,2],4“行”,[7,10,7],24“行”,[26,46,46,26],144“行”,[123198318198123],960“罗”,[724948192819281928948724]7200“行”,[5045564010995171201099556405045],60480
双枚举三角形:列总和
[A008292号]科尔(hiw)“列”,[1],1“列”,[1,1],2上校,[1,4,1],6“列”,[1,11,11,1],24“列”,[1,26,66,26,1],120“科尔”,[1,57,30230257,1],720“科尔”,[1,1201191,2416,1191,120,1],5040[AX3]颜色(huw);另请参见:[A030495号], [A175925号]“列”,[1],1“列”,[3,3],6“列”,[8,14,8],30“科尔”,[27,57,57,27],168上校,[12422438224124],1080“科尔”,[7251005223022301005725],7920“科尔”,[5046576012186195361218657605046],65520
[AX4]列(hmw);另请参见:[A033312号], [A062119号]“列”,[0],0“列”,[1,1],2“列”,[5,2,5],12上校,[23,13,13,23],72“科尔”,[119,94,54,94,119],480“科尔”,[719、663、418、418,663、719],3600“科尔”,[5039492038492624384949205039],30240
[AX16]列(wmh)“列”,[0],0“列”,[1,1],2“列”,[5,2,5],12“列”,[23,10,16,23],72上校,[119,69,66,107,119],480“科尔”,[719,518,355,588,701,719],3600“科尔”,[5039,4164,2458,3751,4775,5014,5039],30240[AX17]列(wsh)“列”,[0],0“列”,[2,2],4“列”,[7,10,7],24“科尔”,[26,52,40,26],144“科尔”,[123273282159123],960上校,[724、1528、2180、1248、796、724],7200“科尔”,[504594201795011485636551705045],60480[A130534型]col(隐藏)“列”,[1],1“列”,[1,1],2“列”,[2,3,1],6“列”,[6,11,6,1],24“科尔”,[24,50,35,10,1],120“科尔”,[120,274225,85,15,1],720“科尔”,[720,1764,1624,735,175,21,1],5040[AX13]列(hud)“列”,[1],1“列”,[3,3],6“列”,[10,12,8],30“科尔”,[42,57,42,27],168“科尔”,[216320260160124],1080“科尔”,[1320209018451145795725],7920“科尔”,[9360,15624,14784,9450,6090,5166,5046],65520[A182923号]科尔(hmd)上校,[0],0“列”,[1,1],2“列”,[4,3,5],12“科尔”,[18,13,18,23],72“科尔”,[96,70,85,110,119],480“科尔”,[600,446,495,635,705,719],3600“科尔”,[4320,3276,3416,4305,4865,5019,5039],30240[AX16]列(dmh)“列”,[0],0上校,[1,1],2“列”,[5,2,5],12“列”,[23,10,16,23],72“科尔”,[119,69,66,107,119],480“科尔”,[719,518,355,588,701,719],3600“科尔”,[5039,4164,2458,3751,4775,5014,5039],30240[A111650型]科尔(hsd)“列”,[2],2上校,[4,4],8“列”,[6,6,6],18“列”,[8,8,8],32“列”,[10,10,10,10],50“列”,[12,12,12,12,12],72“列”,[14,14,14,14,14,14],98[A130534型]颜色(宽度)“列”,[1],1“列”,[1,1],2“列”,[2,3,1],6“列”,[6,11,6,1],24“科尔”,[24,50,35,10,1],120“科尔”,[120,274225,85,15,1],720“科尔”,[720,1764,1624,735,175,21,1],5040[AX13]列(wud)“列”,[1],1“列”,[3,3],6“列”,[10,12,8],30“科尔”,[42,57,42,27],168“科尔”,[216320260160124],1080上校,[1320、2090、1845、1145、795、725]、7920“科尔”,[9360,15624,14784,9450,6090,5166,5046],65520[AX14]列(wmd)“列”,[0],0“列”,[1,1],2“列”,[4,3,5],12“科尔”,[18,13,18,23],72“科尔”,[96,70,85,110,119],480“科尔”,[600,446,495,635,705,719],3600上校,[4320、3276、3416、4305、4865、5019、5039]、30240[AX4]列(dmw)“列”,[0],0“列”,[1,1],2“列”,[5,2,5],12“科尔”,[23,13,13,23],72“科尔”,[119,94,54,94,119],480“科尔”,[719、663、418、418,663、719],3600“科尔”,[5039492038492624384949205039],30240[AX15]列(wsd)“列”,[0],0“列”,[2,2],4“列”,[8,9,7],24“科尔”,[36,46,36,26],144“科尔”,[192270,225150,123],960“科尔”,[1200,1816,1620,1060,780,724],7200“科尔”,[8640,13860,13160,8715,5915,5145,5045],60480
置换树的双重枚举列表
(高度与宽度相交)[1][0 1][1 0][0 0 1][0 4 0][1 0 0][0 0 0 1][0 3 11 0][0 8 0 0][1 0 0 0][0 0 0 0 1][0 0 25 26 0][0 13 41 0 0][0 13 0 0 0][1 0 0 0 0](高度和宽度)[1][2 1][1 2][2 5 1][5 4 5][1 5 2][ 2 12 12 1][15 22 14 15][ 9 11 19 9][ 1 12 12 2][ 2 27 67 27 1][52 77 92 51 52][55 67 79 80 55][14 26 79 39 14][1 27 67 27 2](高度减去宽度)[0][1 0][0 1][1 1 0][4 0 4][0 1 1][ 1 1 1 0][14 11 3 14][ 8 0 8 8][ 0 1 1 1][ 1 1 1 1 0][51 51 26 25 51][54 41 13 54 54][13 0 13 13 13][ 0 1 1 1 1](宽度减去高度)[0][1 0][0 1][1 1 0][4 0 4][0 1 1][ 1 1 1 0][11 8 3 11][11 0 11 11][ 0 1 1 1][ 1 1 1 1 0][26 26 13 13 26][66 41 25 66 66][26 0 26 26 26][ 0 1 1 1 1](高度symmdiff宽度)[0][2 0][0 2][2 5 0][5 0 5][0 5 2][ 2 12 12 0][15 19 3 15][ 9 3 19 9][ 0 12 12 2][ 2 27 67 27 0][52 77 67 25 52][55 54 38 80 55][14 13 79 39 14][ 0 27 67 27 2](高度相交位移)[1][1 0][0 1][1 0 0][1 3 0][0 0 1][1 0 0 0][4 10 0 0][1 1 6 0][0 0 0 1][ 1 0 0 0 0][14 37 0 0 0][8 12 34 0 0][ 1 1 1 10 0][ 0 0 0 0 1](高度活接头位移)[1][1 2][2 1][2 4 2][5 4 5][3 4 1][6 12 7 2][16 15 20 15][13 18 8 9][ 7 12 7 1][24 51 36 11 2][61 64 86 61 52][70 92 55 64 55][36 62 47 13 14][25 51 36 11 1](高度减去位移)[0][0 1][1 0][0 1 1][3 1 4][1 1 0][ 0 1 1 1][10 4 14 14][ 7 7 2 8][ 1 1 1 0][ 0 1 1 1 1][37 14 51 51 51][46 42 20 54 54][12 12 12 3 13][ 1 1 1 1 0](位移减去高度)[0][0 1][1 0][1 1 2][3 0 3][1 1 0][ 5 2 5 6][11 1 10 11][ 6 6 0 6][ 1 1 1 0][23 10 16 23 24][50 13 38 49 50][35 35 1 34 35][10 10 10 0 10][1 1 1 1 0](高度symdiff位移)[2][2 2][2 2][2 2 2][2 2 2][2 2 2][2 2 2 2][2 2 2 2][2 2 2 2][2 2 2 2][2 2 2 2 2][2 2 2 2 2][2 2 2 2 2][2 2 2 2 2][2 2 2 2 2](宽度相交位移)[1][0 1][1 0][0 0 1][1 3 0][1 0 0][0 0 0 1][1 4 6 0][4 7 0 0][1 0 0 0][ 0 0 0 0 1][ 1 5 10 10 0][11 30 25 0 0][11 15 0 0][ 1 0 0 0 0](宽度活接头位移)[1][2 1][1 2][3 4 1][5 4 5][2 4 2][ 7 12 7 1][16 18 11 12][13 15 17 12][ 6 12 7 2][25 51 36 11 1][49 71 51 26 27][79 86 76 76 67][39 61 61 36 27][24 51 36 11 2](宽度减去位移)[0][1 0][0 1][1 1 0][3 1 4][0 1 1][ 1 1 1 0][10 7 5 11][ 7 4 11 11][ 0 1 1 1][ 1 1 1 1 0][25 21 16 16 26][55 36 41 66 66][15 11 26 26 26][0 1 1 1](位移减去宽度)[0][1 0][0 1][2 1 1][3 0 3][0 1 1][6 5 2 5][11 7 4 11][ 6 0 6 6][ 0 1 1 1][24 23 13 13 23][50 45 20 35 50][35 25 10 35 35][10 0 10 10 10][ 0 1 1 1 1](宽度symmdiff位移)[0][2 0][0 2][3 4 0][4 1 5][1 4 2][ 7 12 7 0][15 14 5 12][ 9 8 17 12][5 12 7 2][25 51 36 11 0][48 66 41 16 27][68 56 51 76 67][28 46 61 36 27][23 51 36 11 2]
枫叶计划
带有(linalg):readlib(symmdiff):perm2树:=进程(perm)本地树,i,next,根,分支,当前;树:=[];根:=0;分支:=[根];i:=1;下一个:=perm[i];虽然是真的while next<分支[nops(分支)]do分支:=下层(nops(分支)=NULL,分支);od;电流:=根;下一个>当前做分支:=[op(分支),next];i:=i+1;如果i>nops(perm),则树:=[op(tree),branch];RETURN(树)fi;当前:=下一个;下一个:=perm[i];od;树:=[op(tree),branch];od端:对象:=n->convert(map(perm2tree,combint[permute](n)),set):高度:=T->最大值(op(map(b->max(nops(b)),T))-1:宽度:=t->nops(t):位移:=t->nops(t[nops(t)])-1:树按高度:=(T,h)->选择(T->高度(T)=h,T):TreesByWidth:=(T,h)->选择(T->宽度(T)=h,T):TreesByDisplacement:=(T,h)->选择(T->位移(T)=h,T):DoubleEnum:=进程(objs,f,g,n,op,opt)局部M,i,j,R,C,R,k;M:=矩阵(n,n,[seq(0,i=1..n^2)]);对于i从1到n do对于j从1到ndoM[i,j]:=nops(op(f(objs,i),g(obj,j));od od;#输出:行和列和R:=序列(添加(行(M,R)[k],k=1..n),R=1..n;C:=序列(添加(列(M,r)[k],k=1..n),r=1..n);如果成员(opt,{'mat','all'}),则打印(M)fi;如果成员(opt,{'row','all'}),则打印('row’,[R],add(R,R=R))fi;如果成员(opt,{'col','all'}),则打印('col',[C],add(r,r=C))fi;NULL结尾:排列树(按高度和宽度):=(n,opt)->DoubleEnum(Objects(n),TreesByHeight,Trees ByWidth,n,`intersect`,opt):排列树按高度或宽度:=(n,opt)->DoubleEnum(Objects(n),TreesByHeight,Trees ByWidth,n,`union`,opt):排列树按高度减去宽度:=(n,opt)->DoubleEnum(Objects(n),TreesByHeight,Trees ByWidth,n,`minuse`,opt):排列树按宽度减去高度:=(n,opt)->DoubleEnum(Objects(n),TreesByWidth,Trees ByHeight,n,`minuse`,opt):排列树按宽度Symmdiff高度:=(n,opt)->DoubleEnum(对象(n),树按宽度,树按高度,n,`symmdiff`,opt):置换树(按高度和置换):=(n,opt)->DoubleEnum(Objects(n),TreesByHeight,Trees ByDisplacement,n,`intersect`,opt):排列树按高度或位移:=(n,opt)->DoubleEnum(Objects(n),TreesByHeight,Trees ByDisplacement,n,`union`,opt):排列树按高度减去位移:=(n,opt)->DoubleEnum(Objects(n),TreesByHeight,Trees ByDisplacement,n,`minuse`,opt):排列树按置换减去高度:=(n,opt)->DoubleEnum(Objects(n),TreesByDisplacement,Trees ByHeight,n,`minuse`,opt):排列树按高度Symmdiff置换:=(n,opt)->DoubleEnum(对象(n),TreesByHeight,TreesByDisplacement,n,`symdiff`,opt):按宽度和位移排列树:=(n,opt)->DoubleEnum(Objects(n),TreesByWidth,Trees ByDisplacement,n,`intersect`,opt):排列树按宽度或位移:=(n,opt)->DoubleEnum(Objects(n),TreesByWidth,Trees ByDisplacement,n,`union`,opt):排列树按宽度减去位移:=(n,opt)->DoubleEnum(Objects(n),TreesByWidth,Trees ByDisplacement,n,`minuse`,opt):排列树按置换减去宽度:=(n,opt)->DoubleEnum(Objects(n),TreesByDisplacement,Trees ByWidth,n,`minuse`,opt):置换树(按宽度)SymmdiffDisplacement:=(n,opt)->DoubleEnum(对象(n),树按宽度,树按置换,n,`symmdiff`,opt):别名(HIW=PermutationTreesByHeightAndWidth):别名(HUW=PermutationTreesByHeightOrWidth):别名(HMW=按高度最小宽度排列的变异树):别名(WMH=PermutationTreesByWidthMinusHeight):别名(WSH=PermutationTreesByWidthSymmdiffHeight):别名(HID=按高度和置换排列树):别名(HUD=排列树按高度或置换):别名(HMD=PermutationTreesByHeightMinusDisplacement):别名(DMH=PermutationTreesByDisplacementMinusHeight):别名(HSD=PermutationTreesByHeightSymmdiffDisplacement):别名(WID=PermutationTreesByWidthAndDisplacement):别名(WUD=排列树按宽度或置换):别名(WMD=PermutationTreesByWidthMinusDisplacement):别名(DMW=PermutationTreesByDisplacementMinusWidth):别名(WSD=PermutationTreesByWidthSymmdiffDisplacement):#打印选项包括“行”、“列”、“垫”和“全部”。打印:=proc(b)local n;打印(`b`):对于[$1.6]中的n,do b(n,opt)od:end:选择加入['row','col','all']do对于[HIW、HUW、HMW、WMH、WSH、HID、HUD、DMH、HMD、HSD、WID、WUD、WMD、DMW、WSD]中的枚举打印(枚举)od;