Regina 7.3 Calculation Engine
|
Represents a homomorphism of finitely generated abelian groups. More...
#include <algebra/markedabeliangroup.h>
Public Member Functions | |
HomMarkedAbelianGroup (MarkedAbelianGroup dom, MarkedAbelianGroup codom, MatrixInt mat) | |
Constructs a homomorphism from two marked abelian groups and a matrix that indicates where the generators are sent. More... | |
HomMarkedAbelianGroup (const HomMarkedAbelianGroup &)=default | |
Creates a clone of the given homomorphism. More... | |
HomMarkedAbelianGroup (HomMarkedAbelianGroup &&src) noexcept=default | |
Moves the contents of the given homomorphism into this new homomorphism. More... | |
HomMarkedAbelianGroup & | operator= (const HomMarkedAbelianGroup &)=default |
Sets this to be a clone of the given homomorphism. More... | |
HomMarkedAbelianGroup & | operator= (HomMarkedAbelianGroup &&) noexcept=default |
Moves the contents of the given homomorphism to this homomorphism. More... | |
void | swap (HomMarkedAbelianGroup &other) noexcept |
Swaps the contents of this and the given homomorphism. More... | |
bool | isChainMap (const HomMarkedAbelianGroup &other) const |
Determines whether this and the given homomorphism together form a chain map. More... | |
bool | isCycleMap () const |
Is this at least a cycle map? If not, pretty much any further computations you try with this class will be give you nothing more than carefully-crafted garbage. More... | |
bool | isEpic () const |
Is this an epic homomorphism? More... | |
bool | isMonic () const |
Is this a monic homomorphism? More... | |
bool | isIsomorphism () const |
Is this an isomorphism? More... | |
bool | isZero () const |
Is this the zero map? More... | |
bool | isIdentity () const |
Is this the identity automorphism? More... | |
const AbelianGroup & | kernel () const |
Returns the kernel of this homomorphism. More... | |
const AbelianGroup & | cokernel () const |
Returns the cokernel of this homomorphism. More... | |
const AbelianGroup & | image () const |
Returns the image of this homomorphism. More... | |
std::string | summary () const |
Returns a very brief summary of the type of map. More... | |
void | summary (std::ostream &out) const |
Writes a very brief summary of the type of map to the given output stream. More... | |
void | writeTextShort (std::ostream &out) const |
Writes a short text representation of this object to the given output stream. More... | |
void | writeTextLong (std::ostream &out) const |
Writes a detailed text representation of this object to the given output stream. More... | |
const MarkedAbelianGroup & | domain () const |
Returns the domain of this homomorphism. More... | |
const MarkedAbelianGroup & | codomain () const |
Returns the codomain of this homomorphism. More... | |
const MatrixInt & | definingMatrix () const |
Returns the defining matrix for the homomorphism. More... | |
const MatrixInt & | reducedMatrix () const |
Returns the internal reduced matrix representing the homomorphism. More... | |
Vector< Integer > | evalCC (const Vector< Integer > &input) const |
Evaluate the image of a vector under this homomorphism, using the original chain complexes' coordinates. More... | |
Vector< Integer > | evalSNF (const Vector< Integer > &input) const |
Evaluate the image of a vector under this homomorphism, using the Smith normal form coordinates. More... | |
HomMarkedAbelianGroup | inverseHom () const |
Returns the inverse to a HomMarkedAbelianGroup. More... | |
HomMarkedAbelianGroup | operator* (const HomMarkedAbelianGroup &X) const |
Returns the composition of two homomorphisms. More... | |
HomMarkedAbelianGroup | operator* (HomMarkedAbelianGroup &&X) const |
Returns the composition of two homomorphisms. More... | |
HomMarkedAbelianGroup | torsionSubgroup () const |
Returns a HomMarkedAbelianGroup representing the induced map on the torsion subgroups. More... | |
std::string | str () const |
Returns a short text representation of this object. More... | |
std::string | utf8 () const |
Returns a short text representation of this object using unicode characters. More... | |
std::string | detail () const |
Returns a detailed text representation of this object. More... | |
Represents a homomorphism of finitely generated abelian groups.
One initializes such a homomorphism by providing:
So for example, if the domain was initialized by the chain complex Z^a --A--> Z^b --B--> Z^c
with mod p coefficients, and the codomain was initialized by Z^d --D--> Z^e --E--> Z^f
with mod q coefficients, then the matrix needs to be an e-by-b matrix. Furthermore, you only obtain a well-defined homomorphism if this matrix extends to a cycle map, which this class assumes but which the user can confirm with isCycleMap(). Moreover, q should divide p: this allows for q > 0 and p = 0, which means the domain has Z coefficients and the codomain has mod q coefficients.
This class implements C++ move semantics and adheres to the C++ Swappable requirement. It is designed to avoid deep copies wherever possible, even when passing or returning objects by value.
|
inline |
Constructs a homomorphism from two marked abelian groups and a matrix that indicates where the generators are sent.
The roles of the two groups and the matrix are described in detail in the HomMarkedAbelianGroup class overview.
The matrix must be given in the chain-complex coordinates. Specifically, if the domain was defined via the chain complex Z^a --N1--> Z^b --M1--> Z^c
and the codomain was defined via Z^d --N2--> Z^e --M2--> Z^f
, then mat is an e-by-b matrix that describes a homomorphism from Z^b to Z^e.
In order for this to make sense as a homomorphism of the groups represented by the domain and codomain respectively, one requires img(mat×N1)
to be a subset of img(N2). Similarly, ker(M1) must be sent into ker(M2). These facts are not checked, but are assumed as preconditions of this constructor.
img(mat×N1)
as a subset of img(N2), and sends ker(M1) into ker(M2), as explained in the detailed notes above.dom | the domain group. |
codom | the codomain group. |
mat | the matrix that describes the homomorphism from dom to ran. |
|
default |
Creates a clone of the given homomorphism.
|
defaultnoexcept |
Moves the contents of the given homomorphism into this new homomorphism.
This is a fast (constant time) operation.
The homomorphism that was passed will no longer be usable.
|
inline |
Returns the codomain of this homomorphism.
|
inline |
Returns the cokernel of this homomorphism.
|
inline |
Returns the defining matrix for the homomorphism.
|
inherited |
Returns a detailed text representation of this object.
This text may span many lines, and should provide the user with all the information they could want. It should be human-readable, should not contain extremely long lines (which cause problems for users reading the output in a terminal), and should end with a final newline. There are no restrictions on the underlying character set.
|
inline |
Returns the domain of this homomorphism.
|
inline |
Evaluate the image of a vector under this homomorphism, using the original chain complexes' coordinates.
This involves multiplication by the defining matrix.
InvalidArgument | The given vector was not in the original chain complex coordinates; that is, its length was not domain().M().columns() . |
input | an input vector in the domain chain complex's coordinates, of length domain().M().columns(). |
Evaluate the image of a vector under this homomorphism, using the Smith normal form coordinates.
This is just multiplication by the reduced matrix.
InvalidArgument | The given vector was not in domain SNF coordinates; that is, its length was not domain().snfRank() . |
input | an input vector in the domain SNF coordinates, of length domain().snfRank(). |
|
inline |
Returns the image of this homomorphism.
HomMarkedAbelianGroup regina::HomMarkedAbelianGroup::inverseHom | ( | ) | const |
Returns the inverse to a HomMarkedAbelianGroup.
If this homomorphism is not invertible, this routine returns the zero homomorphism.
If you are computing with mod-p coefficients, this routine will further require that this invertible map preserves the UCT splitting of the group, i.e., it gives an isomorphism of the tensor product parts and the TOR parts. At present this suffices since we're only using this to construct maps between homology groups in different coordinate systems.
bool regina::HomMarkedAbelianGroup::isChainMap | ( | const HomMarkedAbelianGroup & | other | ) | const |
Determines whether this and the given homomorphism together form a chain map.
Given two HomMarkedAbelianGroups, you have two diagrams:
Z^a --N1--> Z^b --M1--> Z^c Z^g --N3--> Z^h --M3--> Z^i ^ ^ |this.matrix |other.matrix Z^d --N2--> Z^e --M2--> Z^f Z^j --N4--> Z^k --M4--> Z^l
If c=g and f=j and M1=N3 and M2=N4, you can ask if these maps commute, i.e., whether you have a map of chain complexes.
other | the other homomorphism to analyse in conjunction with this. |
bool regina::HomMarkedAbelianGroup::isCycleMap | ( | ) | const |
Is this at least a cycle map? If not, pretty much any further computations you try with this class will be give you nothing more than carefully-crafted garbage.
Technically, this routine only checks that cycles are sent to cycles, since it only has access to three of the four maps you need to verify you have a cycle map.
true
if and only if this is a chain map.
|
inline |
Is this an epic homomorphism?
bool regina::HomMarkedAbelianGroup::isIdentity | ( | ) | const |
Is this the identity automorphism?
|
inline |
Is this an isomorphism?
|
inline |
Is this a monic homomorphism?
|
inline |
Is this the zero map?
|
inline |
Returns the kernel of this homomorphism.
HomMarkedAbelianGroup regina::HomMarkedAbelianGroup::operator* | ( | const HomMarkedAbelianGroup & | X | ) | const |
Returns the composition of two homomorphisms.
X | the homomorphism to compose this with. |
HomMarkedAbelianGroup regina::HomMarkedAbelianGroup::operator* | ( | HomMarkedAbelianGroup && | X | ) | const |
Returns the composition of two homomorphisms.
X | the homomorphism to compose this with. |
|
default |
Sets this to be a clone of the given homomorphism.
|
defaultnoexcept |
Moves the contents of the given homomorphism to this homomorphism.
This is a fast (constant time) operation.
The homomorphism that was passed will no longer be usable.
|
inline |
Returns the internal reduced matrix representing the homomorphism.
This is where the rows/columns of the matrix represent first the torsion summands in the order of the invariant factors, and then the free generators:
Z_{d0} + ... + Z_{dk} + Z^r
where:
|
inherited |
Returns a short text representation of this object.
This text should be human-readable, should use plain ASCII characters where possible, and should not contain any newlines.
Within these limits, this short text ouptut should be as information-rich as possible, since in most cases this forms the basis for the Python __str__()
and __repr__()
functions.
__str__()
will use precisely this function, and for most classes the Python __repr__()
function will incorporate this into its output.std::string regina::HomMarkedAbelianGroup::summary | ( | ) | const |
Returns a very brief summary of the type of map.
This will state some basic properties of the homomorphism, such as:
void regina::HomMarkedAbelianGroup::summary | ( | std::ostream & | out | ) | const |
Writes a very brief summary of the type of map to the given output stream.
This writes exactly the same information as the no-argument variant of summary() returns; see that routine for further details.
out | the output stream to which to write. |
|
noexcept |
Swaps the contents of this and the given homomorphism.
other | the homomorphism whose contents should be swapped with this. |
HomMarkedAbelianGroup regina::HomMarkedAbelianGroup::torsionSubgroup | ( | ) | const |
Returns a HomMarkedAbelianGroup representing the induced map on the torsion subgroups.
|
inherited |
Returns a short text representation of this object using unicode characters.
Like str(), this text should be human-readable, should not contain any newlines, and (within these constraints) should be as information-rich as is reasonable.
Unlike str(), this function may use unicode characters to make the output more pleasant to read. The string that is returned will be encoded in UTF-8.
void regina::HomMarkedAbelianGroup::writeTextLong | ( | std::ostream & | out | ) | const |
Writes a detailed text representation of this object to the given output stream.
out | the stream to write to. |
void regina::HomMarkedAbelianGroup::writeTextShort | ( | std::ostream & | out | ) | const |
Writes a short text representation of this object to the given output stream.
out | the stream to write to. |