Example #1
0
void _F_mpz_mod_poly_mul(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_mul(r, p1, p2);
   _F_mpz_poly_reduce_coeffs(r, res->P);

   _F_mpz_mod_poly_attach_F_mpz_poly(res, r);
   _F_mpz_mod_poly_normalise(res);
}
Example #2
0
void F_mpz_mod_poly_scalar_mul(F_mpz_mod_poly_t res, const F_mpz_mod_poly_t pol1, const F_mpz_t x)
{
   F_mpz_poly_t p1, r;

   F_mpz_mod_poly_fit_length(res, pol1->length);
   
   _F_mpz_poly_attach_F_mpz_mod_poly(p1, pol1);
   _F_mpz_poly_attach_F_mpz_mod_poly(r, res);

   F_mpz_poly_scalar_mul(r, p1, x);
   _F_mpz_poly_reduce_coeffs(r, res->P);
   
   _F_mpz_mod_poly_attach_F_mpz_poly(res, r);
   _F_mpz_mod_poly_normalise(res);
}
Example #3
0
void _F_mpz_mod_poly_mul_trunc_left(F_mpz_mod_poly_t res, const F_mpz_mod_poly_t pol1, const F_mpz_mod_poly_t pol2, ulong trunc)
{
   F_mpz_poly_t p1, p2, r;

   if (trunc + 1 > pol1->length + pol2->length) trunc = pol1->length + pol2->length - 1;
   if (!pol1->length && !pol2->length) trunc = 0;

   _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_mul_trunc_left(r, p1, p2, trunc);
   _F_mpz_poly_reduce_coeffs(r, res->P);

   _F_mpz_mod_poly_attach_F_mpz_poly(res, r);
   _F_mpz_mod_poly_normalise(res);
}
Example #4
0
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);
}
Example #5
0
void F_mpz_mod_poly_gcd_euclidean(F_mpz_mod_poly_t res, F_mpz_mod_poly_t poly1, F_mpz_mod_poly_t poly2)
{
	F_mpz_mod_poly_t R, A, B;
	F_mpz_poly_t r;
	int steps = 0;
	
	if (poly1->length == 0) 
	{
		if (poly2->length == 0)
			F_mpz_mod_poly_zero(res);
		else F_mpz_mod_poly_make_monic(res, poly2);
		return;
	}
	
	if (poly2->length == 0) 
	{
		F_mpz_mod_poly_make_monic(res, poly1);
		return;
	}
	
	if ((poly1->length == 1) || (poly2->length == 1))
	{
		_F_mpz_poly_attach_F_mpz_mod_poly(r, res);
		F_mpz_poly_set_coeff_ui(r, 0, 1L);
		_F_mpz_mod_poly_attach_F_mpz_poly(res, r);
		_F_mpz_mod_poly_normalise(res);
		return;
	}
	
	F_mpz_t P;
	F_mpz_init(P);
	F_mpz_set(P, poly1->P);
	
	F_mpz_mod_poly_init(R, P);
	
	if (poly1->length > poly2->length)
	{
		_F_mpz_mod_poly_attach(A, poly1);
		_F_mpz_mod_poly_attach(B, poly2);
	} else
	{
		_F_mpz_mod_poly_attach(A, poly2);
		_F_mpz_mod_poly_attach(B, poly1);
	}
	
	F_mpz_mod_poly_rem(R, A, B);
	
	F_mpz_mod_poly_swap(A, B);
	F_mpz_mod_poly_swap(B, R);
	F_mpz_mod_poly_init(R, P); 
	
	if (B->length > 1)
	{
		F_mpz_mod_poly_rem(R, A, B);
		F_mpz_mod_poly_swap(A, B);
		F_mpz_mod_poly_swap(B, R);
		F_mpz_mod_poly_init(R, P);
		steps = 1;
	}
	
	while (B->length > 1)
	{
		F_mpz_mod_poly_rem(A, A, B);
		F_mpz_mod_poly_swap(A, B); 
	}
	
	if  (B->length == 1) 
	{
		_F_mpz_poly_attach_F_mpz_mod_poly(r, res);
		F_mpz_poly_set_coeff_ui(r, 0, 1L);
		_F_mpz_mod_poly_attach_F_mpz_poly(res, r);
		res->length = 1;
	}
	else F_mpz_mod_poly_make_monic(res, A);
	
	if (steps) 
	{
		F_mpz_mod_poly_clear(A);
	} 
	
	F_mpz_mod_poly_clear(B);
	F_mpz_mod_poly_clear(R);
}