130 Eigen::Matrix<IntScalarType,Eigen::Dynamic,Eigen::Dynamic> matrixA;
131 Eigen::Matrix<IntScalarType,Eigen::Dynamic,1> tempx;
135 for(
int i=0;i<dim-1;i++) {
136 matrixA.conservativeResize(i + 1, i + 2);
138 matrixA.col(i + 1) = Eigen::Vector<IntScalarType, Eigen::Dynamic>::Zero(i + 1);
140 matrixA(0, i + 1) = a(i + 1);
141 tempx.conservativeResize(i + 2, 1);
147 matrixA.row(i) = tempx;
150 Eigen::Vector<IntScalarType,Eigen::Dynamic> det=
151 Eigen::Vector<IntScalarType,Eigen::Dynamic>::Zero(i+2);
152 for(
int j=0;j<i+2; j++)
154 Eigen::MatrixXd minor= Eigen::MatrixXd::Zero(i+1,i+1);
155 std::vector<IntScalarType> indicesToKeep(i+2);
156 std::iota(std::begin(indicesToKeep),std::end(indicesToKeep),0);
157 indicesToKeep.erase(std::remove(indicesToKeep.begin(),indicesToKeep.end(),j),indicesToKeep.end());
159 Eigen::Vector<IntScalarType,Eigen::Dynamic> indicesToKeepVector;
160 indicesToKeepVector= Eigen::Map<Eigen::Vector<IntScalarType,Eigen::Dynamic>>(indicesToKeep.data(),i+1);
161 minor= matrixA(Eigen::indexing::all, indicesToKeepVector).template cast<double>();
162 det(j)= round(minor.determinant());
165 IntScalarType e=
gcd(det);
168 if (det == Eigen::Vector<IntScalarType,Eigen::Dynamic>::Zero(i+2))
170 tempx= Eigen::Vector<IntScalarType,Eigen::Dynamic>::Zero(i+2);
175 for (
int j = 0; j < i + 2; j++)
176 tempx(j) = pow(-1, j + 1) * det(j) / e;
178 matrixA.conservativeResize(dim,dim);
179 matrixA.row(dim-1)= tempx;
181 return matrixA.block(1,0,dim-1,dim);
227 static Eigen::Vector<IntScalarType,Eigen::Dynamic>
solveBezout(
const Eigen::MatrixBase<T>& a)
230 if (n<2)
throw std::runtime_error(
"the size of arrays should be at least two");
232 throw std::runtime_error(
"No solution since the gcd is not 1 or -1.");
234 Eigen::Vector<IntScalarType,Eigen::Dynamic> u(n);
240 Eigen::Vector<IntScalarType,Eigen::Dynamic> na(n-1);
241 na(0)= g12; na(Eigen::seq(1,n-2))= a(Eigen::seq(2,n-1));
243 Eigen::Vector<IntScalarType,Eigen::Dynamic> k(n-1);
256 u(Eigen::seq(2, n - 1)) = k(Eigen::seq(1, n - 2));
262 static Eigen::Matrix<IntScalarType,Eigen::Dynamic,Eigen::Dynamic>
ccum(
const Eigen::MatrixBase<T>& qin)
267 Eigen::Vector<IntScalarType,Eigen::Dynamic> q(n);
273 throw std::runtime_error(
"Size of the input matrix for CCUM should be >1.");
274 if (abs(
gcd(qin)) != 1)
275 throw std::runtime_error(
"The absolute gcd of the input array is not 1.");
277 catch(std::runtime_error& e)
279 std::cerr << e.what();
282 Eigen::Matrix<IntScalarType,Eigen::Dynamic,Eigen::Dynamic> Q=
283 Eigen::Matrix<IntScalarType,Eigen::Dynamic,Eigen::Dynamic>::Identity(n,n);
286 bool swapFirst=
false;
287 int swapFirstElementWith;
290 int elementIndex= -1;
291 for (
auto element : q)
296 IntScalarType temp= q(0);
298 q(elementIndex)= temp;
300 swapFirstElementWith= elementIndex;
307 int elementIndex= -1;
310 for (
const IntScalarType& element : q)
313 if (elementIndex == 0)
continue;
314 if (!(q(0)==0 && element==0))
315 y=
gcd(q(0),element);
322 Q(1,0)= Q(elementIndex,0);
323 Q(elementIndex,0)= temp;
328 Q(0,1)=-v; Q(1,1)= u;
330 Q.row(1).swap(Q.row(elementIndex));
332 if(swapFirst) Q.row(0).swap(Q.row(swapFirstElementWith));
338 if (!(q(0) ==0 && q(1) == 0))
345 IntScalarType alpha,beta;
347 Eigen::Matrix<IntScalarType,Eigen::Dynamic,Eigen::Dynamic> M=
348 Eigen::Matrix<IntScalarType,Eigen::Dynamic,Eigen::Dynamic>::Identity(n,n);
349 M.block(0,0,2,2) << u, v,
352 Eigen::Vector<IntScalarType,Eigen::Dynamic> t;
355 int swappedElementIndex;
357 for (IntScalarType& element : t)
360 if (elementIndex<2)
continue;
366 int temp= t(elementIndex);
367 t(elementIndex)= t(1);
369 swappedElementIndex= elementIndex;
373 assert(elementIndex!=t.size());
376 Eigen::Matrix<IntScalarType,Eigen::Dynamic,Eigen::Dynamic> tempMatrix(n,n) ;
381 if (swapped) tempMatrix.row(1).swap(tempMatrix.row(swappedElementIndex));
384 Eigen::Matrix<IntScalarType,Eigen::Dynamic,Eigen::Dynamic> invM=
385 Eigen::Matrix<IntScalarType,Eigen::Dynamic,Eigen::Dynamic>::Identity(n,n);
386 invM.block(0,0,2,2) << alpha, -v,
388 Eigen::Matrix<IntScalarType,Eigen::Dynamic,Eigen::Dynamic> output(n,n);
389 output= invM*tempMatrix;
390 if(swapFirst) output.row(0).swap(output.row(swapFirstElementWith));
395 static std::deque<std::vector<IntScalarType>>
comb(
const int& n,
const int& k)
397 std::deque<std::vector<IntScalarType>> output;
398 std::string bitmask(k, 1);
399 bitmask.resize(n, 0);
403 std::vector<IntScalarType> kCombination(k);
406 for (
int i = 0; i < n; ++i)
410 kCombination[arrIndex]= (IntScalarType) i;
415 output.push_back(kCombination);
416 }
while (std::prev_permutation(bitmask.begin(), bitmask.end()));