74{
75 int nrows =
static_cast<int>(M->
n_rows());
76 int ncols =
static_cast<int>(M->
n_cols());
77
78 NTL::ZZ d;
79
80
81 double delta = static_cast<double>(numer) / static_cast<double>(denom);
82
83 if (
M2_gbTrace >= 10) printf(
"LLL: using strategy %d\n", strategy);
86
87 switch (strategy)
88 {
89 case 2:
90 if (!V)
91 LLL(d, *A, numer, denom);
92 else
93 LLL(d, *A, *V, numer, denom);
94 break;
95
97 if (!V)
98 LLL_FP(*A, delta);
99 else
100 LLL_FP(*A, *V, delta);
101 break;
104 if (!V)
105 LLL_QP(*A, delta);
106 else
107 LLL_QP(*A, *V, delta);
108 break;
110 if (!V)
111 LLL_XD(*A, delta);
112 else
113 LLL_XD(*A, *V, delta);
114 break;
116 if (!V)
117 LLL_RR(*A, delta);
118 else
119 LLL_RR(*A, *V, delta);
120 break;
121
123 if (!V)
124 BKZ_FP(*A, delta);
125 else
126 BKZ_FP(*A, *V, delta);
127 break;
129 if (!V)
130 BKZ_QP(*A, delta);
131 else
132 BKZ_QP(*A, *V, delta);
133 break;
135 if (!V)
136 BKZ_QP1(*A, delta);
137 else
138 BKZ_QP1(*A, *V, delta);
139 break;
141 if (!V)
142 BKZ_XD(*A, delta);
143 else
144 BKZ_XD(*A, *V, delta);
145 break;
147 if (!V)
148 BKZ_RR(*A, delta);
149 else
150 BKZ_RR(*A, *V, delta);
151 break;
152
154 if (!V)
155 G_LLL_FP(*A, delta);
156 else
157 G_LLL_FP(*A, *V, delta);
158 break;
161 if (!V)
162 G_LLL_QP(*A, delta);
163 else
164 G_LLL_QP(*A, *V, delta);
165 break;
167 if (!V)
168 G_LLL_XD(*A, delta);
169 else
170 G_LLL_XD(*A, *V, delta);
171 break;
173 if (!V)
174 G_LLL_RR(*A, delta);
175 else
176 G_LLL_RR(*A, *V, delta);
177 break;
178
180 if (!V)
181 G_BKZ_FP(*A, delta);
182 else
183 G_BKZ_FP(*A, *V, delta);
184 break;
186 if (!V)
187 G_BKZ_QP(*A, delta);
188 else
189 G_BKZ_QP(*A, *V, delta);
190 break;
192 if (!V)
193 G_BKZ_QP1(*A, delta);
194 else
195 G_BKZ_QP1(*A, *V, delta);
196 break;
198 if (!V)
199 G_BKZ_XD(*A, delta);
200 else
201 G_BKZ_XD(*A, *V, delta);
202 break;
204 if (!V)
205 G_BKZ_RR(*A, delta);
206 else
207 G_BKZ_RR(*A, *V, delta);
208 break;
209 default:
210 delete A;
211 if (V) delete V;
212 ERROR(
"Strategy option to LLL not understood");
213 return false;
214 }
215
216
217 mpz_t a;
218 mpz_init(a);
219
220 for (int j = 0; j < ncols; j++)
221 for (int i = 0; i < nrows; i++)
222 {
226 }
227
228 if (U)
229 {
230 for (int j = 0; j < ncols; j++)
231 for (int i = 0; i < ncols; i++)
232 {
236 }
237 }
238 mpz_clear(a);
239 delete A;
240 if (V) delete V;
241 return true;
242}
virtual size_t n_rows() const =0
virtual size_t n_cols() const =0
virtual bool set_entry(size_t r, size_t c, const ring_elem a)=0
NTL::mat_ZZ * mutableMatrix_to_NTL_mat_ZZ(const MutableMatrix *M)
void mat_ZZ_get_entry(const NTL::mat_ZZ *A, long i, long j, mpz_t result)