void mpz_poly_to_F_mpz_mod_poly(F_mpz_mod_poly_t F_poly, const mpz_poly_t m_poly) { F_mpz_mod_poly_fit_length(F_poly, m_poly->length); _F_mpz_mod_poly_set_length(F_poly, m_poly->length); for (ulong i = 0; i < m_poly->length; i++) { F_mpz_set_mpz(F_poly->coeffs + i, m_poly->coeffs[i]); F_mpz_mod(F_poly->coeffs + i, F_poly->coeffs + i, F_poly->P); } _F_mpz_mod_poly_normalise(F_poly); }
void F_mpz_poly_to_F_mpz_mod_poly(F_mpz_mod_poly_t F_poly, const F_mpz_poly_t poly) { F_mpz_mod_poly_fit_length(F_poly, poly->length); _F_mpz_mod_poly_set_length(F_poly, poly->length); for (ulong i = 0; i < poly->length; i++) { F_mpz_set(F_poly->coeffs + i, poly->coeffs + i); F_mpz_mod(F_poly->coeffs + i, F_poly->coeffs + i, F_poly->P); } _F_mpz_mod_poly_normalise(F_poly); }
void F_mpzmod_mat_mul_classical(F_mpzmod_mat_t res, F_mpzmod_mat_t mat1, F_mpzmod_mat_t mat2) { ulong c1 = mat1->c; ulong r2 = mat2->r; if ((c1 != r2) || (c1 == 0)) { printf("FLINT exception : invalid matrix multiplication!\n"); abort(); } ulong r1 = mat1->r; ulong c2 = mat2->c; if ((r1 == 0) || (c2 == 0)) return; // no work to do F_mpz * temp = (F_mpz *) flint_heap_alloc(c2); for (ulong i = 0; i < c2; i++) F_mpz_init(temp + i); for (ulong i = 0; i < r1; i++) // for each row of mat1 { F_mpz * c = mat1->rows[i]; for (ulong k = 0; k < c2; k++) // do initial scalar product of row 1 of mat2 by c F_mpz_mul2(temp + k, mat2->rows[0] + k, c); for (ulong j = 1; j < c1; j++) // compute scalar product for rows 1 to c1 of mat2 { for (ulong k = 0; k < c2; k++) // do scalar product of row j of mat2 by c { F_mpz_addmul(temp + k, mat2->rows[j] + k, c + j); } } for (ulong k = 0; k < c2; k++) // do reduction mod p and store in result { F_mpz_mod(res->rows[i] + k, temp + k, mat1->p); } } for (ulong i = 0; i < c2; i++) F_mpz_clear(temp + i); flint_heap_free(temp); }