-
Notifications
You must be signed in to change notification settings - Fork 0
/
FnWord.h
130 lines (100 loc) · 3.33 KB
/
FnWord.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Header file for class FnWord
// inherits QString
// authors Matt Clay, Jack Conant and Nivetha Ramasubramanian
// version 120514
/////////////////////////////////////////////////////////
#ifndef FNWORD_H // avoid double includes
#define FNWORD_H
#include <QChar>
#include <QString>
#include "Basis.h"
#include "Fn.h"
#include "FnGraph.h"
class FnWord : public QString {
/* When programming with this class, reserve the
letters u and v to denote typical elements of Fn. */
public:
FnWord() : QString() {}
FnWord(const QString &other) : QString(other) {}
FnWord(const QChar a) : QString(a) {}
// member functions
FnWord & operator = (const QChar a) {
*this = QString(a);
return(*this);
}
FnWord & operator *= (const FnWord &u) {
if (u == Fn_Identity) return(*this);
if (*this == Fn_Identity) {
*this = u;
return(*this);
}
*this += u;
tighten();
return(*this);
}
FnWord & operator *= (const QChar a) {
if (QString(a) == Fn_Identity) return(*this);
if (*this == Fn_Identity) {
*this = a;
return(*this);
}
*this += a;
tighten();
return(*this);
}
bool checkBasis (const Basis &basis = BASIS) const {
return basis.inBasis(*this);
}
bool isTrivial () const {
if (*this == Fn_Identity) return true;
return isEmpty();
}
QList<int> abelianization(const Basis &basis = BASIS) const;
FnWord cyclicWord() const;
FnWord exp(int n) const;
FnWord inverse() const;
bool isSeparableElement(const Basis &basis = BASIS) const;
QList<int> stepTwoNilpotentNormalForm(const Basis &basis = BASIS) const;
void tighten();
FnGraph whiteheadGraph(const Basis &basis = BASIS) const;
bool operator ! () const;
// friends
friend FnWord operator * (const FnWord &u, const FnWord &v);
friend FnWord operator * (const QChar a, const FnWord &v);
friend FnWord operator * (const FnWord &u, const QChar a);
friend FnWord operator ^ (const FnWord &u, const FnWord &v);
friend FnWord operator ^ (const FnWord &u, const QChar a);
friend FnWord conjugacyProblem(const FnWord &u, const FnWord &v);
friend bool isSeparable(const QList<FnWord> words, const Basis &basis);
friend FnGraph whiteheadGraph(QList<FnWord> words, const Basis &basis);
};
const FnWord Id(Fn_Identity);
const FnWord Fail(QString("Fail 0"));
FnWord conjugacyProblem(const FnWord &u, const FnWord &v);
bool isSeparable(QList<FnWord> words, const Basis &basis);
FnGraph whiteheadGraph(QList<FnWord> words, const Basis &basis = BASIS);
QList<FnWord> wordsOfLength(const Basis &basis, int len);
/////////////////////////////////////////////////////////
// additional operators
inline FnWord operator * (const FnWord & u, const FnWord & v) {
FnWord uv(u);
uv *= v;
return(uv);
}
inline FnWord operator * (const QChar a, const FnWord & v) {
FnWord av(a);
av *= v;
return(av);
}
inline FnWord operator * (const FnWord & u, const QChar a) {
FnWord ua(u);
ua *= a;
return(ua);
}
inline FnWord operator ^ (const FnWord & u, const FnWord & v) {
return((v*u)*v.inverse());
}
inline FnWord operator ^ (const FnWord & u, const QChar a) {
return(u^FnWord(a));
}
#endif // FNWORD_H_