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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
# -*- coding: utf-8 -*-
from fpylll import GSO, IntegerMatrix, LLL
from fpylll.config import float_types, int_types
from copy import copy
import sys
import tools
if sys.maxsize > 2 ** 32:
dimensions = ((0, 0), (1, 1), (2, 2), (3, 3), (10, 10), (50, 50), (60, 60))
else:
# https://github.com/fplll/fpylll/issues/112
dimensions = ((0, 0), (1, 1), (2, 2), (3, 3), (10, 10), (20, 20), (30, 30))
def make_integer_matrix(m, n, int_type="mpz"):
A = IntegerMatrix(m, n, int_type=int_type)
A.randomize("qary", bits=20, k=min(m, n) // 2)
return A
def test_lll_init():
for m, n in dimensions:
A = make_integer_matrix(m, n)
for float_type in float_types:
M = GSO.Mat(copy(A), float_type=float_type)
lll = LLL.Reduction(M)
del lll
def test_lll_lll():
for m, n in dimensions:
A = make_integer_matrix(m, n)
for int_type in int_types:
AA = IntegerMatrix.from_matrix(A, int_type=int_type)
b00 = []
for float_type in float_types:
B = copy(AA)
M = GSO.Mat(B, float_type=float_type)
lll = LLL.Reduction(M)
lll()
if (m, n) == (0, 0):
continue
b00.append(B[0, 0])
for i in range(1, len(b00)):
assert b00[0] == b00[i]
def test_lll_gram_lll_coherence():
"""
Test if LLL is coherent if it is given a matrix A or its associated
Gram matrix A*A^T
We should have Gram(LLL_basis(A)) = LLL_Gram(Gram(A)).
"""
for m, n in dimensions:
for int_type in int_types:
A = make_integer_matrix(m, n)
G = tools.compute_gram(A)
for float_type in float_types:
M_A = GSO.Mat(A, float_type=float_type, gram=False)
lll_A = LLL.Reduction(M_A)
M_G = GSO.Mat(G, float_type=float_type, gram=True)
lll_G = LLL.Reduction(M_G)
# A modified in place
lll_A()
# G modified in place
lll_G()
G_updated = tools.compute_gram(A)
if (m, n) == (0, 0):
continue
for i in range(m):
for j in range(i + 1):
assert G_updated[i, j] == G[i, j]
|