(****************) (* Question 1.1 *) (****************) type monome = {coeff: int; degre: int} ;; type polynome = monome list ;; let zero = [] and x = [{coeff=1 ; degre=1}] and p = [{coeff=1;degre=5}; {coeff=(-2);degre=4}; {coeff=1;degre=0}] ;; open Printf (* Pour écrire « printf » directement *) let afficher_monome {coeff=c ; degre=d} = if c > 0 then printf "+" ; printf "%dX^%d" c d ;; let afficher p = match p with | [] -> printf "0" (* un cas particulier, quand même *) | _ -> List.iter afficher_monome p ;; (* Afficher avec retour à la ligne *) let afficher_bis p = afficher p ; print_newline () ;; let test1 () = Printf.printf "** Impression **\n" ; Printf.printf "Polynôme nul: " ; afficher_bis zero ; Printf.printf "Polynôme X: " ; afficher_bis x ; Printf.printf "Polynôme lambda: " ; afficher_bis p ;; test1 () ;; (****************) (* Question 1.2 *) (****************) let rec somme p1 p2 = match p1,p2 with | [],_ -> p2 | _,[] -> p1 | ({degre=d1} as m1)::r1, ({degre=d2} as m2)::r2 -> if d1 > d2 then m1::somme r1 p2 else if d1 < d2 then m2::somme p1 r2 else (* d1 = d2 *) let c = m1.coeff + m2.coeff in if c = 0 then somme r1 r2 else {coeff=c ; degre=d1}::somme r1 r2 ;; let t_somme p1 p2 = Printf.printf "<" ; afficher p1 ; Printf.printf "> + <" ; afficher p2 ; Printf.printf "> --> <" ; afficher (somme p1 p2) ; printf ">\n" ;; let test2 () = Printf.printf "** Somme **\n" ; t_somme [] [] ; t_somme p [] ; t_somme [] p ; t_somme x x ; t_somme [{coeff=2 ; degre=4}] p ;; test2 () ;; (****************) (* Question 1.3 *) (****************) let deriver_monome {coeff=c ; degre=d} = if d = 0 then {coeff=0 ; degre=0} else {coeff=c*d ; degre=d-1} ;; let deriver p = let rec d_rec p = match p with | [] -> [] | m::rem -> let m' = deriver_monome m in if m'.coeff = 0 then d_rec rem else m'::d_rec rem in d_rec p ;; let t_deriv p = Printf.printf "<" ; afficher p ; Printf.printf ">' --> <" ; afficher (deriver p) ; Printf.printf ">\n" ;; let test3 () = Printf.printf "** Dérivation **\n" ; t_deriv [] ; t_deriv x ; t_deriv p ; let p = deriver p in t_deriv p ; let p = deriver p in t_deriv p ; let p = deriver p in t_deriv p ; let p = deriver p in t_deriv p ; let p = deriver p in t_deriv p ;; test3 () ;; (****************) (* Question 1.4 *) (****************) let produit_monomes {coeff=c1 ; degre=d1} {coeff=c2 ; degre=d2} = {coeff=c1*c2 ; degre=d1+d2} ;; let produit_monome m p = List.map (produit_monomes m) p ;; let produit p1 p2 = List.fold_left (fun r m1 -> somme (produit_monome m1 p2) r) [] p1 ;; let t_prod p1 p2 = Printf.printf "<" ; afficher p1 ; Printf.printf "> * <" ; afficher p2 ; Printf.printf "> --> <" ; afficher (produit p1 p2) ; printf ">\n" ;; let test4 () = Printf.printf "** Produit **\n" ; t_prod p [] ; t_prod [] p ; t_prod x x ; t_prod [{coeff=2 ; degre=4}] p ; t_prod p p ;; test4 () ;; (****************) (* Question 1.5 *) (****************) (* Puissance efficace, suppose n >= 0 *) let rec puissance x n = match n with | 0 -> 1 | _ -> let y = puissance x (n/2) in if n mod 2 = 0 then y * y else x * y * y ;; let evaluer p x = List.fold_left (fun r m -> r + m.coeff * puissance x m.degre) 0 p ;; let t_eval p x v = let y = evaluer p x in Printf.printf "%d=%d\n" y v ;; let test5 () = Printf.printf "** Évaluer **\n" ; t_eval [] 0 0 ; t_eval [] 1 0 ; t_eval x 2 2 ; let c = produit x x in t_eval c 2 4 ; let q = produit c c in t_eval q 2 16 ; t_eval (somme q c) 2 20 ; t_eval p 1 0 ; t_eval p (-1) (-2) ;; test5 () ;; exit 0 ;;