International Association for Cryptologic Research

International Association
for Cryptologic Research

Advances in Cryptology – ASIACRYPT 2025

Towards a Modern LLL Implementation


README

BLASter

BLASter is a proof of concept of an LLL-like lattice reduction algorithm that uses:

Disclaimer

The goal of this software is to showcase speed ups that are possible in lattice reduction software.
This software is a proof of concept!

In particular, we do not:

We do:

Requirements

Optional:

Building

  1. (optional) Run make eigen3 to install the Eigen (version 3.4.0) in a subdirectory.
  2. (optional) Run make venv to create a local virtual environment and install the required python3 modules.
  3. Run make to compile all the Cython files in core/.

Debugging

Running

Note: you first need to build the software, see above.

You can run the software from the command line by executing the script src/app.py.
For example, ./python3 src/app.py -pvi INPUTFILE LLL-reduces a lattice in file INPUTFILE and outputs it to standard output, and provides additional information to standard error.

To use the software from within your own Python code, call the function reduce in the file src/blaster.py.

Input file format

The lattice input format is the same as what is supported by NTL, FPLLL and flatter.
That is, to specify a rank-k lattice in n-dimensional Euclidean space, the file or input should be of the form:

[[a_11 a_12 ... a_1n]
[a_21 a_22 ... a_2n]
...
[a_k1 a_k2 ... a_kn]]

Notes:

Examples

Run ./python3 src/app.py -h to see all available command line arguments.

LLL

To generate one BLASter data point in Figure 3, run the following command, which should give (up to timing differences) the following output.

$ time latticegen -randseed 0 q 128 64 631 q | ./python3 src/app.py -pqv
E[∥b₁∥] ~ 393.44 < 631 (GH: λ₁ ~ 68.77)
........
Iterations: 8
t_{QR-decomp. }=     0.006s
t_{LLL-red.   }=     0.041s
t_{Seysen-red.}=     0.013s
t_{Matrix-mul.}=     0.007s
Profile = [8.56 8.66 8.54 8.40 8.32 8.41 8.35 8.23 8.08 8.11 8.05 8.01 7.88 7.84 7.86 7.74 7.72 7.60 7.59 7.70 7.53 7.49 7.40 7.28 7.08 7.10 7.04 7.03 7.07 6.94 6.96 6.79 6.76 6.74 6.60 6.44 6.31 6.23 6.15 6.26 6.22 6.20 6.08 6.06 6.16 6.01 5.83 5.79 5.69 5.55 5.45 5.34 5.36 5.27 5.16 5.37 5.28 5.09 5.01 5.00 4.95 4.76 4.83 4.70 4.57 4.60 4.39 4.34 4.16 4.08 4.12 3.99 4.01 3.91 3.97 3.82 3.75 3.66 3.57 3.58 3.47 3.44 3.45 3.38 3.26 3.20 3.15 3.20 3.07 3.05 2.89 2.87 2.86 2.89 2.74 2.72 2.52 2.39 2.35 2.28 2.16 2.09 1.97 1.87 2.02 2.01 1.97 1.92 1.78 1.60 1.59 1.60 1.57 1.54 1.61 1.46 1.43 1.47 1.34 1.18 1.13 1.08 1.02 0.87 0.80 0.87 0.84 0.79]
RHF = 1.02142^n, slope = -0.063828, ∥b_1∥ = 378.7

real    0m0.747s
user    0m0.501s
sys 0m0.042s

The argument -p outputs the basis profile, i.e., the binary logarithm (log_2) of the norms of the Gram--Schmidt vectors.
The argument -q suppresses outputting the reduced basis to standard output.
The argument -v gives extra information regarding the reduced basis, i.e., root Hermite factor is 1.02142, the slope equals -0.063828, and the first basis vector has norm 378.7.

DeepLLL

To generate one BLASterDeepLLL-4 data point in Figure 6, run:

$ time latticegen -randseed 0 q 1024 512 968665207 q | ./python3 src/app.py -d4 -pqv
E[∥b₁∥] ~ 131183490632416.14 >= 968665207 (GH: λ₁ ~ 240990.35)
.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Iterations: 1045
t_{QR-decomp. }=    94.155s
t_{LLL-red.   }=    24.336s
t_{Seysen-red.}=    69.988s
t_{Matrix-mul.}=   156.098s
Profile = [29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.85 29.76 29.78 29.71 29.69 29.69 29.67 29.63 29.57 29.57 29.65 29.55 29.46 29.53 29.38 29.37 29.26 29.22 29.23 29.14 29.14 29.10 28.93 29.01 28.93 28.80 28.83 28.82 28.74 28.67 28.72 28.62 28.55 28.53 28.38 28.41 28.41 28.27 28.30 28.34 28.33 28.23 28.20 28.19 28.14 28.15 28.11 27.96 27.83 27.86 27.88 27.79 27.75 27.69 27.72 27.59 27.58 27.49 27.59 27.49 27.39 27.36 27.28 27.21 27.18 27.12 27.09 27.04 26.91 27.06 26.92 26.98 26.86 26.88 26.87 26.80 26.79 26.78 26.73 26.71 26.58 26.58 26.49 26.48 26.38 26.37 26.33 26.29 26.25 26.24 26.16 26.06 26.07 26.00 26.00 25.86 25.89 25.89 25.78 25.75 25.68 25.62 25.55 25.63 25.59 25.58 25.43 25.48 25.51 25.38 25.26 25.20 25.24 25.26 25.10 25.17 25.05 25.02 24.98 24.95 24.93 24.83 24.82 24.68 24.73 24.58 24.69 24.58 24.54 24.46 24.45 24.38 24.39 24.35 24.27 24.33 24.19 24.25 24.13 24.11 23.97 24.06 24.01 23.96 23.92 23.86 23.84 23.79 23.68 23.73 23.62 23.57 23.55 23.41 23.36 23.37 23.31 23.30 23.31 23.20 23.12 23.09 23.07 22.97 22.90 22.95 22.84 22.92 22.82 22.82 22.80 22.77 22.63 22.57 22.64 22.55 22.61 22.50 22.51 22.39 22.42 22.26 22.27 22.24 22.17 22.10 22.10 22.03 22.06 22.02 21.87 21.79 21.82 21.71 21.68 21.65 21.60 21.57 21.58 21.50 21.52 21.43 21.51 21.41 21.38 21.31 21.33 21.25 21.19 21.09 21.03 20.93 20.97 20.88 20.83 20.86 20.73 20.72 20.71 20.60 20.61 20.62 20.56 20.45 20.50 20.39 20.38 20.26 20.26 20.29 20.19 20.18 20.15 20.16 19.98 20.00 19.90 19.86 19.90 19.84 19.82 19.86 19.71 19.74 19.66 19.58 19.55 19.43 19.44 19.44 19.41 19.26 19.22 19.27 19.29 19.22 19.10 19.09 19.07 18.95 18.87 18.87 18.85 18.90 18.84 18.71 18.65 18.70 18.60 18.62 18.53 18.49 18.46 18.45 18.42 18.30 18.34 18.32 18.15 18.17 18.15 18.05 18.03 17.93 17.89 17.84 17.83 17.83 17.85 17.66 17.80 17.64 17.61 17.52 17.53 17.52 17.41 17.46 17.44 17.35 17.30 17.29 17.20 17.18 17.11 17.01 16.98 16.98 16.98 16.98 16.93 16.84 16.84 16.73 16.57 16.58 16.53 16.41 16.39 16.39 16.36 16.34 16.36 16.20 16.10 16.18 16.12 16.11 16.09 16.00 15.98 16.02 15.95 15.95 15.89 15.83 15.80 15.77 15.63 15.70 15.62 15.50 15.49 15.47 15.35 15.29 15.28 15.14 15.15 15.05 15.00 14.95 14.94 14.89 14.92 14.81 14.81 14.71 14.73 14.63 14.70 14.65 14.67 14.58 14.48 14.52 14.53 14.40 14.34 14.24 14.31 14.30 14.28 14.20 14.14 14.14 14.06 13.94 13.83 13.89 13.77 13.71 13.67 13.71 13.64 13.52 13.53 13.47 13.45 13.44 13.38 13.37 13.36 13.25 13.28 13.25 13.10 13.02 13.03 13.03 12.95 12.94 12.93 12.89 12.84 12.73 12.78 12.66 12.72 12.66 12.67 12.52 12.55 12.45 12.31 12.36 12.30 12.30 12.11 12.14 12.13 12.03 12.01 12.03 12.01 11.95 11.95 11.91 11.74 11.69 11.82 11.72 11.71 11.54 11.58 11.51 11.53 11.46 11.39 11.34 11.30 11.28 11.17 11.15 11.11 11.09 11.00 10.94 10.93 10.87 10.79 10.76 10.75 10.70 10.62 10.63 10.60 10.61 10.55 10.56 10.56 10.39 10.31 10.39 10.34 10.22 10.19 10.10 10.15 10.05 9.91 10.03 9.90 9.89 9.83 9.74 9.71 9.73 9.64 9.58 9.53 9.47 9.51 9.46 9.37 9.35 9.28 9.29 9.27 9.11 9.17 9.16 9.08 9.15 8.96 8.92 8.81 8.88 8.71 8.79 8.78 8.75 8.69 8.51 8.57 8.48 8.46 8.50 8.46 8.42 8.27 8.20 8.17 8.14 8.03 8.08 8.04 7.93 8.01 7.98 7.97 7.92 7.81 7.84 7.75 7.66 7.73 7.56 7.51 7.55 7.41 7.40 7.36 7.27 7.31 7.31 7.33 7.19 7.16 7.06 7.06 6.98 7.05 6.90 6.91 6.83 6.84 6.73 6.73 6.69 6.61 6.57 6.58 6.61 6.49 6.41 6.36 6.28 6.25 6.28 6.28 6.11 6.09 6.06 5.99 5.93 5.81 5.80 5.85 5.87 5.89 5.80 5.70 5.66 5.63 5.61 5.55 5.50 5.50 5.39 5.34 5.29 5.13 5.24 5.20 5.04 5.21 5.05 5.04 5.02 4.95 4.94 4.86 4.78 4.80 4.75 4.67 4.57 4.61 4.56 4.42 4.47 4.43 4.37 4.33 4.24 4.28 4.16 4.20 4.09 4.05 4.04 4.00 4.00 3.93 3.82 3.88 3.87 3.82 3.66 3.55 3.64 3.67 3.52 3.47 3.39 3.45 3.36 3.38 3.25 3.18 3.17 3.16 3.05 2.93 3.08 2.98 2.97 3.01 2.90 2.86 2.67 2.75 2.73 2.67 2.62 2.55 2.57 2.52 2.44 2.40 2.24 2.33 2.33 2.24 2.21 2.13 2.07 2.01 2.01 1.97 1.87 1.97 1.85 1.79 1.80 1.69 1.67 1.61 1.68 1.51 1.56 1.50 1.39 1.35 1.36 1.35 1.32 1.28 1.23 1.25 1.13 1.00 1.00 0.97 0.99 0.93 0.84 0.85 0.84 0.73 0.70 0.59 0.64 0.57 0.59 0.53 0.42 0.43 0.40 0.39 0.36 0.23 0.17 0.13 0.19 0.14 0.05 0.02 -0.00 -0.07 -0.14 -0.16 -0.21 -0.17 -0.27 -0.30 -0.36 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 -0.00 -0.00 0.00 0.00 -0.00 -0.00 -0.00 -0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00]
RHF = 1.01015^n, slope = -0.036847, ∥b_1∥ = 968665207.0

real    5m47.925s
user    18m12.336s
sys 0m23.005s

(Progressive) BKZ

To generate one BLASterBKZ-60 data point in Figure 3, run the command found below.
This command runs progressive BKZ (with 4-deep-LLL before SVP calls) with increasing block sizes 40, 42, ..., 60 performing one tour per block size.
Moreover, -l will record intermediate progress in the file logfile.csv.

$ time latticegen -randseed 0 q 128 64 631 q | ./python3 src/app.py -b60 -t1 -P2 -l logfile.csv -pqv
E[∥b₁∥] ~ 393.44 < 631 (GH: λ₁ ~ 68.77)
........................
BKZ(β: 40,t: 1/ 1, o:   0): slope=-0.043332, rhf=1.014315.......
BKZ(β: 40,t: 1/ 1, o:  25): slope=-0.042374, rhf=1.014315.....
BKZ(β: 40,t: 1/ 1, o:  50): slope=-0.041580, rhf=1.014195....
BKZ(β: 40,t: 1/ 1, o:  75): slope=-0.041099, rhf=1.013987.
BKZ(β: 40,t: 1/ 1, o: 100): slope=-0.040978, rhf=1.013987...
BKZ(β: 42,t: 1/ 1, o:   0): slope=-0.040810, rhf=1.013356..
BKZ(β: 42,t: 1/ 1, o:  23): slope=-0.040542, rhf=1.013356...
BKZ(β: 42,t: 1/ 1, o:  46): slope=-0.040666, rhf=1.013356..
BKZ(β: 42,t: 1/ 1, o:  69): slope=-0.040395, rhf=1.013356..
BKZ(β: 42,t: 1/ 1, o:  92): slope=-0.040275, rhf=1.012497...
BKZ(β: 44,t: 1/ 1, o:   0): slope=-0.040120, rhf=1.012497....
BKZ(β: 44,t: 1/ 1, o:  21): slope=-0.039930, rhf=1.012497.
BKZ(β: 44,t: 1/ 1, o:  42): slope=-0.039651, rhf=1.012497...
BKZ(β: 44,t: 1/ 1, o:  63): slope=-0.039616, rhf=1.012497..
BKZ(β: 44,t: 1/ 1, o:  84): slope=-0.039546, rhf=1.012497.
BKZ(β: 44,t: 1/ 1, o: 105): slope=-0.039613, rhf=1.012497...
BKZ(β: 46,t: 1/ 1, o:   0): slope=-0.039689, rhf=1.012497....
BKZ(β: 46,t: 1/ 1, o:  19): slope=-0.039445, rhf=1.012497...
BKZ(β: 46,t: 1/ 1, o:  38): slope=-0.039244, rhf=1.012497..
BKZ(β: 46,t: 1/ 1, o:  57): slope=-0.039485, rhf=1.012497....
BKZ(β: 46,t: 1/ 1, o:  76): slope=-0.039283, rhf=1.012497...
BKZ(β: 46,t: 1/ 1, o:  95): slope=-0.039427, rhf=1.012497....
BKZ(β: 48,t: 1/ 1, o:   0): slope=-0.039296, rhf=1.012497.
BKZ(β: 48,t: 1/ 1, o:  17): slope=-0.038946, rhf=1.012497..
BKZ(β: 48,t: 1/ 1, o:  34): slope=-0.038779, rhf=1.012497...
BKZ(β: 48,t: 1/ 1, o:  51): slope=-0.038998, rhf=1.012497...
BKZ(β: 48,t: 1/ 1, o:  68): slope=-0.038829, rhf=1.012497..
BKZ(β: 48,t: 1/ 1, o:  85): slope=-0.038537, rhf=1.012497..
BKZ(β: 50,t: 1/ 1, o:   0): slope=-0.038765, rhf=1.011904..
BKZ(β: 50,t: 1/ 1, o:  15): slope=-0.038361, rhf=1.011904..
BKZ(β: 50,t: 1/ 1, o:  30): slope=-0.038127, rhf=1.011904...
BKZ(β: 50,t: 1/ 1, o:  45): slope=-0.038089, rhf=1.011904.
BKZ(β: 50,t: 1/ 1, o:  60): slope=-0.038368, rhf=1.011904..
BKZ(β: 50,t: 1/ 1, o:  75): slope=-0.038186, rhf=1.011904...
BKZ(β: 50,t: 1/ 1, o:  90): slope=-0.038035, rhf=1.011904..
BKZ(β: 52,t: 1/ 1, o:   0): slope=-0.038113, rhf=1.011904..
BKZ(β: 52,t: 1/ 1, o:  13): slope=-0.038140, rhf=1.011904....
BKZ(β: 52,t: 1/ 1, o:  26): slope=-0.038001, rhf=1.011904.
BKZ(β: 52,t: 1/ 1, o:  39): slope=-0.037897, rhf=1.011904.....
BKZ(β: 52,t: 1/ 1, o:  52): slope=-0.037875, rhf=1.011904..
BKZ(β: 52,t: 1/ 1, o:  65): slope=-0.037652, rhf=1.011904..
BKZ(β: 52,t: 1/ 1, o:  78): slope=-0.037847, rhf=1.011904...
BKZ(β: 54,t: 1/ 1, o:   0): slope=-0.038111, rhf=1.011904.
BKZ(β: 54,t: 1/ 1, o:  11): slope=-0.037940, rhf=1.011904...
BKZ(β: 54,t: 1/ 1, o:  22): slope=-0.037949, rhf=1.011904..
BKZ(β: 54,t: 1/ 1, o:  33): slope=-0.037908, rhf=1.011904.
BKZ(β: 54,t: 1/ 1, o:  44): slope=-0.037818, rhf=1.011904.
BKZ(β: 54,t: 1/ 1, o:  55): slope=-0.037928, rhf=1.011904..
BKZ(β: 54,t: 1/ 1, o:  66): slope=-0.038078, rhf=1.011904..
BKZ(β: 54,t: 1/ 1, o:  77): slope=-0.038205, rhf=1.011904..
BKZ(β: 56,t: 1/ 1, o:   0): slope=-0.038343, rhf=1.011904.
BKZ(β: 56,t: 1/ 1, o:   9): slope=-0.038148, rhf=1.011904.
BKZ(β: 56,t: 1/ 1, o:  18): slope=-0.038094, rhf=1.011904..
BKZ(β: 56,t: 1/ 1, o:  27): slope=-0.037886, rhf=1.011904..
BKZ(β: 56,t: 1/ 1, o:  36): slope=-0.037807, rhf=1.011904...
BKZ(β: 56,t: 1/ 1, o:  45): slope=-0.037415, rhf=1.011904..
BKZ(β: 56,t: 1/ 1, o:  54): slope=-0.037376, rhf=1.011904.
BKZ(β: 56,t: 1/ 1, o:  63): slope=-0.037486, rhf=1.011904..
BKZ(β: 56,t: 1/ 1, o:  72): slope=-0.037483, rhf=1.011904...
BKZ(β: 56,t: 1/ 1, o:  81): slope=-0.037495, rhf=1.011904....
BKZ(β: 58,t: 1/ 1, o:   0): slope=-0.037716, rhf=1.011904.
BKZ(β: 58,t: 1/ 1, o:   7): slope=-0.037442, rhf=1.011904.
BKZ(β: 58,t: 1/ 1, o:  14): slope=-0.037704, rhf=1.011904..
BKZ(β: 58,t: 1/ 1, o:  21): slope=-0.037900, rhf=1.011904....
BKZ(β: 58,t: 1/ 1, o:  28): slope=-0.037714, rhf=1.011904...
BKZ(β: 58,t: 1/ 1, o:  35): slope=-0.037551, rhf=1.011904..
BKZ(β: 58,t: 1/ 1, o:  42): slope=-0.037445, rhf=1.011904.
BKZ(β: 58,t: 1/ 1, o:  49): slope=-0.037212, rhf=1.011904.
BKZ(β: 58,t: 1/ 1, o:  56): slope=-0.037023, rhf=1.011904.
BKZ(β: 58,t: 1/ 1, o:  63): slope=-0.037201, rhf=1.011904..
BKZ(β: 58,t: 1/ 1, o:  70): slope=-0.037115, rhf=1.011904..
BKZ(β: 58,t: 1/ 1, o:  77): slope=-0.037202, rhf=1.011904....
BKZ(β: 60,t: 1/ 1, o:   0): slope=-0.037201, rhf=1.011904.
BKZ(β: 60,t: 1/ 1, o:   5): slope=-0.037337, rhf=1.011904.
BKZ(β: 60,t: 1/ 1, o:  10): slope=-0.037405, rhf=1.011904..
BKZ(β: 60,t: 1/ 1, o:  15): slope=-0.037518, rhf=1.011904.
BKZ(β: 60,t: 1/ 1, o:  20): slope=-0.037440, rhf=1.011904.
BKZ(β: 60,t: 1/ 1, o:  25): slope=-0.037447, rhf=1.011904.
BKZ(β: 60,t: 1/ 1, o:  30): slope=-0.037260, rhf=1.011904...
BKZ(β: 60,t: 1/ 1, o:  35): slope=-0.037266, rhf=1.011904.
BKZ(β: 60,t: 1/ 1, o:  40): slope=-0.037381, rhf=1.011904.
BKZ(β: 60,t: 1/ 1, o:  45): slope=-0.036954, rhf=1.011904.
BKZ(β: 60,t: 1/ 1, o:  50): slope=-0.036800, rhf=1.011904.
BKZ(β: 60,t: 1/ 1, o:  55): slope=-0.036753, rhf=1.011904.
BKZ(β: 60,t: 1/ 1, o:  60): slope=-0.036773, rhf=1.011904..
BKZ(β: 60,t: 1/ 1, o:  65): slope=-0.036379, rhf=1.011904..
BKZ(β: 60,t: 1/ 1, o:  70): slope=-0.036526, rhf=1.011904..
Iterations: 304
t_{QR-decomp. }=     0.212s
t_{LLL-red.   }=     0.297s
t_{BKZ-red.   }=    12.741s
t_{Seysen-red.}=     0.450s
t_{Matrix-mul.}=     0.282s
Profile = [6.84 6.80 6.79 6.74 6.74 6.73 6.63 6.67 6.56 6.54 6.53 6.53 6.45 6.44 6.38 6.49 6.58 6.57 6.43 6.50 6.43 6.40 6.28 6.29 6.18 6.17 6.01 6.00 5.99 5.93 5.98 5.93 5.84 5.83 5.86 5.81 5.70 5.69 5.59 5.62 5.59 5.47 5.42 5.34 5.35 5.31 5.21 5.18 5.26 5.17 5.04 4.99 5.00 5.02 4.97 4.86 4.86 4.78 4.70 4.76 4.65 4.65 4.58 4.53 4.53 4.42 4.31 4.42 4.30 4.29 4.18 4.33 4.34 4.28 4.29 4.24 4.23 4.22 4.17 4.15 4.12 4.10 4.04 3.99 3.98 3.94 3.87 3.87 3.86 3.83 3.81 3.74 3.71 3.62 3.62 3.49 3.51 3.42 3.51 3.40 3.32 3.34 3.37 3.31 3.23 3.24 3.15 3.12 3.08 3.04 2.89 2.88 2.90 2.80 2.75 2.76 2.79 2.64 2.68 2.65 2.54 2.46 2.41 2.45 2.39 2.38 2.25 2.18]
RHF = 1.01190^n, slope = -0.036484, ∥b_1∥ = 114.2

real    0m14.563s
user    0m17.605s
sys 0m0.045s