def svp_kernel(arg0, params=None, seed=None): # Pool.map only supports a single parameter if params is None and seed is None: n, params, seed = arg0 else: n = arg0 params = copy.copy(params) challenge_seed = params.pop("challenge_seed") alg = params.pop("svp/alg") workout_params = pop_prefixed_params("workout/", params) pump_params = pop_prefixed_params("pump/", params) goal_r0 = 1.001 * load_svpchallenge_norm(n, s=challenge_seed) A, bkz = load_svpchallenge_and_randomize(n, s=challenge_seed, seed=seed) g6k = Siever(A, params, seed=seed) tracer = SieveTreeTracer(g6k, root_label=("svp-exact", n), start_clocks=True) if alg == "enum": assert len(workout_params) + len(pump_params) == 0 bkz_params = fplll_bkz.Param( block_size=n, max_loops=1, strategies=fplll_bkz.DEFAULT_STRATEGY, flags=fplll_bkz.GH_BND, ) svp_enum(bkz, bkz_params, goal_r0) flast = 0 elif alg == "duc18": assert len(workout_params) + len(pump_params) == 0 flast = ducas18(g6k, tracer, goal=goal_r0) elif alg == "workout": flast = workout(g6k, tracer, 0, n, goal_r0=goal_r0, pump_params=pump_params, **workout_params) else: raise ValueError("Unrecognized algorithm for SVP") r0 = bkz.M.get_r(0, 0) if alg == "enum" else g6k.M.get_r(0, 0) if r0 > goal_r0: raise ValueError("Did not reach the goal") if 1.002 * r0 < goal_r0: raise ValueError( "Found a vector shorter than the goal for n=%d s=%d." % (n, challenge_seed)) tracer.exit() stat = tracer.trace stat.data["flast"] = flast return stat
def svp_kernel(arg0, params=None, seed=None): # Pool.map only supports a single parameter if params is None and seed is None: n, params, seed = arg0 else: n = arg0 params = copy.copy(params) load_matrix = params.pop("load_matrix") alg = params.pop("svp/alg") goal_r0 = 1.001 * params.pop('goal_r0') workout_params = pop_prefixed_params("workout/", params) pump_params = pop_prefixed_params("pump/", params) verbose = params.pop("verbose") if verbose and alg == "workout": workout_params["verbose"] = True A, bkz = load_matrix_file(load_matrix, randomize=True, seed=seed, float_type="double") if verbose: print(("Loaded file '%s'" % load_matrix)) g6k = Siever(A, params, seed=seed) tracer = SieveTreeTracer(g6k, root_label=("svp-exact", n), start_clocks=True) if alg == "enum": assert len(workout_params) + len(pump_params) == 0 bkz_params = fplll_bkz.Param(block_size=n, max_loops=1, strategies=fplll_bkz.DEFAULT_STRATEGY, flags=fplll_bkz.GH_BND) svp_enum(bkz, bkz_params, goal_r0) flast = -1 elif alg == "duc18": assert len(workout_params) + len(pump_params) == 0 flast = ducas18(g6k, tracer, goal=goal_r0) elif alg == "workout": flast = workout(g6k, tracer, 0, n, goal_r0=goal_r0, pump_params=pump_params, **workout_params) else: raise ValueError("Unrecognized algorithm for SVP") r0 = bkz.M.get_r(0, 0) if alg == "enum" else g6k.M.get_r(0, 0) if r0 > goal_r0: raise ValueError('Did not reach the goal') if 1.002 * r0 < goal_r0: raise ValueError( 'Found a vector(%d) shorter than the goal(%d) for n=%d.' % (r0, goal_r0, n)) if verbose: print("sol %d, %s" % (n, A[0])) tracer.exit() stat = tracer.trace stat.data["flast"] = flast tracer.trace.data['res'] = A return stat