Below find a patch for the anupq package supplied as
part of the share library of GAP. It fixes known
bugs with the StandardPresentation machinery and
makes a few other minor changes. If you are using
the StandardPresentation or automorphism group
computation machinery, you should apply this patch.
To apply it, save the contents below --- as a file,
say pq.patch, then change to the anupq/srce directory,
copy it to this directory and issue the command
patch < pq.patch
Now recompile pq as described in Chapter 48 of the
GAP manual. If you have problems, please advise me.
Thanks,
Eamonn O'Brien
obrien@pell.anu.edu.au
---------------------------------------------------- diff -c srce.old/commute_dgen.c srce/commute_dgen.c *** srce.old/commute_dgen.c Sun Oct 10 15:12:06 1993 --- srce/commute_dgen.c Sun Oct 10 15:10:27 1993 *************** *** 105,110 **** --- 105,112 ---- for (i = 1; i < length; ++i) { generator = y[ptr + 1 + i]; genval = y[pcp->dgen + generator]; + + #if defined (DEBUG) if (genval > 0) printf ("%d %d\n", generator, genval); else if (genval < 0) { *************** *** 112,122 **** word_len = y[-genval + 1]; for (j = 1; j <= word_len; ++j) printf (" %d", y[-genval + 1 + j]); ! } ! else ! printf ("generator %d is trivial\n", generator); collect (genval, cp, pcp); } print_array (y, cp, cp + pcp->lastg + 1); } --- 114,129 ---- word_len = y[-genval + 1]; for (j = 1; j <= word_len; ++j) printf (" %d", y[-genval + 1 + j]); ! }; ! #endif ! if (genval == 0) ! printf ("There is no defining generator %d -- take it to be identity\n", ! generator); ! collect (genval, cp, pcp); } + #if defined (DEBUG) print_array (y, cp, cp + pcp->lastg + 1); + #endif } diff -c srce.old/interactive_pq.c srce/interactive_pq.c *** srce.old/interactive_pq.c Sun Oct 10 15:12:29 1993 --- srce/interactive_pq.c Sun Oct 10 15:10:50 1993 *************** *** 66,71 **** --- 66,73 ---- case COLLECT: t = runTime (); + if (format != BASIC) + setup_symbols (pcp); type = WORD; if (!is_space_exhausted (3 * pcp->lastg + 2, pcp)) { cp = pcp->lused; *************** *** 78,83 **** --- 80,87 ---- case SOLVE: t = runTime (); + if (format != BASIC) + setup_symbols (pcp); setup_to_solve_equation (format, pcp); t = runTime () - t; printf ("Solving the equation took %.2f seconds\n", t / 1000.0); *************** *** 85,90 **** --- 89,96 ---- case COMMUTATOR: t = runTime (); + if (format != BASIC) + setup_symbols (pcp); calculate_commutator (format, pcp); cp = pcp->lused; echelon_ready = TRUE; *************** *** 380,385 **** --- 386,393 ---- break; case REPRESENTATION: + if (format != BASIC) + setup_symbols (pcp); commute_defining_generators (format, pcp); break; diff -c srce.old/isom_options.c srce/isom_options.c *** srce.old/isom_options.c Sun Oct 10 14:59:32 1993 --- srce/isom_options.c Sun Oct 10 15:11:42 1993 *************** *** 524,530 **** if (fscanf (Subgroup, "%d", &flag) == -1) continue; ! setup_symbols (pcp); cp = pcp->lused; setup_word_to_collect (Subgroup, PRETTY, WORD, cp, pcp); --- 524,537 ---- if (fscanf (Subgroup, "%d", &flag) == -1) continue; ! ! /* should we eliminate (in order to renumber the generators)? */ ! if (flag == ELIMINATE) ! eliminate (FALSE, pcp); ! ! if (fscanf (Subgroup, "%d", &flag) == -1) ! continue; ! setup_symbols (pcp); cp = pcp->lused; setup_word_to_collect (Subgroup, PRETTY, WORD, cp, pcp); *************** *** 533,539 **** y[cp + pcp->lastg + i] = 0; echelon (pcp); ! eliminate (FALSE, pcp); } CloseFile (Subgroup); } --- 540,546 ---- y[cp + pcp->lastg + i] = 0; echelon (pcp); ! } CloseFile (Subgroup); } diff -c srce.old/runTime.c srce/runTime.c *** srce.old/runTime.c Sun Oct 10 15:12:12 1993 --- srce/runTime.c Sun Oct 10 15:11:05 1993 *************** *** 9,25 **** #else #if defined (UNIX)
! #include <sys/types.h>
! #include <sys/times.h>
! /* compute user time in milliseconds */
int runTime () { ! struct tms buf; ! times (&buf); ! return (buf.tms_utime * 50 / 3); } #else --- 9,31 ---- #else #if defined (UNIX) ! #include <sys/time.h> ! #include <sys/resource.h> ! /* ! #include "constants.h" ! */
! /* return user time in milliseconds; adapted from code by Werner Nickel */
int runTime () { ! struct rusage buf; ! if (getrusage (RUSAGE_SELF, &buf)) { ! perror ("could not obtain timing"); ! exit (0); ! } ! return buf.ru_utime.tv_sec * 1000 + buf.ru_utime.tv_usec / 1000; } #else diff -c srce.old/standard.c srce/standard.c *** srce.old/standard.c Sun Oct 10 14:59:32 1993 --- srce/standard.c Sun Oct 10 15:11:34 1993 *************** *** 272,278 **** enforce_laws (pga, pga, pcp); extend_automorphisms (auts, pga->m, pcp); - /* critical */ /* read_subgroup_rank (&k); --- 272,277 ---- *************** *** 359,364 **** --- 358,369 ----
orbit_option (STANDARDISE, perms, &a, &b, &c, &orbit_length, pga);
+ #if defined (CAYLEY_LINK) || defined (GAP_LINK_VIA_FILE) + if (!soluble_group) { + CloseFile (LINK_input); + } + #endif + map = find_stabiliser (identity_map, non_standard, auts, perms, a, b, c, orbit_length, pga, pcp); *************** *** 454,461 **** pga->nmr_of_capables = 0; pga->combined = FALSE; ! if (!soluble_group) combined_computation (auts, &a, &b, &c, perms, &orbit_length, pga, pcp); pga->terminal = TRUE; setup_reps (rep, 1, length, perms, a, b, c, auts, --- 459,467 ---- pga->nmr_of_capables = 0; pga->combined = FALSE; ! if (!soluble_group) { combined_computation (auts, &a, &b, &c, perms, &orbit_length, pga, pcp); + } pga->terminal = TRUE; setup_reps (rep, 1, length, perms, a, b, c, auts, *************** *** 526,534 **** --- 532,545 ---- char *word_perm; int i, l; char *d; + char temp;
word_map = allocate_char_vector (orbit_length, 1);
+ /* we store word which maps non-standard label to orbit representative; + in image_of_generator, the word is evaluated starting from the + last letter -- hence after computing the word, we reverse it */ + if (soluble_group) { d = find_permutation (b, c, pga); l = non_standard; *************** *** 537,542 **** --- 548,559 ---- if ((perm_number = pga->map[d[l]]) != 0) l = inverse_image (l, perms[perm_number], pga); } + /* reverse word */ + for (i = 1; i <= *word_length / 2; ++i) { + temp = word_map[i]; + word_map[i] = word_map [*word_length - i + 1]; + word_map [*word_length - i + 1] = temp; + } free_char_vector (d, 1); } else { *************** *** 732,737 **** --- 749,758 ---- fprintf (Subgroup, ";\n"); } + /* write out flag to indicate that we should now eliminate + redundant generators */ + fprintf (Subgroup, "%d\n", ELIMINATE); + CloseFile (Subgroup); }