void F_mpzmod_mat_sub(F_mpzmod_mat_t res, F_mpzmod_mat_t mat1, F_mpzmod_mat_t mat2) { for (ulong i = 0; i < mat1->r; i++) { for (ulong j = 0; j < mat1->c; j++) { F_mpz_sub(res->rows[i] + j, mat1->rows[i] + j, mat2->rows[i] + j); if (F_mpz_sgn(res->rows[i] + j) < 0) F_mpz_add(res->rows[i] + j, res->rows[i] + j, mat1->p); } } }
void _F_mpz_mod_poly_sub(F_mpz_mod_poly_t res, const F_mpz_mod_poly_t pol1, const F_mpz_mod_poly_t pol2) { F_mpz_poly_t p1, p2, r; _F_mpz_poly_attach_F_mpz_mod_poly(p1, pol1); _F_mpz_poly_attach_F_mpz_mod_poly(p2, pol2); _F_mpz_poly_attach_F_mpz_mod_poly(r, res); _F_mpz_poly_sub(r, p1, p2); for (ulong i = 0; i < r->length; i++) { if (F_mpz_sgn(r->coeffs + i) < 0) F_mpz_add(r->coeffs + i, r->coeffs + i, res->P); } _F_mpz_mod_poly_attach_F_mpz_poly(res, r); _F_mpz_mod_poly_normalise(res); }