---------------------------------------------------------------------- -- Polynomials Chapter 5 package body (polynomials_ch5.adb) -- -- Defines several funtions for Polynomials operations -- of Chapter 5 examples --------------------------------------------------------------------- package body polynomials_ch5 is function Subtract(A, B: Polynomial_m1) return Polynomial_m1 is C: Polynomial_m1; begin for I in 0 .. M-1 loop C(I) := (A(I)-B(I)) mod P; end loop; return C; end Subtract; ---------------------------------------------------------------------- -- function poly_mult_zp(A,B: Polynomial_m1; p,m: natural) return Polynomial_m2 is function poly_mult_zp(A,B: Polynomial_m1) return Polynomial_m2 is D: polynomial_m2; begin for i in 0 .. 2*m-2 loop D(i) := 0; end loop; for k in 0 .. m-1 loop for i in 0 .. k loop D(k) := mod_m_addition(D(k),dar_mod_multiplication(A(i),B(k-i),p,m),p,m); end loop; end loop; for k in m .. 2*m-2 loop for i in k .. 2*m-2 loop D(k) := mod_m_addition(D(k),dar_mod_multiplication(A(k-i+(m-1)),B(i-(m-1)),p,m),p,m); end loop; end loop; return D; end poly_mult_zp; ---------------------------------------------------------------------- -- function reduction_matrix_R_zp(F: polynomial_m1; p,m: natural) return Polynomial_matrix_m1m2 is function reduction_matrix_R_zp(F: polynomial_m1) return Polynomial_matrix_m1m2 is R: Polynomial_matrix_m1m2; begin for j in 0 .. m-1 loop for i in 0 .. m-2 loop R(j,i) := 0; end loop; end loop; for j in 0 .. m-1 loop -- R(j,0) := (-F(j)) mod p; R(j,0) := nr_reducer(-F(j),p,m,m); end loop; for i in 1 .. m-2 loop for j in 0 .. m-1 loop if j = 0 then R(j,i) := dar_mod_multiplication(R(m-1,i-1),R(j,0),p,m); else R(j,i) := mod_m_addition(R(j-1,i-1),dar_mod_multiplication(R(m-1,i-1),R(j,0),p,m),p,m); end if; end loop; end loop; return R; end reduction_matrix_R_zp; ------------------------------------------------------------- -- function multiply_by_x_zp(s, f: polynomial_m1; p,m: natural) return polynomial_m1 is function multiply_by_x_zp(s, f: polynomial_m1) return polynomial_m1 is d: polynomial_m1; begin d(0) := (-dar_mod_multiplication(s(m-1),f(0),p,m)) mod p; for i in 1 .. m-1 loop d(i) := mod_m_subtraction(s(i-1),dar_mod_multiplication(s(m-1),f(i),p,m),p,m); end loop; return d; end multiply_by_x_zp; --------------------------------------------------------------- function Product(a: Polynomial_m1; b: Natural_Mod_P) return Polynomial_m1 is c: Polynomial_m1; begin for I in 0 .. M-1 loop C(I) := (A(I)*B) mod P; end loop; return c; end Product; ----------------------------------------------------------------- function addition_mod_f_poly(a, b: Polynomial_m1) return Polynomial_m1 is c: Polynomial_m1; begin for i in 0 .. m-1 loop c(i) := mod_m_addition(a(i),b(i),p,m); end loop; return c; end addition_mod_f_poly; ----------------------------------------------------------------- function LSEfirst(a, b, f: Polynomial_m1) return Polynomial_m1 is aux, c: Polynomial_m1; begin for i in 0 .. m-1 loop c(i) := 0; end loop; aux := a; for i in 0 .. m-1 loop c := addition_mod_f_poly(product(aux,b(i)),c); aux := multiply_by_x_zp(aux,f); end loop; return c; end LSEfirst; ----------------------------------------------------------------- function mult_x_OEF(s: polynomial_m1; c: integer) return polynomial_m1 is d: polynomial_m1; begin d(0) := dar_mod_multiplication(s(m-1),c,p,m); for i in 1 .. m-1 loop d(i) := s(i-1); end loop; return d; end mult_x_OEF; ----------------------------------------------------------------- function OEF_LSE_mult(a,b: polynomial_m1; c: integer) return polynomial_m1 is aux,d: Polynomial_m1; begin for i in 0 .. m-1 loop d(i) := 0; end loop; aux := a; for i in 0 .. m-1 loop d := addition_mod_f_poly(product(aux,b(i)),d); aux := mult_x_OEF(aux,c); end loop; return d; end OEF_LSE_mult; end polynomials_ch5;