oILAB
Loading...
Searching...
No Matches
LLL.cpp
Go to the documentation of this file.
1/* This file is part of gbLAB.
2 *
3 * gbLAB is distributed without any warranty under the MIT License.
4 */
5
6
7#ifndef gbLAB_LLL_cpp_
8#define gbLAB_LLL_cpp_
9
10#include "LLL.h"
11// http://www.arageli.org/download
12// https://www.mathworks.com/matlabcentral/fileexchange/49457-lattice-reduction-mimo?focused=3859922&tab=function
13
14namespace gbLAB
15{
20 /**********************************************************************/
21 void LLL::lll_gram_schmidt_int(const int &k)
22 {
23
24 for (int j = 0; j <= k; j++)
25 {
26 int u = B.col(k).dot(B.col(j));
27 for (int i = 0; i < j; i++)
28 {
29 u = (d(i + 1) * u - Lambda(k, i) * Lambda(j, i)) / d(i);
30 }
31 if (j < k)
32 {
33 Lambda(k, j) = u;
34 }
35 else
36 {
37 d(k + 1) = u;
38 }
39 }
40 }
41
42 /**********************************************************************/
43 void LLL::lll_size_reduction_int(const int &k,
44 const int &l)
45 {
46
47 int q = (2 * Lambda(k, l) + d[l + 1]) / (2 * d(l + 1)); //quotient
48 B.col(k) -= B.col(l) * q;
49 H.col(k) -= H.col(l) * q;
50 Lambda(k, l) -= q * d(l + 1);
51
52 for (int i = 0; i < l; i++)
53 {
54 Lambda(k, i) -= q * Lambda(l, i);
55 }
56 }
57
58 /**********************************************************************/
59 void LLL::lll_interchange_int(const int &k,
60 const int &k_max)
61 {
62 // typedef typename Lambda_type::value_type T;
63 std::cout << "1" << std::endl;
64
65 Eigen::VectorXi tempCol = B.col(k);
66 B.col(k) = B.col(k - 1);
67 B.col(k - 1) = tempCol;
68
69 std::cout << "2" << std::endl;
70
71 tempCol = H.col(k);
72 H.col(k) = H.col(k - 1);
73 H.col(k - 1) = tempCol;
74
75 // B.swap_cols(k, k - 1);
76 // H.swap_cols(k, k - 1);
77
78 std::cout << "3" << std::endl;
79
80 for (int j = 0; j < k - 1; j++)
81 {
82 std::swap(Lambda(k, j), Lambda(k - 1, j));
83 }
84
85 std::cout << "4" << std::endl;
86
87 int lambda = Lambda(k, k - 1);
88 int b = (d(k - 1) * d(k + 1) + pow(lambda, 2)) / d(k);
89
90 std::cout << "5" << std::endl;
91 std::cout << "d(k+1)=" << d(k + 1) << std::endl;
92
93 for (int i = k + 1; i <= k_max; i++)
94 {
95 int t = Lambda(i, k);
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);
98 }
99 std::cout << "6" << std::endl;
100
101 d(k) = b;
102 std::cout << "7" << std::endl;
103 }
104
105 template <int m, int n>
106 LLL::LLL(const Eigen::Matrix<int, m, n> &B_in) : /* init */ B(B_in),
107 /* init */ d(Eigen::Matrix<int, 1, n + 1>::Ones()),
108 /* init */ H(Eigen::Matrix<int, n, n>::Identity()),
109 /* init */ Lambda(Eigen::Matrix<int, n, n>::Identity())
110 {
111
112 d(0) = 1;
113 d(1) = B.col(0).squaredNorm();
114
115 int k_max = 0;
116 for (int k = 1; k < n;)
117 {
118 std::cout << "k=" << k << std::endl;
119 if (k > k_max)
120 {
121 std::cout << "0" << std::endl;
122 k_max = k;
123
125
126 // if (is_null(d[k + 1]))
127 if (d(k + 1) == 0)
128 {
129 assert(0 && "B(i) did not form the basis");
130 // return false; // B(i) did not form the basis
131 }
132 }
133
134 if (2 * std::abs(Lambda(k, k - 1)) > d(k))
135 {
136 std::cout << "A" << std::endl;
137 lll_size_reduction_int(k, k - 1);
138 }
139
140 if (4 * d(k + 1) * d(k - 1) < 3 * pow(d(k), 2) - 4 * pow(Lambda(k, k - 1), 2))
141 {
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;
146 }
147 else
148 {
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);
153 k++;
154 }
155 std::cout << "B=" << B << std::endl;
156 std::cout << "d=" << d.transpose() << std::endl;
157 }
158
159 std::cout << B << std::endl;
160 }
161
162} // end namespace
163#endif
void lll_gram_schmidt_int(const int &k)
Definition LLL.cpp:21
void lll_size_reduction_int(const int &k, const int &l)
Definition LLL.cpp:43
LLL(const Eigen::Matrix< int, m, n > &B_in)
Definition LLL.cpp:106
Eigen::MatrixXi Lambda
Definition LLL.h:43
Eigen::MatrixXi B
Definition LLL.h:40
void lll_interchange_int(const int &k, const int &k_max)
Definition LLL.cpp:59
Eigen::MatrixXi H
Definition LLL.h:42
Eigen::VectorXi d
Definition LLL.h:41