Skip to content

Commit b6a4bb5

Browse files
author
Release Manager
committed
gh-37157: Add additional lattice methods for matrices over QQ LLL has long been implemented for matrices over QQ by clearing the denominator and doing LLL over ZZ, but this was not done for BKZ() or is_LLL_reduced() This PR adds BKZ() and is_LLL_reduced() to rational matrices, using the same techniques as the current LLL method. URL: #37157 Reported by: TheBlupper Reviewer(s): grhkm21
2 parents e3f7c7f + 80a2c2f commit b6a4bb5

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

src/sage/matrix/matrix_integer_dense.pyx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2746,7 +2746,8 @@ cdef class Matrix_integer_dense(Matrix_dense):
27462746
def BKZ(self, delta=None, algorithm="fpLLL", fp=None, block_size=10, prune=0,
27472747
use_givens=False, precision=0, proof=None, **kwds):
27482748
"""
2749-
Block Korkin-Zolotarev reduction.
2749+
Return the result of running Block Korkin-Zolotarev reduction on
2750+
``self`` interpreted as a lattice.
27502751
27512752
INPUT:
27522753

src/sage/matrix/matrix_rational_dense.pyx

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2927,13 +2927,39 @@ cdef class Matrix_rational_dense(Matrix_dense):
29272927
# LLL
29282928
# ###############################################
29292929

2930+
def BKZ(self, *args, **kwargs):
2931+
"""
2932+
Return the result of running Block Korkin-Zolotarev reduction on
2933+
``self`` interpreted as a lattice.
2934+
2935+
The arguments ``*args`` and ``**kwargs`` are passed onto
2936+
:meth:`sage.matrix.matrix_integer_dense.Matrix_integer_dense.BKZ`,
2937+
see there for more details.
2938+
2939+
EXAMPLES::
2940+
2941+
sage: A = Matrix(QQ, 3, 3, [1/n for n in range(1, 10)])
2942+
sage: A.BKZ()
2943+
[ 1/28 -1/40 -1/18]
2944+
[ 1/28 -1/40 1/18]
2945+
[-1/14 -1/40 0]
2946+
2947+
sage: A = random_matrix(QQ, 10, 10)
2948+
sage: d = lcm(a.denom() for a in A.list())
2949+
sage: A.BKZ() == (A * d).change_ring(ZZ).BKZ() / d
2950+
True
2951+
"""
2952+
A, d = self._clear_denom()
2953+
return A.BKZ(*args, **kwargs) / d
2954+
29302955
def LLL(self, *args, **kwargs):
29312956
"""
29322957
Return an LLL reduced or approximated LLL reduced lattice for
29332958
``self`` interpreted as a lattice.
29342959
2935-
For details on input parameters, see
2936-
:meth:`sage.matrix.matrix_integer_dense.Matrix_integer_dense.LLL`.
2960+
The arguments ``*args`` and ``**kwargs`` are passed onto
2961+
:meth:`sage.matrix.matrix_integer_dense.Matrix_integer_dense.LLL`,
2962+
see there for more details.
29372963
29382964
EXAMPLES::
29392965
@@ -2942,10 +2968,33 @@ cdef class Matrix_rational_dense(Matrix_dense):
29422968
[ 1/28 -1/40 -1/18]
29432969
[ 1/28 -1/40 1/18]
29442970
[ 0 -3/40 0]
2971+
2972+
sage: A = random_matrix(QQ, 10, 10)
2973+
sage: d = lcm(a.denom() for a in A.list())
2974+
sage: A.LLL() == (A * d).change_ring(ZZ).LLL() / d
2975+
True
29452976
"""
29462977
A, d = self._clear_denom()
29472978
return A.LLL(*args, **kwargs) / d
29482979

2980+
def is_LLL_reduced(self, delta=None, eta=None):
2981+
r"""
2982+
Return ``True`` if this lattice is `(\delta, \eta)`-LLL reduced.
2983+
For a definition of LLL reduction, see
2984+
:meth:`sage.matrix.matrix_integer_dense.Matrix_integer_dense.LLL`.
2985+
2986+
EXAMPLES::
2987+
2988+
sage: A = random_matrix(QQ, 10, 10)
2989+
sage: L = A.LLL()
2990+
sage: A.is_LLL_reduced()
2991+
False
2992+
sage: L.is_LLL_reduced()
2993+
True
2994+
"""
2995+
A, _ = self._clear_denom()
2996+
return A.is_LLL_reduced(delta, eta)
2997+
29492998

29502999
cdef new_matrix_from_pari_GEN(parent, GEN d) noexcept:
29513000
"""

0 commit comments

Comments
 (0)