[Mlir-commits] [mlir] [MLIR][Presburger] Add LLL basis reduction (PR #75565)
Arjun P
llvmlistbot at llvm.org
Sun Dec 17 04:59:19 PST 2023
================
@@ -576,4 +576,72 @@ FracMatrix FracMatrix::gramSchmidt() const {
}
}
return orth;
-}
\ No newline at end of file
+}
+
+// Convert the matrix, interpreted (row-wise) as a basis
+// to an LLL-reduced basis.
+//
+// This is an implementation of the algorithm described in
+// "Factoring polynomials with rational coefficients" by
+// A. K. Lenstra, H. W. Lenstra Jr., L. Lovasz.
+//
+// Let {b_1, ..., b_n} be the current basis and
+// {b_1*, ..., b_n*} be the Gram-Schmidt orthogonalised
+// basis (unnormalized).
+// Define the Gram-Schmidt coefficients μ_ij as
+// (b_i • b_j*) / (b_j* • b_j*), where (•) represents the inner product.
+//
+// We iterate starting from the second row to the last row.
+//
+// For the kth row, we first check μ_kj for all rows j < k.
+// We subtract b_j (scaled by the integer nearest to μ_kj)
+// from b_k.
+//
+// Now, we update k.
+// If b_k and b_{k-1} satisfy the Lovasz condition
+// |b_k|^2 ≥ (δ - μ_k{k-1}^2) |b_{k-1}|^2,
+// we are done and we increment k.
+// Otherwise, we swap b_k and b_{k-1} and decrement k.
+//
+// We repeat this until k = n and return.
+void FracMatrix::LLL(Fraction delta) {
+ MPInt nearest;
+ Fraction mu;
+
+ // `gsOrth` holds the Gram-Schmidt orthogonalisation
+ // of the matrix at all times. It is recomputed every
+ // time the matrix is modified during the algorithm.
+ // This is naive and can be optimised.
+ FracMatrix gsOrth = gramSchmidt();
+
+ // We start from the second row.
+ unsigned k = 1;
+
----------------
Superty wrote:
nit: remove this empty line
https://github.com/llvm/llvm-project/pull/75565
More information about the Mlir-commits
mailing list