\\ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\\具有源和汇的有向图。\\作者:安德鲁·霍罗伊德,2022年1月\\更改历史记录:\\2023年3月:为A361582增加了额外功能。。A361590。\\ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\\如果打算计算几个以上的项,那么就给PARI更多的内存!\\这可以用“default”完成。例如:\\默认值(parisizemax,10^9)\\这是与有向图相关的脚本序列中的第三个脚本。\\非循环有向图见A122078\\强连通有向图见A350489。\\该脚本主要建立在A350489的基础上,增加了\\用于操作存储为向量的循环索引序列的新函数。\\更容易理解(和更完整)的周期索引实现\\使用PARI幂级数的系列可在A339645中找到。\\有关特殊包含-排除的解释,请参阅以下文件\\此处应用的原理以及一些公式:\\R.W.Robinson,带强分量限制的计数有向图,\\组合数学与图论’95(T.-H.Ku编辑),《世界科学》,新加坡(1995),343-354。\\连接两个排序的小向量,保持顺序。\\专门用于合并两个分区。\\例如:合并([1,1,4],[3,6])=>[1,1,3,4,6]合并(p1,p2)={my(v=向量小(#p1+#p2),i=1,j=1,k=1);而(i<=#p1&&j<=#p2,如果(p1[i]<=p2[j],v[k]=p1[i;i++,v[k]=p2[j;j++);k++);而(i<=#p1,v[k]=p1[i];i++;k++);而(j<=#p2,v[k]=p2[j];j++;k++);v;}\\用小向量计算p的p*m。(PARI仅对正则向量进行本机操作)规模V小(p,m)={向量小(#p,i,p[i]*m);}\\创建要进行排名的分区映射。\\分区的等级是它在分区的生成顺序中出现的顺序。\\这用于支持按分区索引的向量。构建分区索引(n)={我的(M=Map(),ix=1);对于部分(p=n,映射(M,p,ix);ix++);M;}\\给出特定类型的排列数,其中该类型是分区。置换计数(v)={my(m=1,s=0,k=0,t);对于(i=1,#v,t=v[i];k=如果(i>1&&t=v[i-1],k+1,1);m*=t*k;s+=t);s!/m}\\用于构造各种图的循环索引序列的函数。\\参数v是(循环类型的)分区\\参数yf用于在需要时捕获边缘数据。数字边缘(v,yf)={prod(i=2,#v,prod(j=1,i-1,my(g=gcd(v[i],v[j]));yf(v[i]*v[j]/g)^(2*g))有循环边的数字(v,yf)={prod(i=2,#v,prod(j=1,i-1,my(g=gcd(v[i],v[j]));yf(v[i]*v[j]/g)^(2*g)))*prod(i=1,#v,yf(v[i])^v[i]}定向图形边(v,yf)={prod(i=2,#v,prod(j=1,i-1,my(g=gcd(v[i],v[j]));yf(v[i]*v[j]/g)^g))*prod(i=1,#v,my,c=v[i]);yv(c)^((c-1)\2))}\\可以将上面的其中一个传递给此函数,以实际创建周期索引序列。\\循环指数序列表示为向量向量。图形CIData(n,edgeFunc,yf=e->2)={my(结果=向量(n+1));对于(n=0,n,my(v=向量(numbpart(n)),xi=0);部分(p=n,xi++;v[xi]=permcount(p)*edgeFunc(p,yf););结果[1+n]=v;);结果;}\\这是InvGgf的未标记等价物(1/Ggf(graphEgfSeries))\\计算z,使z X X=1。\\这是它自己的反义词。这是求强图个数的核心算法。\\与A122078中给出的“DagCycleIndexData”函数进行比较。InvGgfCIData(块,yf=e->2)={my(n=#blocks-1,results=向量(n+1));结果[1]=[1];对于(n=1,n,my(v=向量(numbpart(n)),pm=建筑分区索引(n);对于(i=1,n,my(j=n-i,uj=结果[j+1],ui=块[i+1],b=二项式(n,i),Q=向量(i),xj=0);对于零件(pj=j,xj++;对于(s=1,#Q,Q[s]=prod(t=1,#pj,my(g=gcd(s,pj[t]));yf(s*pj[t]/g)^g));我的(xi=0);对于部分(pi=i,xi++;my(col=地图(pm,Merge(pi,pj));v[col]-=uj[xj]*b*ui[xi]*prod(t=1,#pi,Q[pi[t]]);); \\ 圆周率);\\第页);\\结果[n+1]=v;); \\ n个结果;}\\计算lhs X rhs。\\这里X是一种特殊产品。\\(计算两个图之间连接弧形成的图的数量)多重GgfCIData(lhs,rhs,yf=e->2)={my(n=min(#lhs,#rhs)-1,结果=向量(n+1));对于(n=0,n,my(v=向量(numbpart(n)),pm=建筑分区索引(n);对于(i=0,n,my(j=n-i,uj=rhs[j+1],ui=lhs[i+1],b=二项式(n,i),Q=向量(i),xj=0);对于零件(pj=j,xj++;对于(s=1,#Q,Q[s]=prod(t=1,#pj,my(g=gcd(s,pj[t]));yf(s*pj[t]/g)^g);我的(xi=0);对于部分(pi=i,xi++;my(col=地图(pm,Merge(pi,pj));v[col]+=uj[xj]*b*ui[xi]*prod(t=1,#pi,Q[pi[t]]);); \\ 圆周率); \\ 第页); \\ 结果[n+1]=v;); \\ n个结果;}\\计算lhs*rhs。\\这是常规产品。多CIData(lhs,rhs)={my(n=min(#lhs,#rhs)-1,结果=向量(n+1));对于(n=0,n,my(v=向量(numpart(n)),pm=构建分区索引(n));对于(i=0,n,my(j=n-i,uj=rhs[j+1],ui=lhs[i+1],b=二项式(n,i),Q=向量(i),xj=0);对于零件(pj=j,xj++;我的(xi=0);对于部分(pi=i,xi++;my(col=地图(pm,Merge(pi,pj));v[col]+=uj[xj]*b*ui[xi];);\\圆周率); \\ 第页); \\ 结果[n+1]=v;); \\ n个结果;}\\计算x*输入ShiftCI数据(输入)={my(n=输入,结果=向量(n+1));结果[1]=[0];对于(n=1,n,my(v=向量(numbpart(n)),pm=构建分区索引(n),ui=输入[n],xi=0);对于部分(pi=n-1,xi++;my(col=地图(pm,Vecsmall(concat([1],Vec(pi))));v[col]=n*ui[xi];); \\ 圆周率结果[n+1]=v;);结果;}\\指向-(参见A339645中的sPoint函数)PointCIData(输入)={my(n=#input-1,results=vector(n+1));对于(n=0,n,my(v=输入[1+n],xi=0);对于部分(pi=n,xi++;v[xi]*=#选择(t->t==1,Vec(pi));); \\ 圆周率结果[n+1]=v;); \\ n个结果;}\\计算幂级数意义下的对数(输入)。PrimLogCIData(输入)={my(n=#input-1,results=vector(n+1));结果[1]=[0];对于(n=1,n,my(v=输入[1+n],pm=构建分区索引(n));对于(i=1,n-1,my(j=n-i,uj=结果[j+1],ui=输入[i+1],b=二项式(n-1,i),xj=0);对于部分(pj=j,xj++;my(xi=0);对于部分(pi=i,xi++;my(col=地图(pm,Merge(pi,pj));v[col]-=uj[xj]*b*ui[xi];); \\ 圆周率); \\ 第页); \\ 结果[n+1]=v;); \\ n个结果;}\\计算循环指数(组合)意义上的对数(输入)。(参见A339645中的sLog功能)LogCIData(输入)={my(n=#input-1,results=vector(n+1),lg=PrimLogCIData(输入),vars=variables(输入));结果[1]=[0];对于(n=1,n,my(v=向量(numbpart(n)),pm=建筑分区索引(n);fordiv(n,d,my(i=n/d,r=moebius(d)*(n!/i!)/d,ui=lg[1+i],xi=0,vsub=向量(#vars,t,vars[t]^d));对于部分(pi=n/d,xi++;my(col=地图(pm,ScaleVSmall(pi,d));v[col]+=r*substvec(ui[xi],vars,vsub);););结果[n+1]=v;); 结果;}\\计算幂级数意义下的exp(输入)。PrimExpCIData(输入)={my(n=#input-1,results=vector(n+1));结果[1]=[1];对于(n=1,n,my(v=输入[1+n],pm=构建分区索引(n));对于(i=1,n-1,my(j=n-i,uj=结果[j+1],ui=输入[i+1],b=二项式(n-1,i-1),xj=0);对于零件(pj=j,xj++;我的(xi=0);对于部分(pi=i,xi++;my(col=地图(pm,Merge(pi,pj));v[col]+=uj[xj]*b*ui[xi];); \\ 圆周率);\\第页); \\ 结果[n+1]=v;); \\ n个结果;}\\计算周期指数(组合)意义上的exp(输入)。(见A339645中的sExp函数)ExpCIData(输入)={my(n=#input-1,results=向量(n+1),vars=变量(input));结果[1]=[1];对于(n=1,n,my(v=向量(numbpart(n)),pm=建筑分区索引(n);fordiv(n,d,my(i=n/d,r=(n!/i!)/d,ui=input[1+i],xi=0,vsub=vector(#vars,t,vars[t]^d));对于部分(pi=n/d,xi++;my(col=地图(pm,ScaleVSmall(pi,d));v[col]+=r*substvec(ui[xi],vars,vsub);););结果[n+1]=v;); PrimExpCIData(结果);}\\帮助将存储为向量向量的循环索引序列转换为o.g.f.,以计数未标记的对象。未标记Ogf(数据)={总和(n=0,#data-1,vecsum(data[n+1])*x^n/n!,O(x^#数据));}\\帮助将存储为向量向量的循环索引序列转换为例如计数标记对象的循环索引。标记的Egf(数据)={总和(n=0,#data-1,my(t=data[n+1]);t[#t]*x^n,O(x^#数据));}\\逆Euler和Euler变换\\这些多元版本适用于幂级数。主变量必须是x。InvEulerMTS(p)={my(n=serprec(p,x)-1,q=log(p),vars=variables(p));总和(i=1,n,moebius(i)*substvec(q+O(x*x^(n\i))),vars,apply(v->v^i,vars))/i)}EulerMTS(p)={my(n=serprec(p,x)-1,vars=变量(p));exp(sum(i=1,n,substvec(p+O(x*x^(n\i)),vars,apply(v->v^i,vars))/i)}\\按顶点三角形格式化圆弧的ogf。弧三角形(p,n=serprec(p,y)-1)={向量(n+1,i,Vec(polcoef(p,i-1,y)/x+O(x^i),-i))}\\应用程序\\强大的图形强(图,yf=e->2)={-InvEulerMTS(无标签Ogf(InvGgfCIData(图形,yf)));}\\强连通图的其他序列在A350489脚本中。\\这是为了进行比较和交叉检查。A035512seq(n)={Vec(1+强(图CIData(n,DigraphEdges))}A350489seq(n)={Vec(1+强(图CIData(n,定向图边,e->3))}A350753行(n)={my(yf=e->1+'y^e+O('y^n));ArcTriangle(强(图CIData(n,DigraphEdges,yf),yf\\根强图根强连接(图,yf=e->2)={未标记Ogf(PointCIData(-LogCIData(InvGgfCIData(graphs,yf)))}A049387seq(n)={Vec(根强连接(图CIData(n,DigraphEdges))}\\初始终接。\\实施Eqn。鲁滨逊20岁。\\公式:S-S^2+exp(S)*((S*exp(-S))X(S*xp(-S))X D)。InitFinally(图,yf=e->2)={my(tmp1=InvGgfCIData(图形,yf)\\exp(-S),tmp2=-日志CIData(tmp1)\\S,tmp3=多个CIData(tmp2,tmp1)\\S*exp(-S),tmp4=MultGgfCIData(图形,MultGgfCIData(tmp3,tmp3、yf),yf),Sogf=未标记Ogf(tmp2));Sogf-Sogf^2+(EulerMTS(Sogf))*未标记Ogf(tmp4);}A049531seq(n)={Vec(InitFinally(GraphCIData(n,DigraphEdges))}A057278triang(n)={[Vecrev(p)|p<-Vec(InitFinally(GraphCIData(n,DigraphEdges,e->1+'y^e),e->1+'y ^e))]}A350906seq(n)={my(yf=e->1+'y^e+O('y^n));Vec(vecsum(Vec(InitFinally(图形CIData(n,DigraphEdges,yf),yf,))}\\最初连接(或最终连接)\\公式:D X S*exp(-S)。最初(图,yf=e->2)={my(tmp1=InvGgfCIData(图形,yf)\\exp(-S),tmp2=-日志CIData(tmp1)\\S,tmp3=多个GgfCIData(图形,多个CIData(tmp2,tmp1),yf)\\D X(S*exp(-S)));未标记Ogf(tmp3);}A051421seq(n)={Vec(初始(GraphCIData(n,DigraphEdges)))}A057277triang(n)={[Vecrev(p)|p<-Vec(初始(GraphCIData(n,DigraphEdges,e->1+'y^e),e->1+'y ^e))]}A350907seq(n)={my(yf=e->1+'y^e+O('y^n));Vec(vecsum(Vec(初始(图形CIData(n,DigraphEdges,yf),yf,))}\\具有全局源和汇(最初连接到单个顶点)\\实施Eqn。罗宾逊21岁。\\公式:x-x^2+exp(S)*((x*exp(-S))x(x*xp(-S))x D)。InitFinallyV(图形,yf=e->2)={my(tmp1=InvGgfCIData(图形,yf)\\exp(-S),tmp2=移位CIData(tmp1)\\x*exp(-S),tmp3=MultGgfCIData(图形,MultGgfCIData(tmp2,tmp2、yf),yf),Sogf=-InvEulerMTS(未标记Ogf(tmp1)));x-x^2+EulerMTS(Sogf)*未标记Ogf(tmp3);}A350794seq(n)={Vec(初始最终V(图形CIData(n,DigraphEdges))}A350795triang(n)={[Vecrev(p)|p<-Vec(InitFinallyV(图形CIData(n,DigraphEdges,e->1+y^e),e->1+y^e))]}A350796seq(n)={my(yf=e->1+'y^e+O('y^n));Vec(vecsum(Vec(InitFinallyV(图形CIData(n,DigraphEdges,yf),yf,))}\\具有全局源(或汇)\\公式:D X X*exp(-S)初始V(图,yf=e->2)={my(tmp1=InvGgfCIData(图形,yf)\\exp(-S),tmp2=移位CIData(tmp1)\\x*exp(-S),tmp3=多重GgfCIData(图形,tmp2,yf)\\D X X*exp(-S));Vec(未标记Ogf(tmp3));}A350360seq(n)={Vec(初始V(图形CIData(n,DigraphEdges))}A350797triang(n)={[Vecrev(p)|p<-Vec(初始V(图形CIData(n,DigraphEdges,e->1+y^e),e->1+y^e))]}A350798seq(n)={my(yf=e->1+'y^e+O('y^n));Vec(vecsum(Vec(初始V(图形CIData(n,DigraphEdges,yf),yf,))}\\非循环图的另一种实现\\公式:XRecip(exp(-x)),其中XRecipXz=1。无环记录仪(n,yf=e->2)={my(pts=向量(n+1,n,向量(numbpart(n-1)));pts[2]=[-1];未标记Ogf(InvGgfCIData(ExpCIData(pts),yf));}A003087seq(n)={Vec(无环图(n))}A350447triang(n)={[Vecrev(p)|p<-Vec(无环图(n,e->1+'y^e))]}A350450行(n)={ArcTriangle(InvEulerMTS(非循环图(n,e->1+'y^e+O('y^n)))}\\ ------------------------------------------\\2023年3月新增:空图形边(v,yf)={1}DirectedCycleEdges(v,yf)=if(#v&&v[1]==v[#v],eulerphi(v[1])*(#v-1)*v[1]^(#v-1))\\获取强组件属于给定cyle索引序列的图的ogf。图FromStrong(组件)={未标记Ogf(InvGgfCIData(ExpCIData(-components),e->2))}\\具有k个强连接分量的n个未标记节点上的有向图的数目。A361582三角形(n)={my(g=-LogCIData(InvGgfCIData(GraphCIData(n,DigraphEdges),e->2));[Vecrev(p)|p<-Vec(GraphsFromStrong('y*g))]}\\n个未标记节点上的有向图数,其强连接组件是完全有向图。A361583seq(n)={my(g=GraphCIData(n,EmptyGraphEdges));Vec(GraphsFromStrong(g))}\\n个未标记节点上的有向图数量,其强连接组件是有向圈或单个顶点。A361584seq(n)={my(g=GraphCIData(n,DirectedCycleEdges));Vec(GraphsFromStrong(g))}\\n个未标记节点上的有向图的数量,其强连接组件是有向循环。A361585seq(n)={my(g=GraphCIData(n,DirectedCycleEdges));g[2]=[0];Vec(GraphsFromStrong(g))}\\n个未标记节点上的有向图的数量,其中每个节点都属于一个有向循环。A361586seq(n)={my(g=-LogCIData(InvGgfCIData(GraphCIData(n,DigraphEdges),e->2));g[2]=[0];Vec(GraphsFromStrong(g))}\\n个无标记节点上具有k个强连通分量的弱连通有向图的个数。A361587三角(n)={my(g=-LogCIData(InvGgfCIData(GraphCIData(n,DigraphEdges),e->2));[Vecrev(p)|p<-Vec(1+InvEulerMTS(GraphsFromStrong('y*g)))]}\\n个无标记节点上具有k个强连接分量且没有孤立节点的有向图的数目。A361588三角(n)={my(g=-LogCIData(InvGgfCIData(GraphCIData(n,DigraphEdges),e->2));my(v=Vec(GraphsFromStrong('y*g)*(1-x*y));向量(#v,n,Vecrev(v[n],n))}\\n个没有独立节点的未标记节点上的非循环有向图的数量。A361589seq(n)={Vec(无环图(n)*(1-x))}\\n个未标记节点上具有大小为1的k个强连接分量的有向图的数目。A361590三角(n)={my(g=-LogCIData(InvGgfCIData(GraphCIData(n,DigraphEdges),e->2));g[2]=['y];[Vecrev(p)|p<-Vec(图形源于强(g))]}\\结束