static Boolean same_homology( Triangulation *manifold0, Triangulation *manifold1) { AbelianGroup *g0, *g1; Boolean groups_are_isomorphic; int i; /* * Compute the homology groups. */ g0 = homology(manifold0); g1 = homology(manifold1); /* * compute_isometries() has already checked that both manifolds * really are manifolds, so neither g0 nor g1 should be NULL. */ if (g0 == NULL || g1 == NULL) uFatalError("same_homology", "isometry"); /* * Put the homology groups into a canonical form. */ compress_abelian_group(g0); compress_abelian_group(g1); /* * Compare the groups. */ if (g0->num_torsion_coefficients != g1->num_torsion_coefficients) groups_are_isomorphic = FALSE; else { groups_are_isomorphic = TRUE; /* innocent until proven guilty */ for (i = 0; i < g0->num_torsion_coefficients; i++) if (g0->torsion_coefficients[i] != g1->torsion_coefficients[i]) groups_are_isomorphic = FALSE; } /* * Free the Abelian groups. */ free_abelian_group(g0); free_abelian_group(g1); return groups_are_isomorphic; }
void free_symmetry_group( SymmetryGroup *symmetry_group) { if (symmetry_group != NULL) { int i; free_isometry_list(symmetry_group->symmetry_list); for (i = 0; i < symmetry_group->order; i++) my_free(symmetry_group->product[i]); my_free(symmetry_group->product); my_free(symmetry_group->order_of_element); my_free(symmetry_group->inverse); if (symmetry_group->abelian_description != NULL) free_abelian_group(symmetry_group->abelian_description); if (symmetry_group->is_direct_product == TRUE) for (i = 0; i < 2; i++) free_symmetry_group(symmetry_group->factor[i]); my_free(symmetry_group); } }