From 5650c4fde6dde54690dbf12d23ecebc280822461 Mon Sep 17 00:00:00 2001 From: "Martin R. Albrecht" Date: Fri, 3 Jan 2025 22:08:19 +0000 Subject: [PATCH] search for correct row instead of assuming it's -1 This fixes #289 --- src/fpylll/algorithms/babai.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/fpylll/algorithms/babai.py b/src/fpylll/algorithms/babai.py index ab9fed8a..21d20b63 100644 --- a/src/fpylll/algorithms/babai.py +++ b/src/fpylll/algorithms/babai.py @@ -41,6 +41,13 @@ def babai(B, t, *args, **kwargs): >>> _ = LLL.reduction(B) >>> v == CVP.closest_vector(B, t) True + + >>> from fpylll import * + >>> A = [428812188057600, 1, 0, 409148314550272, 0, 1] + >>> A = IntegerMatrix.from_iterable(2, 3, A) + >>> CVP.babai(A, (292633475057909760, 256, 256)) + (292633475057909760, 296, 405) + """ A = IntegerMatrix(B.nrows + 1, B.ncols + 1) for i in range(B.nrows): @@ -59,12 +66,17 @@ def babai(B, t, *args, **kwargs): LLL.reduction(A, *args, **kwargs) # now call LLL to run Babai + # HACK: LLL might have done some swaps, but it shouldn't have! + for row in range(A.nrows): + if A[row, -1] != 0: + break + v = [0] * len(t) - if A[-1, -1] > 0: + if A[row, -1] > 0: for i in range(len(t)): - v[i] = t[i] - A[-1][i] + v[i] = t[i] - A[row][i] else: for i in range(len(t)): - v[i] = t[i] + A[-1][i] + v[i] = t[i] + A[row][i] return tuple(v)