void SMat<CoeffRing>::vec_row_op2(sparsevec *&v, size_t r1, size_t r2, const elem &a1, const elem &a2, const elem &b1, const elem &b2) const // row(r1 in v) := a1 * row(r1 in v) + a2 * row(r2 in v) // row(r2 in v) := b1 * row(r1 in v) + b2 * row(r2 in v) (RHS refers to previous values) { // v[row r1] = a1 * v[r1] + a2 * v[r2] // v[row r2] = b1 * v[r1] + b2 * v[r2] elem e1,e2, c1,c2,c3,c4; ring().set_zero(c1); ring().set_zero(c2); ring().set_zero(c3); ring().set_zero(c4); bool r1_nonzero = vec_get_entry(v,r1,e1); bool r2_nonzero = vec_get_entry(v,r2,e2); if (!r1_nonzero && !r2_nonzero) return; if (r1_nonzero) { ring().mult(c1, a1, e1); ring().mult(c3, b1, e1); } if (r2_nonzero) { ring().mult(c2,a2,e2); ring().mult(c4,b2,e2); } ring().add(c1,c1,c2); ring().add(c3,c3,c4); vec_set_entry(v,r1,c1); vec_set_entry(v,r2,c3); }
bool SMat<CoeffRing>::get_entry(size_t r, size_t c, elem &result) const // Returns false if (r,c) is out of range or if result is 0. No error // is returned. result <-- this(r,c), and is set to zero if false is returned. { return vec_get_entry(columns_[c], r, result); }