def __call__(self, params, min_row=0, max_row=-1): """Run the BKZ algorithm with parameters `param`. :param params: BKZ parameters :param min_row: start processing in this row :param max_row: stop processing in this row (exclusive) """ tracer = BKZTreeTracer(self, verbosity=params.flags & BKZ.VERBOSE, start_clocks=True) if params.flags & BKZ.AUTO_ABORT: auto_abort = BKZ.AutoAbort(self.M, self.A.nrows) cputime_start = time.clock() with tracer.context("lll"): self.lll_obj() i = 0 while True: with tracer.context("tour", i): clean = self.tour(params, min_row, max_row, tracer) i += 1 if clean or params.block_size >= self.A.nrows: break if (params.flags & BKZ.AUTO_ABORT) and auto_abort.test_abort(): break if (params.flags & BKZ.MAX_LOOPS) and i >= params.max_loops: break if (params.flags & BKZ.MAX_TIME) and time.clock() - cputime_start >= params.max_time: break tracer.exit() self.trace = tracer.trace return clean
def __call__(cls, M, predicate, block_size, invalidate_cache=lambda: None, threads=1, max_loops=8, **kwds): params = SieverParams(threads=threads) g6k = Siever(M, params) tracer = SieveTreeTracer(g6k, root_label="bkz-sieve", start_clocks=True) for b in range(20, block_size + 1, 10): pump_n_jump_bkz_tour(g6k, tracer, b, pump_params={"down_sieve": True}) auto_abort = BKZ.AutoAbort(M, M.d) found, ntests, solution = False, 0, None for tour in range(max_loops): pump_n_jump_bkz_tour(g6k, tracer, block_size, pump_params={"down_sieve": True}) invalidate_cache() if auto_abort.test_abort(): break with tracer.context("check"): for i, v in enumerate(M.B): ntests += 1 if predicate(v, standard_basis=True): solution = tuple([int(v_) for v_ in v]) found = True break if found: break tracer.exit() b0, b0e = M.get_r_exp(0, 0) return USVPPredSolverResults( success=found, ntests=ntests, solution=solution, b0=b0**(0.5) * 2**(b0e / 2.0), cputime=tracer.trace.data["cputime"], walltime=tracer.trace.data["walltime"], data=tracer.trace, )
def __call__(cls, M, predicate, block_size, invalidate_cache=lambda: None, max_loops=8, threads=1, **kwds): bkz = BKZ2(M) if block_size > STRATEGIES_MAX_DIM: warnings.warn( "reducing block size to {max}".format(max=STRATEGIES_MAX_DIM)) block_size = STRATEGIES_MAX_DIM FPLLL.set_threads(threads) params = BKZ.EasyParam(block_size=block_size, **kwds) auto_abort = BKZ.AutoAbort(M, M.d) tracer = BKZTreeTracer(bkz, root_label="bkz_enum", start_clocks=True) found, ntests, solution = False, 0, None for tour in range(max_loops): bkz.tour(params) if auto_abort.test_abort(): break invalidate_cache() with tracer.context("check"): for i, v in enumerate(bkz.M.B): ntests += 1 if predicate(v, standard_basis=True): found = True solution = tuple([int(v_) for v_ in v]) break if found: break FPLLL.set_threads(1) tracer.exit() b0, b0e = bkz.M.get_r_exp(0, 0) return USVPPredSolverResults( success=found, solution=solution, ntests=ntests, b0=b0**(0.5) * 2**(b0e / 2.0), cputime=tracer.trace.data["cputime"], walltime=tracer.trace.data["walltime"], data=tracer.trace, )
def __call__(self, block_size): """Perform BKZ reduction with given``block_size``. Nothing is returned, the matrix ``A`` given during construction is modified in-place. :param block_size: an integer > 2 """ self.m.discover_all_rows() auto_abort = BKZ.AutoAbort(self.m, self.A.nrows) while True: clean = self.bkz_loop(block_size, 0, self.A.nrows) if clean: break if auto_abort.test_abort(): break
def __call__(self, params, min_row=0, max_row=-1, tracer=False): """Run the BKZ algorithm with parameters `param`. :param params: BKZ parameters :param min_row: start processing in this row :param max_row: stop processing in this row (exclusive) :param tracer: see ``normalize_tracer`` for accepted values TESTS:: >>> from fpylll import * >>> A = IntegerMatrix.random(60, "qary", k=30, q=127) >>> from fpylll.algorithms.bkz import BKZReduction >>> bkz = BKZReduction(A) >>> _ = bkz(BKZ.EasyParam(10), tracer=True); bkz.trace is None False >>> _ = bkz(BKZ.EasyParam(10), tracer=False); bkz.trace is None True """ tracer = normalize_tracer(tracer) try: label = params["name"] except KeyError: label = "bkz" if not isinstance(tracer, Tracer): tracer = tracer( self, root_label=label, verbosity=params.flags & BKZ.VERBOSE, start_clocks=True, max_depth=2, ) if params.flags & BKZ.AUTO_ABORT: auto_abort = BKZ.AutoAbort(self.M, self.A.nrows) cputime_start = process_time() with tracer.context("lll"): self.lll_obj() i = 0 while True: with tracer.context("tour", i, dump_gso=params.flags & BKZ.DUMP_GSO): clean = self.tour(params, min_row, max_row, tracer) i += 1 if clean or params.block_size >= self.A.nrows: break if (params.flags & BKZ.AUTO_ABORT) and auto_abort.test_abort(): break if (params.flags & BKZ.MAX_LOOPS) and i >= params.max_loops: break if (params.flags & BKZ.MAX_TIME ) and process_time() - cputime_start >= params.max_time: break tracer.exit() try: self.trace = tracer.trace except AttributeError: self.trace = None return clean