atlas
0.6
|
#include <abelian.h>
Public Member Functions | |
Homomorphism (const std::vector< GrpArr > &, const FiniteAbelianGroup &, const FiniteAbelianGroup &) | |
GrpArr | operator* (const GrpArr &) const |
GrpNbr | operator* (GrpNbr) const |
Private Attributes | |
GroupType | d_source |
GroupType | d_dest |
GroupType | d_cosource |
GroupType | d_codest |
unsigned long | d_annihilator |
matrix::PID_Matrix< unsigned long > | d_matrix |
A |Homomorphism| object represents a homomorphism from a group of type |d_source| to a group of type |d_dest|. The essential data is a matrix |d_matrix| with integral coefficients. As usual the matrix entry (i,j) expresses component $i$ of the image of generator $j$.
For such a homomorphism to be well defined, the matrix entry (i,j) should be a multiple of |d_dest[i]/g|, with |g == gcd(d_dest[i],d_source[j])|.
Computationally we shall proceed as follows. We set $M$ to a common multiple of the annihilators of |d_source| and |d_dest|, and think of all cyclic groups as embedded in $Z/M$; this means that before acting upon a source element $(x_1,...,x_m)$ we should multiply each component $x_j$ by the cotype $q_j=M/s_j$ of that component with respect to $M$, where $s_j$ is |d_source[j]|. After forming $y_j= a_{i,j} q_j x_j$ for each $i$, the component $y_i$ must be in the subgroup of index $t_i$ in $Z/M$, where $t_i$ is |d_dest[i]|, in other words it must be divisible by $M/t_i$, and the compoentn $i$ of the final result will be $y_i/(M/t_i)$. This definition is independent of the choice of $M$; we will take the lcm of the annihilators.
In fact this definition might work for some group elements of the source but not for all. In that case we don't really have a homomorphism, but we allow applying to those group elements for which it works nontheless. The predicates |defined| serve to find out whether a source element is OK.
atlas::abelian::Homomorphism::Homomorphism | ( | const std::vector< GrpArr > & | al, |
const FiniteAbelianGroup & | source, | ||
const FiniteAbelianGroup & | dest | ||
) |
Constructs the homomorphism with matrix al, from groups |source| to |dest|.
Precondition: the elements of |al| are of size source.rank(), and their number is dest.rank(). Note that the matrix is therefore given by rows (linear forms on |source|), not by columns (images in |dest|); unusal!
GrpArr atlas::abelian::Homomorphism::operator* | ( | const GrpArr & | a | ) | const |
Synopsis: applies the homomorphism to x according to the rules explained in the introduction to this section, and puts the result in dest.
Precondition: x is in the subgroup for which this makes sense.
GrpNbr atlas::abelian::Homomorphism::operator* | ( | GrpNbr | x | ) | const |
Synopsis: return h(x).
Precondition: x is in the subgroup for which this makes sense;
Forwarded to the GrpArr form.
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |