Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
    }
}