Coverage for src\pqlattice\lattice\_gso.py: 100%
20 statements
« prev ^ index » next coverage.py v7.11.0, created at 2026-01-11 23:45 +0100
« prev ^ index » next coverage.py v7.11.0, created at 2026-01-11 23:45 +0100
1from fractions import Fraction
3import numpy as np
5from .._utils import as_rational
6from ..typing import Matrix, SquareMatrix, Vector, validate_aliases
9@validate_aliases
10def project_coeffs(q: Vector, b: Vector) -> Fraction:
11 if np.dot(q, q) == 0:
12 return Fraction(0, 1)
14 return np.dot(b, q) / np.dot(q, q)
17@validate_aliases
18def gso(B: Matrix) -> tuple[Matrix, SquareMatrix]:
19 """_summary_
21 Parameters
22 ----------
23 B : Matrix
24 _description_
26 Returns
27 -------
28 tuple[Matrix, SquareMatrix]
29 _description_
30 """
31 rows, _ = B.shape
33 B_star: Matrix = as_rational(B)
34 U: SquareMatrix = as_rational(np.identity(rows))
36 for j in range(1, rows):
37 b: Vector = B_star[j].copy()
38 for i in range(j):
39 U[i, j] = project_coeffs(B_star[i], b)
40 B_star[j] -= U[i][j] * B_star[i]
42 # B = U.T @ B_star
43 return B_star, U