0
点赞
收藏
分享

微信扫一扫

【组合数学】Riordan Array学习笔记

目录

  • ​​参考​​
  • ​​定义​​
  • ​​例子1 二项式系数/BinomialNumber​​
  • ​​例子2 coefficients of modified Hermite polynomials.​​
  • ​​例子3​​
  • ​​彩蛋​​

参考

​​https://en.wikipedia.org/wiki/Riordan_array​​​ 维基百科
​​​https://www.muicmath.com/_media/seminar/riordan.pdf​​ 课件,比维基百科好懂

定义

【组合数学】Riordan Array学习笔记_维基百科


简单来说,就是\(pq^0\)的系数写到index=\(0\)的列,\(pq^1\)的系数写到index=\(1\)的列,\(pq^2\)的系数写到index=\(2\)的列

选定显示的方阵大小,把上三角位置的系数都置零。

例子1 二项式系数/BinomialNumber

(*这份代码适用于和、乘积,(除法?)和有理幂构成的关于x的函数*)


Clear["Global`*"]
IsXFunction = MemberQ[Variables@#, x] &;

RiordanArray[p_?IsXFunction, q_?IsXFunction, numOfRows_Integer] :=
Table[SeriesCoefficient[p*q^k, {x, 0, n}], {n, 0, numOfRows}, {k, 0,
n}] // Grid;

RiordanArray[1/(1 - x), x/(1 - x), 5]

【组合数学】Riordan Array学习笔记_函数调用_02

例子2 coefficients of modified Hermite polynomials.

如果\(f(x)\)或者\(g(x)\)中出现了Exp指数函数,你应该使用下面的函数进行修正

(*如果$f(x)$或者$g(x)$中出现了Exp指数函数,你应该使用下面的函数进行修正*)


Clear["Global`*"]
IsXFunction = MemberQ[Variables@#, x] &;

RiordanArrayWhenExpotiential[p_, q_, numOfRows_Integer] :=
Table[n!/k!*SeriesCoefficient[p*q^k, {x, 0, n}], {n, 0,
numOfRows}, {k, 0, n}] // Grid;

RiordanArrayWhenExpotiential[1, 1/(2 - Exp[x])-1, 5]
RiordanArrayWhenExpotiential[Exp[x^2/2], x, 5]

【组合数学】Riordan Array学习笔记_函数调用_03

例子3

给大家看一下这位老哥写的程序,好像有点问题
代码原理?很简单,就是数学计算,涉及到了线性卷积,Exp的情形就是对每一项进行n!/k!的修正
代码风格几乎就是效率很高的那种C代码
(* Jean-François Alcover, Jul 16 2019, after Sage program *)

入参exp是True的话就是Expotiential的情形,入参exp是False就是Ordinary的情形。

RiordanArray[d_, h_, n_] := RiordanArray[d, h, n, False];
RiordanArray[d_Function | d_Symbol, h_Function | h_Symbol, n_,
exp_: (True | False)] := Module[{M, td, th, k, m}, M[_, _] = 0;
td = PadRight[CoefficientList[d[x] + O[x]^n, x], n];
th = PadRight[CoefficientList[h[x] + O[x]^n, x], n];
For[k = 0, k <= n - 1, k++, M[k, 0] = td[[k + 1]]];
For[k = 1, k <= n - 1, k++,
For[m = k, m <= n - 1, m++,
M[m, k] = Sum[M[j, k - 1]*th[[m - j + 1]], {j, k - 1, m <del>- 1</del>}]]];
If[exp, u = 1;
For[k = 1, k <= n - 1, k++, u *= k;
For[m = 0, m <= k, m++, j = If[m == 0, u, j/m];
M[k, m] *= j]]];
Table[M[m, k], {m, 0, n - 1}, {k, 0, m}]];

修改后的正确版本如下

RiordanArray[d_, h_, n_] := RiordanArray[d, h, n, False];

RiordanArray[d_Function | d_Symbol, h_Function | h_Symbol, n_,
exp_: (True | False)] := Module[{M, td, th, k, m}, M[_, _] = 0;
td = PadRight[CoefficientList[d[x] + O[x]^n, x], n];
th = PadRight[CoefficientList[h[x] + O[x]^n, x], n];
For[k = 0, k <= n - 1, k++, M[k, 0] = td[[k + 1]]];
For[k = 1, k <= n - 1, k++,
For[m = 0, m <= n - 1, m++,
M[m, k] = Sum[M[j, k - 1]*th[[m - j + 1]], {j, 0, m}]]];
If[exp, u = 1;
For[k = 1, k <= n - 1, k++, u *= k;
For[m = 0, m <= k, m++, j = If[m == 0, u, j/m];
M[k, m] *= j]]];
Table[M[m, k], {m, 0, n - 1}, {k, 0, m}]];

RiordanArray[1 &, 1/(2 - Exp[#]) &, 10,
True] // Grid (*Jean-François Alcover,Jul 16 2019,after Sage \
program*)

彩蛋

逛OEIS的时候发现有个​​序列​​标题错了,我已经反馈了

【组合数学】Riordan Array学习笔记_函数调用_04

谁大晚上没事干和OEIS老哥激情对线?哦是我那没事了

我再也不想在OEIS上趟浑水了,我连一个词条的author都不是,我关心这屁事。冷门词条错误给5~10年后的萌新来发现吧

后续:这位老哥坚持是自己函数调用的入参写错了,,,执迷不悟

【组合数学】Riordan Array学习笔记_维基百科_05



举报

相关推荐

0 条评论