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