1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
# -*- coding: utf-8 -*-
from fpylll import IntegerMatrix, GSO, LLL, Enumeration
from fpylll.config import float_types, int_types
from copy import copy
import tools
def make_integer_matrix(m, n, int_type="mpz"):
A = IntegerMatrix(m, n, int_type=int_type)
A.randomize("qary", k=m // 2, bits=m)
return A
def test_enum_init():
for int_type in int_types:
A = make_integer_matrix(20, 20, int_type=int_type)
for float_type in float_types:
M = GSO.Mat(copy(A), float_type=float_type)
enum_obj = Enumeration(M)
del enum_obj
def test_enum_enum():
for int_type in int_types:
A = make_integer_matrix(20, 20, int_type=int_type)
LLL.reduction(A)
for float_type in float_types:
M = GSO.Mat(copy(A), float_type=float_type)
M.update_gso()
enum_obj = Enumeration(M)
enum_obj.enumerate(0, M.d, M.get_r(0, 0), 0)
def test_enum_gram_coherence():
"""
Test if the enumeration algorithm is consistent with the Gram matrices
The vectors returned by the enumeration should be the same wether a
lattice is given by its basis or by its Gram matrix
"""
dimensions = ((3, 3), (10, 10), (20, 20), (25, 25))
for m, n in dimensions:
for int_type in int_types:
A = make_integer_matrix(m, n, int_type=int_type)
LLL.reduction(A)
G = tools.compute_gram(A)
for float_type in float_types:
M_A = GSO.Mat(copy(A), float_type=float_type, gram=False)
M_G = GSO.Mat(copy(G), float_type=float_type, gram=True)
M_A.update_gso()
M_G.update_gso()
enum_obj_a = Enumeration(M_A, nr_solutions=min(m, 5))
shortest_vectors_a = enum_obj_a.enumerate(0, M_A.d, M_A.get_r(0, 0), 0)
enum_obj_g = Enumeration(M_G, nr_solutions=min(m, 5))
shortest_vectors_g = enum_obj_g.enumerate(0, M_G.d, M_G.get_r(0, 0), 0)
for i in range(len(shortest_vectors_a)):
assert shortest_vectors_a[i] == shortest_vectors_g[i]
|