137{
138 bool right_side = true;
139
140
141
143 size_t nr = mat.numRows();
144 size_t nc = mat.numColumns();
145
146 DMatZZpFFPACK::ElementType* nullspaceFFPACK = nullptr;
147
148 size_t nullspace_dim;
149 size_t nullspace_leading_dim;
150
151 FFPACK::NullSpaceBasis(mat.ring().field(),
152 (right_side ? FFLAS::FflasRight : FFLAS::FflasLeft),
153 nr,
154 nc,
155 N.rowMajorArray(),
156 nc,
157 nullspaceFFPACK,
158 nullspace_leading_dim,
159 nullspace_dim);
160
161
162
163 if (right_side && nullspace_dim != nullspace_leading_dim)
164 {
165 std::cerr << "error: this should not happen!" << std::endl;
166 }
167 else if (!right_side && nullspace_leading_dim != nc)
168 {
169 std::cerr << "error: this should not happen either!" << std::endl;
170 }
171
172 if (right_side)
173 nullspace.resize(nc, nullspace_dim);
174 else
175 nullspace.resize(nullspace_dim, nr);
176
177 std::swap(nullspace.rowMajorArray(), nullspaceFFPACK);
178
179 delete[] nullspaceFFPACK;
180 return nullspace_dim;
181}
void swap(mpfr::mpreal &x, mpfr::mpreal &y)