GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#include "defs.h"1#include "permfns.h"23extern short npt,nf,cp[],orb[], pno[],fp[],tsv1[],tsv2[],tsv3[],orep[],4*pptr[],mb;5short cpno;67int8addperm (void)9/* This computes the perm cp as perm no cpno, and adds it to the list pno.10Externals: nf,cpno,fp,pno,pptr.11*/12{ short k,m,n;13if (nf== -1)14{ fprintf(stderr,"Out of space. Increase PSP.\n"); return(-1);}15cpno=nf; nf=fp[nf]; (*pno)++; pno[*pno]=cpno; m=cpno+1;16for (n=1;n<=npt;n++) {k=image(n); pptr[cpno][n]=k;pptr[m][k]=n;}17return(0);18}1920int21intbase (int pt, int pos, short *stad, short *nbad, short *b, short *lorb, short **svptr)22/* This changes base no pos to pt (unless it is already an earlier base point.23b is the base, lorb, svptr as usual. nbad is tha address of nb (no of24base points). It is assumed that the perm nos are linked by the extern25array fp, starting at perm no *stad.26Externals:npt,mb,tsv1,tsv2,tsv3,pno,pptr,svptr,orb,orep,nf,cp.27*/28{ char recalc,sk1,sk2;29short i,j,k,l,m,n,v,z,b1,b2,lo,lo1,lo2,nlo1,nlo2,np1,np2,30fpno,lpno,nr,stpos,npt1;31npt1=npt+1; recalc=0; stpos=pos-1;32if (pos== *nbad+1) stpos=0;33else for (i=1;i<= *nbad;i++)34{ if (i==pos) stpos=0;35if (b[i]==pt)36{ if (stpos!=0) {fprintf(stderr,"Base element there.\n"); return(1);}37stpos=i;38}39}4041/* If stpos=0, then bno is not at present a base point, so we introduce it42as base[nb+1], and put stpos=nb+1. Otherwise, it is already present as43base[stpos]. The idea is to swap base points l,l+1 for l=stpos-1,...pos44successively.45*/46if (stpos==0)47{ (*nbad)++;48if (*nbad>mb)49{ fprintf(stderr,"nb too big. Increase SVSP (or MB).\n"); return(-1);}50stpos= *nbad; b[*nbad]=pt; lorb[*nbad]=1;51for (n=1;n<=npt;n++) svptr[*nbad][n]=0; svptr[*nbad][pt]= -1;52}53for (l=stpos-1;l>=pos;l--)54{ b1=b[l];b2=b[l+1]; lo1=lorb[l]; lo2=lorb[l+1]; b[l]=b2; b[l+1]=b1;55/* Now we list the permutations that may need to be changed */56*pno=0; sk1=1; sk2=1;57for (i= *stad;i!= -1;i=fp[i])58{ k=pptr[i][npt1];59if (sk1 && k<=l+1) {np1= *pno; sk1=0;}60if (sk2 && k<=l) {np2= *pno; sk2=0;}61if (k<l) break; (*pno)++; pno[*pno]=i;62}63if (sk1) np1= *pno; if (sk2) np2= *pno;64if (lo1==1)65{ for (n=1;n<=npt;n++) {svptr[l][n]=svptr[l+1][n];svptr[l+1][n]=0;}66svptr[l+1][b1]= -1; lorb[l]=lo2; lorb[l+1]=1;67for (i=np1+1;i<=np2;i++) pptr[pno[i]][npt1]=l;68continue;69}70lo = orbitsv(b2,tsv1,0);71if (lo==1)72{ for (n=1;n<=npt;n++) {svptr[l+1][n]=svptr[l][n];svptr[l][n]=0;}73svptr[l][b2]= -1; lorb[l]=1; lorb[l+1]=lo1;74for (i=np2+1;i<= *pno;i++) pptr[pno[i]][npt1]=l+1;75continue;76}77nlo1=lo;lorb[l]=lo; nlo2= lo1*lo2/lo; lorb[l+1]=nlo2;78if (nlo2==1)79{ for (n=1;n<=npt;n++) {svptr[l][n]=tsv1[n];svptr[l+1][n]=0;}80svptr[l+1][b1]= -1;81for (i=np1+1;i<=np2;i++) pptr[pno[i]][npt1]=l;82continue;83}84/* The easy cases have now been handled! */85if (recalc) orbitsv(b1,svptr[l],0); else recalc=1;86lpno=pno[*pno]; *pno=np2; orbitsv(b2,tsv2,0); *pno=np1;87for (n=1;n<=npt;n++) tsv3[n]=1; nr=0;88for (n=1;n<=npt;n++) if (svptr[l][n]>0 && tsv3[n])89{ nr++; orb[1]=n; orep[nr]=n; tsv3[n]=0; m=1;90for (j=1;j<=m;j++)91{ z=orb[j]; for (k=1;k<= *pno;k++)92{ v=pptr[pno[k]][z];93if (tsv3[v])94{ tsv3[v]=0; m++; orb[m]=v; }95}96}97}98for (n=1;n<=npt;n++) tsv3[n]=0;99tsv3[b1]= -1; lo=1; orb[1]=b1; fpno= -1;100for (i=1;i<=nr;i++)101{ *cp=0; addsv(orep[i],svptr[l]); j=image(b2); if (tsv2[j]!=0)102{ addsv(j,tsv2); j=image(b1); if (tsv3[j]==0)103{ if (fpno== -1) fpno=nf; else fp[cpno]=nf;104if ((addperm())== -1) return(-1);105pptr[cpno][npt1]=l+1; if ((lo=orbitsv(b1,tsv3,lo))==nlo2) break;106}107}108}109for (n=1;n<=npt;n++) {svptr[l+1][n]=tsv3[n]; tsv3[n]=0; }110tsv3[b2] = -1; lo=1; orb[1]=b2;111for (n=1;n<=npt;n++) if (tsv1[n]>0 && tsv3[n]==0)112{ *cp=0;113addsv(n,tsv1); fp[cpno]=nf;114if (addperm()== -1) return(-1);115pptr[cpno][npt1]=l;116if ((lo=orbitsv(b2,tsv3,lo))==nlo1) break;117}118for (n=1;n<=npt;n++) svptr[l][n]=tsv3[n];119fp[cpno]=fp[lpno]; fp[lpno]=nf;120if (np1==0) { nf= *stad; *stad=fpno; }121else { j=pno[np1]; nf=fp[j]; fp[j]=fpno; }122}123while (lorb[*nbad]==1 && b[*nbad]!=pt) (*nbad)--;124if (recalc && pos>1)125{ *pno=0; j=pos-1;126for (i= *stad;i!= -1;i=fp[i])127{ k=pptr[i][npt1]; if (k<j) {orbitsv(b[j],svptr[j],0); j=k; }128(*pno)++; pno[*pno]=i;129}130orbitsv(b[j],svptr[j],0);131}132return(0);133}134135136