Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it

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