1 #include "defs.h"
2
3 extern char inf1[],outf[80];
4 extern short **mat[],pinv[],**spm,*spv,prime,dim,cp[],exp,opmats;
5 FILE *ip,*ips,*op;
6
7 int
matact(int inter)8 matact (int inter)
9 { short substeps,subexp,subdp,*commno,*commvec,**commer,**commkeep,
10 intexp,ncommer,ncomm,i,j,k,l,m,n,*ptr,*ptre,*ptr2,incr;
11 char subfile[4],infc[80];
12 commer=mat[3*exp+1]; commkeep=mat[3*exp+2]; commno=spm[1]; commvec=spm[2];
13 if (inter)
14 { if ((ip=fopen(inf1,"r"))==0)
15 { fprintf(stderr,"Cannot open %s\n",inf1); return(-1);}
16 strcpy(subfile,"axa");
17 incr=exp;
18 }
19 else { incr=0; intexp=exp; strcpy(subfile,"xa");}
20
21 /* The following loop is executed once only if inter = 0 (Checking relations for
22 P). If inter=1, it is executed once for each Sylow intersection Q in the
23 file inf1 (=gpname.sc?).
24 */
25 while (1)
26 { if (inter)
27 { fscanf(ip,"%hd",&intexp);
28 if (intexp==0)
29 { subfile[0]++; subfile[2]='a'; continue;}
30 if (intexp== -1) break;
31 if (intexp>=exp)
32 { fprintf(stderr,"Sylow intersection too large.\n"); return(-1);}
33 seeknln(); seeknln();
34 /* Read generators of Q and compute matrices */
35 for (i=1;i<=intexp;i++)
36 { fscanf(ip,"%hd",&l); l /=2; ptr=ptre=cp;
37 for (j=1;j<=l;j++)
38 { fscanf(ip,"%hd%hd",&m,&n);
39 if (m<=0 || m>exp || n<=0 || n>prime)
40 { fprintf(stderr,"Invalid data in %s.\n",inf1); return(-1);}
41 ptre+=n; while (++ptr<=ptre) *ptr=m; ptr=ptre;
42 }
43 *cp=ptre-cp;
44 prod(cp,mat[exp+i]);
45 }
46 if (opmats)
47 { strcpy(outf,inf1); strncat(outf,subfile,1); strcat(outf,"mats");
48 op=fopen(outf,"w");
49 fprintf(op,"%4d%4d%4d\n",prime,dim,intexp);
50 for (i=1;i<=intexp;i++) printmat(mat[exp+i]);
51 fclose(op);
52 }
53 /* Skip rest of data for this Q */
54 k=3+intexp*(intexp+1)/2;
55 for (i=1;i<=k;i++) seeknln();
56 }
57
58 /* The following loop (restart) is executed once for each file of inf1xa,
59 inf1xb,... of subgroups of Q.
60 */
61 restart:
62 strcpy(infc,inf1); strcat(infc,subfile);
63 if ((ips=fopen(infc,"r"))==0)
64 /* No more files of subgroups. */
65 { if (inter==0) break;
66 subfile[0]++; subfile[2]='a'; continue;
67 }
68 fscanf(ips,"%hd%hd",&subexp,&substeps);
69 if (subexp<=0 || subexp>intexp)
70 { fprintf(stderr,"Invalid data in %s.\n",infc); return(-1);}
71 printf("File %s: substeps=%d.\n",infc,substeps);
72 for (i=1;i<=subexp;i++)
73 { if (subexp==intexp) { *cp=1; cp[1]=i+incr;}
74 else
75 { fscanf(ips,"%hd",&l); l /=2; ptr=ptre=cp;
76 for (j=1;j<=l;j++)
77 { fscanf(ips,"%hd%hd",&m,&n);
78 if (m<=0 || m>intexp || n<=0 || n>prime)
79 { fprintf(stderr,"Invalid data in %s.\n",infc); return(-1);}
80 ptre+=n; while (++ptr<=ptre) *ptr=m+incr; ptr=ptre;
81 }
82 *cp=ptre-cp;
83 }
84 prod(cp,mat[2*exp+i]);
85 }
86
87 for (i=1;i<=dim;i++)
88 { for (j=1;j<=dim;j++) commer[i][j]=0; commer[i][i]=1;}
89 ncommer=dim;
90 for (subdp=1;subdp<=substeps;subdp++)
91 { ncomm=0; for (i=1;i<=dim;i++) commno[i]=0;
92 for (i=1;i<=ncommer;i++) for (j=1;j<=subexp;j++)
93 { k=comm(commer[i],commvec,mat[2*exp+j]);
94 if (subdp==substeps)
95 { if (k!=0)
96 { fprintf(stderr,
97 "Error: subdp,i,j, inf=%d,%d,%d,%s\n",subdp,i,j,infc);
98 subfile[1+inter]++; fclose(ips); goto restart;
99 }
100 }
101 else
102 { ptr=commvec+dim+1;
103 for (k=dim;k>=1;k--) if ((l= *(--ptr))!=0)
104 { n=pinv[l];
105 for (m=k;m>=1;m--) {*ptr*=n; *(ptr--)%=prime;}
106 if ((n=commno[k])!=0)
107 { ptr=commvec+k; ptr2=commkeep[commno[k]]+k;
108 while (ptr>commvec)
109 { *(ptr)-= *ptr2;
110 if (*ptr<0) *ptr+=prime;
111 ptr--; ptr2--;
112 }
113 ptr=commvec+k;
114 }
115 else
116 { ncomm++; commno[k]=ncomm;
117 ptr=commkeep[ncomm]; ptre=ptr+dim; ptr2=commvec;
118 while (++ptr<=ptre) *ptr= *(++ptr2);
119 break;
120 }
121 }
122 }
123 }
124
125 if (subdp<substeps)
126 { fscanf(ips,"%hd",&i);
127 if (i!=0)
128 { subexp=i;
129 if (subexp<=0 || subexp>intexp)
130 { fprintf(stderr,"Invalid data in %s.\n",infc); return(-1);}
131 for (i=1;i<=subexp;i++)
132 { if (subexp==intexp) {*cp=1; cp[1]=i+incr;}
133 else
134 { fscanf(ips,"%hd",&l); l /=2; ptr=ptre=cp;
135 for (j=1;j<=l;j++)
136 { fscanf(ips,"%hd%hd",&m,&n);
137 if (m<=0 || m>intexp || n<=0 || n>prime)
138 { fprintf(stderr,"Invalid data in %s.\n",infc); return(-1);}
139 ptre+=n; while (++ptr<=ptre) *ptr=m+incr; ptr=ptre;
140 }
141 *cp=ptre-cp;
142 }
143 prod(cp,mat[2*exp+i]);
144 }
145 }
146 for (i=1;i<=ncomm;i++)
147 { ptr=commer[i]; ptre=ptr+dim; ptr2=commkeep[i];
148 while (++ptr<=ptre) *ptr= *(++ptr2);
149 }
150 ncommer=ncomm;
151 }
152 }
153 printf("File %s is ok.\n",infc);
154 fclose(ips); subfile[1+inter]++;
155 goto restart;
156 }
157 }
158
seeknln(void)159 void seeknln (void) {while (getc(ip)!='\n');}
160