Coverage for src/pqlattice/lattice/_lll.py: 80%
41 statements
« prev ^ index » next coverage.py v7.11.0, created at 2026-01-12 21:36 +0100
« prev ^ index » next coverage.py v7.11.0, created at 2026-01-12 21:36 +0100
1from fractions import Fraction
3import numpy as np
5from .._utils import as_integer
6from ..typing import Matrix, SquareMatrix, validate_aliases
7from ._gso import gso, project_coeffs
10@validate_aliases
11def lll(lattice_basis: Matrix, delta: float = 0.99) -> Matrix:
12 """_summary_
14 Parameters
15 ----------
16 lattice_basis : Matrix
17 _description_
18 delta : float, optional
19 _description_, by default 0.99
21 Returns
22 -------
23 Matrix
24 _description_
25 """
26 rows, _ = lattice_basis.shape
27 B: Matrix = as_integer(lattice_basis)
28 while True:
29 B_star, _ = gso(B)
30 # Reduction Step
31 for i in range(1, rows):
32 for j in range(i - 1, -1, -1):
33 c_ij = round(project_coeffs(B_star[j], B[i]))
34 assert isinstance(c_ij, int)
35 B[i] = B[i] - c_ij * B[j]
36 # Swap step
37 exists = False
38 for i in range(rows - 1):
39 u = project_coeffs(B_star[i], B[i + 1])
40 r = u * B_star[i] + B_star[i + 1]
41 if delta * np.dot(B_star[i], B_star[i]) > np.dot(r, r):
42 B[[i, i + 1]] = B[[i + 1, i]]
43 exists = True
44 break
45 if not exists:
46 break
47 return B
50@validate_aliases
51def is_size_reduced(lattice_basis: SquareMatrix) -> bool:
52 """_summary_
54 Parameters
55 ----------
56 lattice_basis : SquareMatrix
57 _description_
59 Returns
60 -------
61 bool
62 _description_
63 """
64 _, U = gso(lattice_basis)
65 return bool(np.all(np.triu(U, 1) <= Fraction(1, 2)))
68@validate_aliases
69def lovasz_condition(lattice_basis: SquareMatrix, delta: float) -> bool:
70 norm2 = lambda a: np.sum(a * a, axis=1) # type: ignore
71 G, U = gso(lattice_basis)
72 lhs = delta * norm2(G[:-1])
73 rhs = norm2(G[1:] + np.diag(U, 1)[:, np.newaxis] * G[:-1])
74 return bool(np.all(lhs <= rhs))
77@validate_aliases
78def is_lll_reduced(lattice_basis: SquareMatrix, delta: float = 0.99) -> bool:
79 """_summary_
81 Parameters
82 ----------
83 lattice_basis : SquareMatrix
84 _description_
85 delta : float, optional
86 _description_, by default 0.99
88 Returns
89 -------
90 bool
91 _description_
92 """
93 return is_size_reduced(lattice_basis) and lovasz_condition(lattice_basis, delta)