CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.

| Download

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

Views: 418346
1
/****************************************************************************
2
**
3
*A class1_eliminate.c ANUPQ source Eamonn O'Brien
4
**
5
*Y Copyright 1995-2001, Lehrstuhl D fuer Mathematik, RWTH Aachen, Germany
6
*Y Copyright 1995-2001, School of Mathematical Sciences, ANU, Australia
7
**
8
*/
9
10
#include "pq_defs.h"
11
#include "pcp_vars.h"
12
#include "pq_functions.h"
13
14
/* eliminate all redundant generators to construct the consistent
15
power commutator presentation for the class 1 quotient;
16
17
this procedure is called only for class 1 in order to
18
eliminate redundancies brought about by collecting and
19
then echelonising words against an existing consistent
20
class 1 presentation;
21
22
in all other circumstances, the usual eliminate procedure
23
is called */
24
25
void class1_eliminate(struct pcp_vars *pcp)
26
{
27
register int *y = y_address;
28
29
register int i;
30
register int j;
31
register int k;
32
register int p1;
33
register int ba;
34
register int lg;
35
register int bound;
36
37
register int structure = pcp->structure;
38
register int current_class = pcp->cc;
39
register int lused = pcp->lused;
40
register int dgen = pcp->dgen;
41
register int ndgen = pcp->ndgen;
42
43
/* calculate new values for irredundant generators and set them up
44
in a renumbering table of length pcp->lastg - pcp->ccbeg + 1
45
which looks to compact like a normal exponent-generator string
46
pointed to by y[dgen] */
47
48
structure = pcp->structure;
49
lused = pcp->lused;
50
y[lused + 1] = dgen;
51
y[dgen] = -(lused + 1);
52
y[lused + 2] = pcp->lastg - pcp->ccbeg + 1;
53
ba = lused + 3 - pcp->ccbeg;
54
pcp->lused += pcp->lastg - pcp->ccbeg + 3;
55
lused = pcp->lused;
56
lg = pcp->ccbeg - 1;
57
for (i = pcp->ccbeg, bound = pcp->lastg; i <= bound; i++) {
58
y[ba + i] = 0;
59
if (y[structure + i] > 0)
60
y[ba + i] = ++lg;
61
}
62
63
/* update the redundant defining generators and inverses */
64
for (i = 1; i <= ndgen; i++) {
65
update(dgen + i, pcp);
66
if (pcp->overflow)
67
return;
68
update(dgen - i, pcp);
69
if (pcp->overflow)
70
return;
71
}
72
73
/* finally update and move structure information */
74
75
pcp->ppcomm = pcp->structure;
76
pcp->ppower = pcp->ppcomm;
77
k = pcp->ppower;
78
structure = pcp->structure;
79
for (i = pcp->lastg; i >= pcp->ccbeg; i--) {
80
if ((j = y[structure + i]) > 0) {
81
y[k] = j;
82
k--;
83
} else if (j < 0) {
84
/* deallocate equation for redundant generator i */
85
p1 = -j;
86
y[p1] = 0;
87
}
88
}
89
90
for (; i > 0; i--)
91
y[k--] = y[structure + i];
92
if (pcp->subgrp != structure)
93
delete_tables(0, pcp);
94
pcp->structure = k;
95
structure = pcp->structure;
96
pcp->words = k;
97
pcp->subgrp = k;
98
pcp->submlg = pcp->subgrp - lg;
99
100
pcp->lastg = lg;
101
y[pcp->clend + current_class] = pcp->lastg;
102
103
/* deallocate the renumbering table */
104
p1 = -y[dgen];
105
y[p1] = 0;
106
return;
107
}
108
109