Mercurial > hg > jgplsrc
view vp.c @ 0:e0bbaa717f41 draft default tip
lol J
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Mon, 25 Nov 2013 11:56:30 -0500 |
parents | |
children |
line wrap: on
line source
/* Copyright 1990-2011, Jsoftware Inc. All rights reserved. */ /* License in license.txt. */ /* */ /* Verbs: Permutations */ #include "j.h" static I jtord(J jt,A w){I j,n,*v,z; RZ(w); n=AN(w); z=-n; if(n){if(!(INT&AT(w)))RZ(w=cvt(INT,w)); v=AV(w); DO(n, j=*v++; if(z<j)z=j;); ++z;} R z; } F1(jtpinv){I m=0,n,*v; F1RANK(1,jtpinv,0); RZ(w=vi(w)); n=AN(w); v=AV(w); DO(n, m=0>v[i]?MAX(m,-1-v[i]):MAX(m,v[i]);); m+=0<n; R indexof(pfill(m,w),IX(m)); } /* permutation inverse */ A jtpind(J jt,I n,A w){A z;I j,m,*v; RE(n); RZ(w); m=-n; RZ(z=ca(vi(w))); v=AV(z); DO(AN(z), j=*v; ASSERT(m<=j&&j<n,EVINDEX); *v++=0>j?j+n:j;); R z; } /* positive indices */ A jtpfill(J jt,I n,A w){PROLOG;A b,z;B*bv,*v;I*wv,*zv; RZ(w=pind(n,w)); wv=AV(w); GA(z,INT,n,1,0); zv=AV(z); GA(b,B01,n,1,0); bv=BAV(b); memset(bv,C1,n); DO(AN(w), v=bv+wv[i]; ASSERT(*v,EVINDEX); *v=0;); DO(n, if(bv[i])*zv++=i;); ICPY(zv,wv,AN(w)); EPILOG(z); } static F1(jtcfd){A b,q,x,z,*zv;B*bv;I c,i,j,n,*qv,*u,*v,zn; RZ(w); if(c=1&&INT&AT(w)){ n=AN(w); v=AV(w); GA(b,B01,1+n,1,0); bv=BAV(b); memset(bv,C0,n); DO(n, j=v[i]; if(j<0||n<=j||bv[j]){c=0; break;} bv[j]=1;); } if(!c){n=ord(w); RZ(w=pfill(n,w)); v=AV(w); GA(b,B01,1+n,1,0);} bv=BAV(b); memset(bv,C0,1+n); ++bv; i=0; j=n-1; zn=(I)(log((D)n)+1.6); GA(q,INT,n, 1,0); qv= AV(q); GA(z,BOX,zn,1,0); zv=AAV(z); while(1){ while(bv[j])--j; if(0>j)break; u=qv; c=j; do{bv[c]=1; *u++=c; c=v[c];}while(c!=j); if(i==zn){RZ(z=ext(0,z)); zv=AAV(z); zn=AN(z);} RZ(zv[i++]=vec(INT,u-qv,qv)); } AN(z)=*AS(z)=zn=i; j=zn-1; DO(zn/2, x=zv[i]; zv[i]=zv[j]; zv[j]=x; --j;); R z; } /* cycle from direct */ static A jtdfc(J jt,I n,A w){PROLOG;A b,q,*wv,z;B*bv;I c,j,qn,*qv,*x,wd; RE(n); RZ(w); ASSERT(0<=n,EVINDEX); GA(b,B01,n,1,0); bv=BAV(b); memset(bv,C1,n); RZ(z=IX(n)); x=AV(z); wv=AAV(w); wd=(I)w*ARELATIVE(w); for(j=AN(w)-1;0<=j;j--){ RZ(q=pind(n,WVR(j))); qv=AV(q); qn=AN(q); if(!qn)continue; DO(qn, ASSERT(bv[qv[i]],EVINDEX); bv[qv[i]]=0;); DO(qn,bv[qv[i]]=1;); c=x[qv[0]]; DO(qn-1,x[qv[i]]=x[qv[i+1]];); x[qv[qn-1]]=c; } EPILOG(z); } /* direct from cycle */ F1(jtcdot1){F1RANK(1,jtcdot1,0); R BOX&AT(w)?dfc(ord(raze(w)),w):cfd(w);} F2(jtcdot2){A p; F2RANK(1,RMAX,jtcdot2,0); RZ(p=BOX&AT(a)?dfc(IC(w),a):pfill(IC(w),a)); R AR(w)?from(p,w):w; } F1(jtpparity){A x,y,z;B p,*u;I i,j,k,m,n,r,*s,*v,*zv; RZ(x=cvt(INT,w)); r=AR(x); s=AS(x); n=r?*(s+r-1):1; RE(m=prod(r-1,s)); v=AV(x); GA(y,B01,n,1,0); u=BAV(y); GA(z,INT,m,r?r-1:0,s); zv=AV(z); for(i=0;i<m;++i){ j=p=0; memset(u,C1,n); DO(n, k=v[i]; if(0>k)v[i]=k+=n; if(0<=k&&k<n&&u[k])u[k]=0; else{j=1+n; break;}); for(;j<n;++j)if(j!=v[j]){k=j; DO(n-j-1, ++k; if(j==v[k]){v[k]=v[j]; p=!p; break;});} zv[i]=p?-1:j==n; v+=n; } R z; } /* permutation parity; # interchanges to get i.n */ static F1(jtdfr){A z;I c,d,i,j,m,n,*v,*x; RZ(w); n=*(AS(w)+AR(w)-1); m=n?AN(w)/n:0; v=AV(w); GA(z,INT,AN(w),AR(w),AS(w)); x=AV(z); for(i=0;i<m;++i){ DO(n, x[i]=i;); DO(n-1, j=i; c=x[j+v[j]]; DO(1+v[j], d=x[j+i]; x[j+i]=c; c=d;);); x+=n; v+=n; } R z; } /* direct from reduced */ static F1(jtrfd){A z;I j,k,n,r,*s,*x; RZ(z=ca(w)); x=AV(z); r=AR(w); s=AS(w); if(n=s[r-1])DO(AN(w)/n, j=n-1; ++x; DO(n-1, k=0; DO(j--, k+=*x>x[i];); *x++=k;);); R z; } /* reduced from direct */ F1(jtadot1){A y;I n; F1RANK(1,jtadot1,0); RZ(y=BOX&AT(w)?cdot1(w):pfill(ord(w),w)); n=IC(y); R base2(cvt(XNUM,apv(n,n,-1L)),rfd(y)); } F2(jtadot2){A m,p;I n; RZ(a&&w); n=IC(w); p=sc(n); if(XNUM&AT(a))p=cvt(XNUM,p); RZ(m=fact(p)); ASSERT(all1(le(negate(m),a))&&all1(lt(a,m)),EVINDEX); if(!AR(w)){RZ(vi(a)); R ca(w);} RZ(p=dfr(vi(abase2(apv(n,n,-1L),a)))); R equ(w,IX(n))?p:from(p,w); }