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
|
# -*- coding: utf-8 -*-
from fpylll import GSO, IntegerMatrix, BKZ, LLL
from fpylll.config import float_types
from copy import copy
import tools
dimensions = ((0, 0), (1, 1), (2, 2), (3, 3), (10, 10), (50, 50), (60, 60),)
def make_integer_matrix(m, n, int_type="mpz"):
A = IntegerMatrix(m, n, int_type=int_type)
A.randomize("uniform", bits=20)
return A
def test_bkz_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_obj = LLL.Reduction(M)
param = BKZ.Param(block_size=3, strategies=BKZ.DEFAULT_STRATEGY)
bkz = BKZ.Reduction(M, lll_obj, param)
del bkz
def test_bkz_bkz():
for m, n in dimensions:
if m < 2 or n < 2:
continue
A = make_integer_matrix(m, n)
b00 = []
for float_type in float_types:
B = copy(A)
M = GSO.Mat(B, float_type=float_type)
lll_obj = LLL.Reduction(M)
param = BKZ.Param(block_size=min(m, 40), strategies=BKZ.DEFAULT_STRATEGY)
bkz = BKZ.Reduction(M, lll_obj, param)
bkz()
b00.append(B[0, 0])
for i in range(1, len(b00)):
assert b00[0] == b00[i]
def test_bkz_gram_bkz_coherence():
"""
Test if BKZ is coherent if it is given a matrix A or its associated
Gram matrix A*A^T
We should have Gram(BKZ_basis(A)) = BKZ_Gram(Gram(A)).
"""
for m, n in dimensions:
if m < 2 or n < 2:
continue
for float_type in float_types:
A = make_integer_matrix(m, n)
G = tools.compute_gram(A)
GSO_A = GSO.Mat(A, float_type=float_type)
GSO_G = GSO.Mat(G, float_type=float_type, gram=True)
lll_obj_a = LLL.Reduction(GSO_A)
lll_obj_g = LLL.Reduction(GSO_G)
param = BKZ.Param(block_size=min(m, 40), strategies=BKZ.DEFAULT_STRATEGY)
bkz_a = BKZ.Reduction(GSO_A, lll_obj_a, param)
bkz_g = BKZ.Reduction(GSO_G, lll_obj_g, param)
bkz_a()
bkz_g()
G_updated = tools.compute_gram(A)
for i in range(m):
for j in range(i + 1):
assert G_updated[i, j] == G[i, j]
|