148{
149 int i;
150 mpz_t a, b, B, C1, C2, D, D1, lam;
151 ring_elem rD1, rD, rlam;
152
155
156 mpz_init(a);
157 mpz_init(b);
158 mpz_init(B);
159 mpz_init(C1);
160 mpz_init(C2);
161
164 mpz_init_set(D1, rD1.
get_mpz());
166
168 mpz_init_set(lam, rlam.
get_mpz());
169 else
170 mpz_init(lam);
171
172
173 if (k >= 2)
174 {
179
180 }
181
182
183 if (k == 1)
184 mpz_set(a, D);
185 else
186 {
187 ring_elem rD2;
190 }
191 mpz_mul(b, lam, lam);
192 mpz_add(a, a, b);
193 mpz_fdiv_q(B, a, D1);
195
196
197
198
199
200 for (i = k + 1; i <= kmax; i++)
201 {
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
210 if (t_notzero)
212 else
213 mpz_set_ui(b, 0);
214 mpz_sub(a, a, b);
215 mpz_fdiv_q(C1, a, D1);
216
217
218 mpz_mul(b, lam, C1);
219 if (t_notzero)
221 else
222 mpz_set_ui(a, 0);
223
224 mpz_add(a, a, b);
225 mpz_fdiv_q(C2, a, D);
226
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
virtual ring_elem from_int(mpz_srcptr n) const
mpz_srcptr get_mpz() const