Skip to content

Commit

Permalink
Merge pull request #77 from fplll/zt-long
Browse files Browse the repository at this point in the history
IntegerMatrix etc over longs
  • Loading branch information
malb committed Jul 12, 2017
2 parents 79c54f2 + 7735ab1 commit 3b7207c
Show file tree
Hide file tree
Showing 22 changed files with 1,708 additions and 424 deletions.
3 changes: 1 addition & 2 deletions src/fpylll/algorithms/bkz.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,7 @@ def __init__(self, A):

if M is None and L is None:
# run LLL first, but only if a matrix was passed
wrapper = LLL.Wrapper(A)
wrapper()
LLL.reduction(A)

self.A = A
if M is None:
Expand Down
2 changes: 2 additions & 0 deletions src/fpylll/config.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,7 @@ ELSE:
have_qd = False
float_types = float_types + ("dpe", "mpfr")

int_types = ("long", "mpz")

default_strategy = default_strategy_c().c_str()
default_strategy_path = default_strategy_path_c().c_str()
6 changes: 5 additions & 1 deletion src/fpylll/fplll/bkz.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ from fplll cimport RED_BKZ_LOOPS_LIMIT, RED_BKZ_TIME_LIMIT
from fplll cimport bkz_reduction as bkz_reduction_c
from fplll cimport dpe_t
from fplll cimport get_red_status_str
from fplll cimport ZT_MPZ
from fpylll.gmp.mpz cimport mpz_t
from fpylll.mpfr.mpfr cimport mpfr_t
from fpylll.util cimport check_delta, check_precision, check_float_type
Expand Down Expand Up @@ -796,9 +797,12 @@ def bkz_reduction(IntegerMatrix B, BKZParam o, float_type=None, int precision=0)
cdef FloatType float_type_ = check_float_type(float_type)
cdef int r = 0

if B._type != ZT_MPZ:
raise NotImplementedError("C++ BKZ is not implemented over longs, try the Python version.")

with nogil:
sig_on()
r = bkz_reduction_c(B._core, NULL, o.o[0], float_type_, precision)
r = bkz_reduction_c(B._core.mpz, NULL, o.o[0], float_type_, precision)
sig_off()

if r and r not in (RED_BKZ_LOOPS_LIMIT, RED_BKZ_TIME_LIMIT):
Expand Down
130 changes: 104 additions & 26 deletions src/fpylll/fplll/decl.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ IF HAVE_QD:

from fplll cimport dpe_t
from fplll cimport Z_NR, FP_NR
from fplll cimport MatGSO, LLLReduction, BKZAutoAbort, BKZReduction, Enumeration
from fplll cimport ZZ_mat, MatGSO, LLLReduction, BKZAutoAbort, BKZReduction, Enumeration
from fplll cimport GaussSieve
from fplll cimport FastEvaluator, FastErrorBoundedEvaluator, Pruner

from libcpp.vector cimport vector
Expand All @@ -31,18 +32,29 @@ IF HAVE_QD:

IF HAVE_QD:
ctypedef enum fplll_gso_type_t:
gso_mpz_d = 1
gso_mpz_ld = 2
gso_mpz_dpe = 4
gso_mpz_dd = 8
gso_mpz_qd = 16
gso_mpz_mpfr = 32
gso_mpz_d = 1
gso_mpz_ld = 2
gso_mpz_dpe = 4
gso_mpz_dd = 8
gso_mpz_qd = 16
gso_mpz_mpfr = 32
gso_long_d = 64
gso_long_ld = 128
gso_long_dpe = 256
gso_long_dd = 512
gso_long_qd = 1024
gso_long_mpfr = 2048

ELSE:
ctypedef enum fplll_gso_type_t:
gso_mpz_d = 1
gso_mpz_ld = 2
gso_mpz_dpe = 4
gso_mpz_mpfr = 32
gso_mpz_d = 1
gso_mpz_ld = 2
gso_mpz_dpe = 4
gso_mpz_mpfr = 32
gso_long_d = 64
gso_long_ld = 128
gso_long_dpe = 256
gso_long_mpfr = 2048

IF HAVE_QD:
ctypedef enum fplll_nr_type_t:
Expand All @@ -59,6 +71,18 @@ ELSE:
nr_dpe = 4
nr_mpfr = 32

ctypedef enum fplll_z_type_t:
z_long = 1
z_mpz = 2

ctypedef union zz_mat_core_t:
ZZ_mat[mpz_t] *mpz
ZZ_mat[long] *long

ctypedef union gauss_sieve_core_t:
GaussSieve[mpz_t, FP_NR[double]] *mpz_d
GaussSieve[long, FP_NR[double]] *long_d

IF HAVE_LONG_DOUBLE:
IF HAVE_QD:
# we cannot use a union because of non-trivial constructors
Expand All @@ -84,12 +108,22 @@ IF HAVE_LONG_DOUBLE:
MatGSO[Z_NR[mpz_t], FP_NR[dd_t]] *mpz_dd
MatGSO[Z_NR[mpz_t], FP_NR[qd_t]] *mpz_qd
MatGSO[Z_NR[mpz_t], FP_NR[mpfr_t]] *mpz_mpfr
MatGSO[Z_NR[long], FP_NR[d_t]] *long_d
MatGSO[Z_NR[long], FP_NR[ld_t]] *long_ld
MatGSO[Z_NR[long], FP_NR[dpe_t]] *long_dpe
MatGSO[Z_NR[long], FP_NR[dd_t]] *long_dd
MatGSO[Z_NR[long], FP_NR[qd_t]] *long_qd
MatGSO[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr
ELSE:
ctypedef union mat_gso_core_t:
MatGSO[Z_NR[mpz_t], FP_NR[d_t]] *mpz_d
MatGSO[Z_NR[mpz_t], FP_NR[ld_t]] *mpz_ld
MatGSO[Z_NR[mpz_t], FP_NR[dpe_t]] *mpz_dpe
MatGSO[Z_NR[mpz_t], FP_NR[mpfr_t]] *mpz_mpfr
MatGSO[Z_NR[long], FP_NR[d_t]] *long_d
MatGSO[Z_NR[long], FP_NR[ld_t]] *long_ld
MatGSO[Z_NR[long], FP_NR[dpe_t]] *long_dpe
MatGSO[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr

IF HAVE_QD:
ctypedef union lll_reduction_core_t:
Expand All @@ -99,12 +133,22 @@ IF HAVE_LONG_DOUBLE:
LLLReduction[Z_NR[mpz_t], FP_NR[dd_t]] *mpz_dd
LLLReduction[Z_NR[mpz_t], FP_NR[qd_t]] *mpz_qd
LLLReduction[Z_NR[mpz_t], FP_NR[mpfr_t]] *mpz_mpfr
LLLReduction[Z_NR[long], FP_NR[d_t]] *long_d
LLLReduction[Z_NR[long], FP_NR[ld_t]] *long_ld
LLLReduction[Z_NR[long], FP_NR[dpe_t]] *long_dpe
LLLReduction[Z_NR[long], FP_NR[dd_t]] *long_dd
LLLReduction[Z_NR[long], FP_NR[qd_t]] *long_qd
LLLReduction[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr
ELSE:
ctypedef union lll_reduction_core_t:
LLLReduction[Z_NR[mpz_t], FP_NR[d_t]] *mpz_d
LLLReduction[Z_NR[mpz_t], FP_NR[ld_t]] *mpz_ld
LLLReduction[Z_NR[mpz_t], FP_NR[dpe_t]] *mpz_dpe
LLLReduction[Z_NR[mpz_t], FP_NR[mpfr_t]] *mpz_mpfr
LLLReduction[Z_NR[long], FP_NR[d_t]] *long_d
LLLReduction[Z_NR[long], FP_NR[ld_t]] *long_ld
LLLReduction[Z_NR[long], FP_NR[dpe_t]] *long_dpe
LLLReduction[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr

IF HAVE_QD:
ctypedef union bkz_auto_abort_core_t:
Expand Down Expand Up @@ -153,18 +197,28 @@ IF HAVE_LONG_DOUBLE:

IF HAVE_QD:
ctypedef union enumeration_core_t:
Enumeration[FP_NR[d_t]] *d
Enumeration[FP_NR[ld_t]] *ld
Enumeration[FP_NR[dpe_t]] *dpe
Enumeration[FP_NR[dd_t]] *dd
Enumeration[FP_NR[qd_t]] *qd
Enumeration[FP_NR[mpfr_t]] *mpfr
Enumeration[Z_NR[mpz_t], FP_NR[d_t]] *mpz_d
Enumeration[Z_NR[mpz_t], FP_NR[ld_t]] *mpz_ld
Enumeration[Z_NR[mpz_t], FP_NR[dpe_t]] *mpz_dpe
Enumeration[Z_NR[mpz_t], FP_NR[dd_t]] *mpz_dd
Enumeration[Z_NR[mpz_t], FP_NR[qd_t]] *mpz_qd
Enumeration[Z_NR[mpz_t], FP_NR[mpfr_t]] *mpz_mpfr
Enumeration[Z_NR[long], FP_NR[d_t]] *long_d
Enumeration[Z_NR[long], FP_NR[ld_t]] *long_ld
Enumeration[Z_NR[long], FP_NR[dpe_t]] *long_dpe
Enumeration[Z_NR[long], FP_NR[dd_t]] *long_dd
Enumeration[Z_NR[long], FP_NR[qd_t]] *long_qd
Enumeration[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr
ELSE:
ctypedef union enumeration_core_t:
Enumeration[FP_NR[d_t]] *d
Enumeration[FP_NR[ld_t]] *ld
Enumeration[FP_NR[dpe_t]] *dpe
Enumeration[FP_NR[mpfr_t]] *mpfr
Enumeration[Z_NR[mpz_t], FP_NR[d_t]] *mpz_d
Enumeration[Z_NR[mpz_t], FP_NR[ld_t]] *mpz_ld
Enumeration[Z_NR[mpz_t], FP_NR[dpe_t]] *mpz_dpe
Enumeration[Z_NR[mpz_t], FP_NR[mpfr_t]] *mpz_mpfr
Enumeration[Z_NR[long], FP_NR[d_t]] *long_d
Enumeration[Z_NR[long], FP_NR[ld_t]] *long_ld
Enumeration[Z_NR[long], FP_NR[dpe_t]] *long_dpe
Enumeration[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr

IF HAVE_QD:
ctypedef union pruner_core_t:
Expand Down Expand Up @@ -218,11 +272,19 @@ ELSE:
MatGSO[Z_NR[mpz_t], FP_NR[dd_t]] *mpz_dd
MatGSO[Z_NR[mpz_t], FP_NR[qd_t]] *mpz_qd
MatGSO[Z_NR[mpz_t], FP_NR[mpfr_t]] *mpz_mpfr
MatGSO[Z_NR[long], FP_NR[d_t]] *long_d
MatGSO[Z_NR[long], FP_NR[dpe_t]] *long_dpe
MatGSO[Z_NR[long], FP_NR[dd_t]] *long_dd
MatGSO[Z_NR[long], FP_NR[qd_t]] *long_qd
MatGSO[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr
ELSE:
ctypedef union mat_gso_core_t:
MatGSO[Z_NR[mpz_t], FP_NR[d_t]] *mpz_d
MatGSO[Z_NR[mpz_t], FP_NR[dpe_t]] *mpz_dpe
MatGSO[Z_NR[mpz_t], FP_NR[mpfr_t]] *mpz_mpfr
MatGSO[Z_NR[long], FP_NR[d_t]] *long_d
MatGSO[Z_NR[long], FP_NR[dpe_t]] *long_dpe
MatGSO[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr

IF HAVE_QD:
ctypedef union lll_reduction_core_t:
Expand All @@ -231,11 +293,19 @@ ELSE:
LLLReduction[Z_NR[mpz_t], FP_NR[dd_t]] *mpz_dd
LLLReduction[Z_NR[mpz_t], FP_NR[qd_t]] *mpz_qd
LLLReduction[Z_NR[mpz_t], FP_NR[mpfr_t]] *mpz_mpfr
LLLReduction[Z_NR[long], FP_NR[d_t]] *long_d
LLLReduction[Z_NR[long], FP_NR[dpe_t]] *long_dpe
LLLReduction[Z_NR[long], FP_NR[dd_t]] *long_dd
LLLReduction[Z_NR[long], FP_NR[qd_t]] *long_qd
LLLReduction[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr
ELSE:
ctypedef union lll_reduction_core_t:
LLLReduction[Z_NR[mpz_t], FP_NR[d_t]] *mpz_d
LLLReduction[Z_NR[mpz_t], FP_NR[dpe_t]] *mpz_dpe
LLLReduction[Z_NR[mpz_t], FP_NR[mpfr_t]] *mpz_mpfr
LLLReduction[Z_NR[long], FP_NR[d_t]] *long_d
LLLReduction[Z_NR[long], FP_NR[dpe_t]] *long_dpe
LLLReduction[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr

IF HAVE_QD:
ctypedef union bkz_auto_abort_core_t:
Expand Down Expand Up @@ -278,16 +348,24 @@ ELSE:

IF HAVE_QD:
ctypedef union enumeration_core_t:
Enumeration[FP_NR[d_t]] *d
Enumeration[FP_NR[dpe_t]] *dpe
Enumeration[FP_NR[dd_t]] *dd
Enumeration[FP_NR[qd_t]] *qd
Enumeration[FP_NR[mpfr_t]] *mpfr
Enumeration[Z_NR[mpz_t], FP_NR[d_t]] *mpz_d
Enumeration[Z_NR[mpz_t], FP_NR[dpe_t]] *mpz_dpe
Enumeration[Z_NR[mpz_t], FP_NR[dd_t]] *mpz_dd
Enumeration[Z_NR[mpz_t], FP_NR[qd_t]] *mpz_qd
Enumeration[Z_NR[mpz_t], FP_NR[mpfr_t]] *mpz_mpfr
Enumeration[Z_NR[long], FP_NR[d_t]] *long_d
Enumeration[Z_NR[long], FP_NR[dpe_t]] *long_dpe
Enumeration[Z_NR[long], FP_NR[dd_t]] *long_dd
Enumeration[Z_NR[long], FP_NR[qd_t]] *long_qd
Enumeration[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr
ELSE:
ctypedef union enumeration_core_t:
Enumeration[FP_NR[d_t]] *d
Enumeration[FP_NR[dpe_t]] *dpe
Enumeration[FP_NR[mpfr_t]] *mpfr
Enumeration[Z_NR[long], FP_NR[d_t]] *long_d
Enumeration[Z_NR[long], FP_NR[dpe_t]] *long_dpe
Enumeration[Z_NR[long], FP_NR[mpfr_t]] *long_mpfr

IF HAVE_QD:
ctypedef union pruner_core_t:
Expand Down

0 comments on commit 3b7207c

Please sign in to comment.