Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}