官方给出的程序包使用指南和一些示例

http://reference.wolfram.com/language/Combinatorica/tutorial/Combinatorica.html

引论

Mathematica的Combinatorica`是官方提供的用于处理组合数学问题的一个程序包。涉及到的主题包括但不限于:分拆,图论等等。

分拆可以看我的这篇文章

在线的Combinatorica`程序包文档可以看这个

在线的Combinatorica/guide/PartitionsAndCompositions可以看这个

步骤

这里使用Mathematica 12.0进行演示

0x00 导入程序包

  1. Needs[ "Combinatorica`"]

如果报Warning了不管它,可以继续使用

之后可以?Combinatorica`*查看包里的内容及用法

下面混用程序包里的函数和mma12.0自带的函数进行演示

0x01 Integer Partitions

全部方案

  1. Partitions[5](*全部方案*)
  2. IntegerPartitions[5](*全部方案,和上面的几乎一样*)

和数被限制

  1. Partitions[5, 3](*和数最大是3,逆字典序陈列出来*)
  2. IntegerPartitions[10, All, {2, 3, 4}](*和数只能是234*)

和数数目被限制

  1. IntegerPartitions[5, 3](*最多3部分*)
  2. IntegerPartitions[5, {3}](*刚好3部分*)
  3. IntegerPartitions[5, {2, 4}](*最少2部分,最多4部分*)
  4. Flatten[Table[IntegerPartitions[10, {k}] , {k, {2, 4}}], 1] (*和数个数只能是24*)

由一种Partition方案绘制FerrersDiagram

  1. FerrersDiagram[Partitions[10] [[18]]] (*参数换成 {5, 2, 1, 1, 1} 也行*)

FerrersDiagram的转置

  1. FerrersDiagram@TransposePartition[Partitions[10][[18]]]

Ferrers图按照规则填上合适的数就成为了YoungTableau(这里的Tableau是转置过的,不知道怎么转过来)

  1. TableForm[Tableaux[{3, 1}], TableAlignments -> {Right, Top}]

0x02 Integer Compositions

全部方案

  1. IntegerCompositions[n_] :=
  2. Flatten[Table[
  3. ConstantArray[1, k] + # & /@ Compositions[n - k, k], {k, 1, n}],
  4. 1] (*全部方案,基于对和数可为0Composition改造得到*)
  5. IntegerCompositions[n_] :=
  6. Flatten[Table[Permutations[Partitions[n][[k]]], {k, 1, len}],
  7. 1] /. {len -> Length@Partitions[n]}
  8. (*全部方案,由Partition的排列生成*)

和数受限制

  1. len = Length@Partitions[5, 3];
  2. Flatten[ Table[Permutations[Partitions[5, 3][[k]]], {k, 1, len}] , 1]
  3. (*和数最大是3*)
  4. len = Length@IntegerPartitions[10, All, {2, 3, 4}];
  5. Flatten[Table[
  6. Permutations[IntegerPartitions[10, All, {2, 3, 4}][[k]]], {k, 1,
  7. len}], 1]
  8. (*和数只能是234*)

和数数目受限制

  1. IntegerCompositions[n_, k_] :=
  2. ConstantArray[1, 3] + # & /@ Compositions[n - k, k](*正好3部分,和数都是正整数*)
  3. NumberOfCompositions[10, 3](*正好3部分的方案数目*)
  4. Length@Compositions[10, 3](*正好3部分的方案数目,和上面几乎一样*)
  5. Flatten[Table[Compositions[10, k], {k, 1, 5}], 1] (*最多5部分的全部方案,这个我没找到现成的函数*)
  6. Flatten[Table[Compositions[10, k], {k, {2, 3, 5}}], 1] (*和数个数只能是2,3,5的全部方案,这个我没找到现成的函数*)

和数数目受限制而且和数大小受限制

  1. (*nk个和数且和数在[1,r]的Compostition的方案个数*)
  2. nCompokSummandsEachRange1r[n_, k_, r_] :=
  3. Module[{sum = 0}, If[r <= 0 || k <= 0, 0,
  4. Sum[(-1)^j*Binomial[k, j]*Binomial[n - r*j - 1, k - 1], {j, 0,
  5. Min[k, Floor[(n - k)/r]]}]
  6. ]
  7. ]

0x03 partitions of a set

sp的正传

分成若干个小的分区

准确的说,是partitions of a set of n distinguishable elements

中文的话?集合分拆?

虽然但是,我真的很想写这个,

会涉及到第二类斯特林数,Bell数

  1. (*set partition*)
  2. SetPartitions[{a, b, c}] (*无限制*)
  3. RGFToSetPartition[#] & /@ RGFs[5] (*基于RGF生成,和上面给出的结果一致,顺序可能不同*)
  4. SetPartitionListViaRGF[5] (*和上面的完全一样,又封装了一遍*)
  5. KSetPartitions[3, 2] (*表示{1,2,3}集合分拆,限定为2部分*)
  6. KSetPartitions[{a,b,c}, 2] (*限定为2部分*)

数学一点的话,当然要谈到RGF和SetPartitions的bijection

图片来自这篇论文 https://arxiv.org/pdf/1605.04807.pdf

或者你看东田纳西州立大学的这个slide



映射关系如下,这是一个bijection

  1. (*RGF相关*)
  2. RGFs[5] (*给出所有长度为5RGF序列*),
  3. SetPartitionToRGF[#] & /@ SetPartitions[5] (*基于sp生成,和上面给出的结果一致,顺序可能不同*)
  4. RandomRGF[5] (*相当于从上面的结果里随机选一个*)
  5. RGFToSetPartition[{1, 2, 1, 2, 1}, {a, b, c, d, e}] (*RGFSetPartition的映射*)
  6. RGFToSetPartition[{1, 2, 1, 2, 1}] (*第二个参数缺省的话会进行联想[n]*)
  7. RGFToSetPartition[{1, 2, 1, 2, 1},{a,b}] (*非法输入不会计算结果*)
  8. (*有rank的函数基本上不用看了,你会写[[]]的话*)
  9. RankSetPartition[#] & /@ SetPartitions[4] (*这个结果是Range[0, 14]*)

sp也可以理解成一个SYT吗?

SYT的定义看这里

sp的番外

给自己挖坑,有空会来填的

分成若干个非空线性序列

无符号拉赫数(也是无符号第三类斯特林数)计算的是将含有\(n\)个元素的集合拆分为\(k\)个非空线性有序子集的方法数目。

  1. SetPartitions[3]
  2. Table[Map[Permutations, %6[[i]]] // Tuples, {i, 1, Length@%6}] // MatrixForm
  3. (*或者这么写?*)
  4. SetPartitionsToSequences[n_]:=Table[Map[Permutations, SetPartitions[n][[i]]] // Tuples, {i, 1, BellB[n]}] // MatrixForm
分成若干个圆排列

这个我也不知道该分到哪一类去,,,和SetPartition和Permutation都有点关系

无符号第一类斯特林数计算的是将含有\(n\)个元素的集合拆分为\(k\)个非空圆排列的方法数目。

  1. ToCycles[#] & /@ Permutations[5] // MatrixForm (*基于Permutation圆分解生成全部方案*)
  2. Select[ToCycles[#] & /@ Permutations[5], Length[#] == 2 &] (*S1(5,2)的全部方案*)

0x04 Graph

这个坑开了就写不完的啊,我拒绝记录

  1. ShowGraph /@ % (*当你生成了List<Graph>的东西,想要可视化*)

0x05 Permutations

可以看我的排列研究系列文章

这个感觉也写不完

  1. ToCycles[{2, 1, 3}] (*对一个排列做圆分解*)
  2. FromCycles@% (*由圆分解得到一个排列*)
  3. ToInversionVector[{5, 2, 3, 4, 1}]
  4. ## 结果是{4, 1, 1, 1},表明有1左侧有4个数比1大,4左侧有有1个数比4大...
  5. InversePermutation[{2, 3, 1, 4}] (*对PermutationInverse(圆分解后每个圆反转)*)
  6. Involutions[5] (*Involution是说inverse(圆分解后每个圆反转)和自己相同的那些Permutation*)

Logs

upd 2021-03-30 完成初稿

upd 2021-04-03 以后求Composition或者Partition的全部解还是FrobeniusSolve 吧,人生苦短

note 2021-04-08 发现Combinatorica包的Compositions[n, k]函数会把和数为0的情况给了出来,于是选择了其他方法来实现无限制的Compostions

note 2021-06-26 发现有些东西比如生成组合,生成排列,生成笛卡尔积经常用到,我放在最后了

note 2021-11-08

吐个槽,mma重复造轮子是出了名的





另一个有意思的点是,你可以试着输入NumberOf,看会联想出来哪些东西



upd 2021-11-08 想写的东西过多,甚至题目改成了 Mathematica的Combinatorica`程序包使用笔记

附录A 生成组合,排列,笛卡尔积等等

  1. FoldList[Plus, 0, {a, b, c, d}] (*前缀和*)
  2. Total[MapIndexed[#1 x^First[#2] &, {a, b, c, d, e}]] (*系数列表转多项式*)
  3. MapIndexed[Labeled, {x^2, x + y, y^2, y^3}] (*相当于zipWithIndex*)
  4. z^3/(1 - z^2) // Apart (*Apart把一个有理表达式改写成具有最小分母的项的和. *)
  5. z^3/(1 - z^2) // Apart // Together (*Together将各项合并公分母,并消去结果中的因子.Together和Apart互为逆运算*)
  6. (*Horner多项式形式*)
  7. Fold[x #1 + #2 &, 0, {a, b, c, d, e}] (*创建一个嵌套的Horner多项式形式*)
  8. HornerForm[Reverse[{a, b, c, d, e}].x^Range[0, 4], x]
  9. Fold[1/(#2 + #1) &, x, Reverse[{a, b, c, d}]] (*形成连分式*)
  10. (*数码列表转10进制数*)
  11. StringJoin[ToString@# & /@ {1, 2, 3, 4}] // ToExpression
  12. Fold[10 #1 + #2 &, 0, {4, 5, 1, 6, 7, 8}]
  13. Fold[#2 - #1 &, 0, Reverse[{a, b, c, d, e}]] (*形成一个交错总和*)
  14. Fold[#2[#1] &, x, {a, b, c, d}] (*对xa映射后,结果做b映射,结果做c映射,结果做d映射*)
  15. PermutationProduct[I] (*你们要的恒等函数*)
  16. Map[#^2 &, {1, 2, 3}] (*Map操作几乎必会好吧*)
  17. {0, 1, 2, 3} // Map[#^2 + 1 &, #] &
  18. func[x_] := If[ListQ[x], x, "a" <> ToString[x] <> "b"];Map[func[#] &, {{1, fa}, {1, fa, "cd"}, 1, "fs"}]
  19. (*Map操作几乎必会好吧*)
  20. Table[RotateLeft[{2, 3, 4, 5}, -n], {n, 0, 3}] (*生成一个ListRotate变换后的序列*)
  21. Subsets[{1, 2, 2}] (*生成幂集*)
  22. Permutations[{a, b, c, d}, {2}](*生成排列*)
  23. Select[Permutations[{a, b, c, d}], Signature[#] == 1 &] (*生成逆序对数为偶的所有排列,4!/2=12个*)
  24. Flatten[Outer[List, {a, b}, {x, y, z}, {1, 2, 3}], 2](*生成全部笛卡尔积*)
  25. Tuples[{{a, b}, {1, 2, 3, 4}, {x}}] (*生成全部笛卡尔积*)
  26. Tuples[{0, 1}, 3] (*生成全部的01三元组*)
  27. Subsets[{a, a, b, b}, {2}](*生成大小为2的全部子集,共6个*)
  28. Subsets[{a, a, b, b}, {2}] // Union (*生成本质不同(规则是放在置换群下是否相同)的子集,共3个。i.e.可重复元素的组合*)
  29. Boole[Outer[Greater, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}]] // MatrixForm (*生成5\times 5的下三角矩阵*)
  30. MatrixForm[m = Array[Subscript[a, ##] &, {3, 3}]] (*优雅地写一个形式3*3矩阵*)
  31. jordanMatrix[\[Lambda]_, n_] := DiagonalMatrix[Table[\[Lambda], {n}]] + DiagonalMatrix[Table[1, {n - 1}], 1](*优雅地写一个Jordan矩阵*)
  32. Join @@ Table[#*n & /@ ConstantArray[1, 4], {n, 1, 13}](*生成52张牌的deck,无花色*)
  33. Flatten[Outer[List, {"spade", "heart", "diamond", "club"}, Range[1, 10]], 1] (*生成40张牌的deck,有花色*)
  34. Select[Subsets[Range[1, 10], {3}], Mod[Total[#], 10] == 0 &] (*1~10里选3张牌和的个位是0的本质不同的全部组合方案*)
  35. Sort[{{a, 2}, {c, 1}, {d, 3}}, #1[[2]] < #2[[2]] &] (*比较每个元素的第二部分,以进行排序*)
  36. ReverseSort[{{a, 2}, {c, 1}, {d, 3}}, #1[[2]] < #2[[2]] &] (*逆向排序的一种思路是直接改函数名为ReverseSort*)
  37. Cases[{{3, 2, 1}, {1, 2, 5}, {3, 1, 2}}, {OrderlessPatternSequence[1, 2, 3]}] (*选出在置换群意义下和123相同的list*)
  38. (*-----生成所有无牛牌型-----*)
  39. (*生成40张牌的deck,无花色*)
  40. set = Join @@
  41. Table[#*n & /@ ConstantArray[1, 4], {n, 1, 10}]
  42. (*所有5张牌的牌型*)
  43. subset = Subsets[set, {5}]
  44. (*3张牌和的个位是0的本质不同的全部组合方案*)
  45. cow = Select[Subsets[set, {3}], Mod[Total[#], 10] == 0 &] //
  46. Union
  47. (*有牛牌型的Pattern*)
  48. invalidPattern = {Alternatives @@
  49. Apply[PatternSequence[___, #1, ___, #2, ___, #3, ___] &, cow, {1}]}
  50. (*从全部方案中去除掉有牛的方案,剩下的就是无牛的*)
  51. DeleteCases[subset, invalidPattern]

Mathematica的Combinatorica`程序包使用笔记的更多相关文章

  1. Oracle学习笔记十四 内置程序包

    扩展数据库的功能 为 PL/SQL 提供对 SQL 功能的访问 用户 SYS 拥有所有程序包 是公有同义词 可以由任何用户访问 一些内置程序包 程序包名称 说明 STANDARD和DBMS_STAND ...

  2. Oracle学习笔记十二 子程序(存储过程、自定函数)和程序包

    子程序 子程序:命名的 PL/SQL 块,编译并存储在数据库中.   子程序的各个部分: 1.声明部分 2.可执行部分 3.异常处理部分(可选) 子程序的分类: 1.过程 - 执行某些操作 2.函数 ...

  3. PL/SQL之DBMS_SQL程序包使用(1)(学习笔记)

    dbms_sql程序包dbms_sql程序包是系统提供给我们的另一种使用动态SQL的方法:使用DBMS_SQL包实现动态的SQL的步骤如下:1.将要执行的SQL语句或者一个语句放到一个字符串变量中2. ...

  4. ROS 笔记 程序包/节点/topic

    官方教程: wiki.ros.org/cn/ROS/tutorials 程序包打创建于编译 创建程序包 在工作空间的src底下,输入如下命令: $ catkin_create_pkg 要创建的包名 依 ...

  5. oracle学习笔记(二十一) 程序包

    程序包 之前我们调用的dbms_output.put_line(''),dbms_output就是一个程序包 程序包创建语法 1. 声明程序包 --声明程序包中的过程,函数,自定义的类型 --程序包里 ...

  6. Linux程序包管理之rpm

    rpm简介 rpm( Red Hat Package Manager )是一个开放的软件包管理系统.它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准. rp ...

  7. 用命令行工具创建 NuGet 程序包

    NuGet.exe 下载地址 本文翻译自: https://docs.nuget.org/Create/Creating-and-Publishing-a-Package https://docs.n ...

  8. Linux程序包管理之yum及源代码安装

    第十六章.Linux程序包管理之yum及源代码安装 目录 yum介绍 yum配置文件 yum的repo配置文件中可用的变量 yum命令的使用 使用光盘作为本地yum仓库 如何创建yum仓库 编译安装的 ...

  9. Linux程序包管理.md

    rpm 简介 RPM包管理员(简称RPM,全称为The RPM Package Manager)是在Linux下广泛使用的软件包管理器.RPM此名词可能是指.rpm的文件格式的软件包,也可能是指其本身 ...

  10. 这台计算机上缺少此项目引用的 NuGet 程序包-缺少的文件是 ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props

    异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html 协助开发里面总有几个是极简爱好者,但是呢删了不该删的就会影响项目开发,下面看下完 ...

随机推荐

  1. 异步Udp监听关闭 出现异常,访问已释放的资源或者其他错误的解决方法

    在开发异步Udp程序的过程中,通常在关闭UDP的时候回遇到诸如socket 访问已释放的资源之类的异常,如下简单操作下: 1 Udp的监听 2 this.serverSocket = new Sock ...

  2. 「SOL」序列 (LOJ/NOI2019)

    准备写新博客的时候发现自己草稿箱里还有一篇咕了十几天的题解 思路挂在了费用流之前-- 题面 > Link LOJ #3158 解析 这道题的本质是一个二分图带权匹配的问题,一个经典的做法是直接做 ...

  3. node中get和post接口

    接口传参 使用ajax请求向服务器接口传参,按http协议的约定,每个请求都有三个部分: 请求行: 保存了请求方式,地址,可以以查询字符串的格式附加一部分数据. 请求头:它可以附加很多信息,其中con ...

  4. qt中的一些对话框(个人备忘录)

    一.标准对话框 1.对于颜色对话框 void MyWidget::on_pushButton_clicked() { QColorDialog dialog(Qt::red,this); dialog ...

  5. [jmeter的使用]jmeter上传文件接口的写法

    1.类型和参数名称,依据接口/抓的包决定 2.必须选择java否则报错 3.http header也要写

  6. [CQOI2014]通配符匹配 题解

    第一眼:什么鬼东西ヾ(。`Д´。) 第二眼:显然,这道题要分段处理 类似[TJOI2018]碱基序列\ (建议做一做也是Hash+DP)\ 那你怎么第一眼没看出来 Hash处理+DP==AC 直接上代 ...

  7. 如何配置php.ini才能让PHP性能最大优化

    用于生产环境中的PHP需要对其进行优化,可以让PHP自身发挥更好的性能,除了写好PHP代码,还要配置好php.ini.本文从内存.文件上传.会话缓冲输出.真实路径缓存这几个方面讲解php.ini的配置 ...

  8. 跨域请求 jQuery的ajax jsonp的使用

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  9. CF1430

    CF1430 那个博客搭好遥遥无期. A: 看代码. #include<bits/stdc++.h> using namespace std; int main() { int t;sca ...

  10. scroll-view 横向滚动无效

    scroll-view的内层view元素需要: display: inline-block scroll-view的外层元素需要: white-space: nowrap 使得内部组件不换行.