21 void LLL::lll_gram_schmidt_int(
const int &
k)
24 for (
int j = 0;
j <=
k;
j++)
26 int u = B.col(
k).dot(B.col(
j));
27 for (
int i = 0;
i <
j;
i++)
29 u = (d(
i + 1) *
u - Lambda(
k,
i) * Lambda(
j,
i)) / d(
i);
43 void LLL::lll_size_reduction_int(
const int &
k,
47 int q = (2 * Lambda(
k, l) + d[
l + 1]) / (2 * d(l + 1));
48 B.col(
k) -= B.col(l) *
q;
49 H.col(
k) -= H.col(l) *
q;
50 Lambda(
k, l) -=
q * d(l + 1);
52 for (
int i = 0;
i <
l;
i++)
54 Lambda(
k,
i) -=
q * Lambda(l,
i);
59 void LLL::lll_interchange_int(
const int &
k,
63 std::cout <<
"1" << std::endl;
65 Eigen::VectorXi tempCol = B.col(
k);
66 B.col(
k) = B.col(
k - 1);
67 B.col(
k - 1) = tempCol;
69 std::cout <<
"2" << std::endl;
72 H.col(
k) = H.col(
k - 1);
73 H.col(
k - 1) = tempCol;
78 std::cout <<
"3" << std::endl;
80 for (
int j = 0;
j <
k - 1;
j++)
82 std::swap(Lambda(
k,
j), Lambda(
k - 1,
j));
85 std::cout <<
"4" << std::endl;
87 int lambda = Lambda(
k,
k - 1);
88 int b = (d(
k - 1) * d(
k + 1) + pow(lambda, 2)) / d(
k);
90 std::cout <<
"5" << std::endl;
91 std::cout <<
"d(k+1)=" << d(
k + 1) << std::endl;
93 for (
int i =
k + 1;
i <= k_max;
i++)
96 Lambda(
i,
k) = (d(
k + 1) * Lambda(
i,
k - 1) - lambda *
t) / d(
k);
97 Lambda(
i,
k - 1) = (
b *
t + lambda * Lambda(
i,
k)) / d(
k + 1);
99 std::cout <<
"6" << std::endl;
102 std::cout <<
"7" << std::endl;
105 template <
int m,
int n>
106 LLL::LLL(
const Eigen::Matrix<int, m, n> &B_in) :
B(B_in),
107 d(Eigen::Matrix<int, 1,
n + 1>::Ones()),
108 H(Eigen::Matrix<int,
n,
n>::Identity()),
109 Lambda(Eigen::Matrix<int,
n,
n>::Identity())
113 d(1) =
B.col(0).squaredNorm();
116 for (
int k = 1;
k <
n;)
118 std::cout <<
"k=" <<
k << std::endl;
121 std::cout <<
"0" << std::endl;
124 lll_gram_schmidt_int(
k);
129 assert(0 &&
"B(i) did not form the basis");
134 if (2 * std::abs(Lambda(
k,
k - 1)) > d(
k))
136 std::cout <<
"A" << std::endl;
137 lll_size_reduction_int(
k,
k - 1);
140 if (4 * d(
k + 1) * d(
k - 1) < 3 * pow(d(
k), 2) - 4 * pow(Lambda(
k,
k - 1), 2))
142 std::cout <<
"B" << std::endl;
143 lll_interchange_int(
k, k_max);
144 k = std::max(1,
k - 1);
145 std::cout <<
"B1" << std::endl;
149 std::cout <<
"C" << std::endl;
150 for (
int l =
k - 1;
l > 0;
l--)
151 if (2 * std::abs(Lambda(
k, l - 1)) > d(l))
152 lll_size_reduction_int(
k, l - 1);
155 std::cout <<
"B=" <<
B << std::endl;
156 std::cout <<
"d=" << d.transpose() << std::endl;
159 std::cout <<
B << std::endl;
LLL(const Eigen::Matrix< int, m, n > &B_in)
initial point of the source segment B
the magnitude of the R vector q
final point of the source segment t