Macaulay2 Engine
Loading...
Searching...
No Matches

◆ SWAPI()

void LLLoperations::SWAPI ( int k,
int kmax,
MutableMatrix * A,
MutableMatrix * Achange,
MutableMatrix * lambda )
staticprivate

Definition at line 143 of file LLL.cpp.

148{
149 int i;
150 mpz_t a, b, B, C1, C2, D, D1, lam;
151 ring_elem rD1, rD, rlam;
152
153 A->interchange_columns(k, k - 1);
154 if (Achange) Achange->interchange_columns(k, k - 1);
155
156 mpz_init(a);
157 mpz_init(b);
158 mpz_init(B);
159 mpz_init(C1);
160 mpz_init(C2);
161
162 lambda->get_entry(k - 1, k - 1, rD1);
163 lambda->get_entry(k, k, rD);
164 mpz_init_set(D1, rD1.get_mpz());
165 mpz_init_set(D, rD.get_mpz());
166
167 if (lambda->get_entry(k - 1, k, rlam))
168 mpz_init_set(lam, rlam.get_mpz());
169 else
170 mpz_init(lam);
171
172 // Interchange both of these columns, except for these three terms:
173 if (k >= 2)
174 {
175 lambda->interchange_columns(k, k - 1);
176 lambda->set_entry(k - 1, k, globalZZ->from_int(lam));
177 lambda->set_entry(k, k, globalZZ->from_int(D));
178 lambda->set_entry(k, k - 1, globalZZ->from_long(0));
179 // (k-1,k-1) is set below.
180 }
181
182 // B := (D#(k-2) * D#k + lam^2) // D#(k-1);
183 if (k == 1)
184 mpz_set(a, D);
185 else
186 {
187 ring_elem rD2;
188 lambda->get_entry(k - 2, k - 2, rD2);
189 mpz_mul(a, rD2.get_mpz(), D);
190 }
191 mpz_mul(b, lam, lam);
192 mpz_add(a, a, b);
193 mpz_fdiv_q(B, a, D1);
194 lambda->set_entry(k - 1, k - 1, globalZZ->from_int(B));
195
196 // scan(k+1..C.kmax, i-> (
197 // t := lambda#(i,k);
198 // lambda#(i,k) = (D#k * lambda#(i,k-1) - lam * t) // D#(k-1);
199 // lambda#(i,k-1) = (B*t + lam*lambda#(i,k))//(D#k);));
200 for (i = k + 1; i <= kmax; i++)
201 {
202 ring_elem s, t;
203 bool s_notzero = lambda->get_entry(k - 1, i, s);
204 bool t_notzero = lambda->get_entry(k, i, t);
205 if (s_notzero)
206 mpz_mul(a, D, s.get_mpz());
207 else
208 mpz_set_ui(a, 0);
209 // lambda#(i,k) = (D#k * lambda#(i,k-1) - lam * t) // D#(k-1);
210 if (t_notzero)
211 mpz_mul(b, lam, t.get_mpz());
212 else
213 mpz_set_ui(b, 0);
214 mpz_sub(a, a, b);
215 mpz_fdiv_q(C1, a, D1);
216
217 // lambda#(i,k-1) = (B*t + lam*lambda#(i,k))//(D#k);));
218 mpz_mul(b, lam, C1);
219 if (t_notzero)
220 mpz_mul(a, B, t.get_mpz());
221 else
222 mpz_set_ui(a, 0);
223
224 mpz_add(a, a, b);
225 mpz_fdiv_q(C2, a, D);
226
227 lambda->set_entry(
228 k, i, globalZZ->from_int(C1)); // These two lines will remove t,s.
229 lambda->set_entry(k - 1, i, globalZZ->from_int(C2));
230 }
231 mpz_clear(a);
232 mpz_clear(b);
233 mpz_clear(B);
234 mpz_clear(C1);
235 mpz_clear(C2);
236 mpz_clear(D1);
237 mpz_clear(D);
238 mpz_clear(lam);
239}
virtual bool interchange_columns(size_t i, size_t j)=0
virtual bool get_entry(size_t r, size_t c, ring_elem &result) const =0
virtual bool set_entry(size_t r, size_t c, const ring_elem a)=0
virtual ring_elem from_long(long n) const
Definition ZZ.cpp:110
virtual ring_elem from_int(mpz_srcptr n) const
Definition ZZ.cpp:119
RingZZ * globalZZ
Definition relem.cpp:13
void size_t s
Definition m2-mem.cpp:271
mpz_srcptr get_mpz() const
Definition ringelem.hpp:127

References MutableMatrix::get_entry(), ring_elem::get_mpz(), globalZZ, MutableMatrix::interchange_columns(), s, and MutableMatrix::set_entry().

Referenced by doLLL().