diff --git a/polynome.ml b/polynome.ml index adf65ea4704dee048fff9664bb4267657030852f..e29f5ad2b8d3099b811e81bec66a862fe3f596c4 100644 --- a/polynome.ml +++ b/polynome.ml @@ -24,8 +24,10 @@ module type Degree = type degree val print: degree -> string val add: degree -> degree -> degree + val subtract: degree -> degree -> degree val equal: degree -> degree -> bool val is_bigger: degree -> degree -> bool + val is_null: degree -> bool end ;; @@ -107,18 +109,21 @@ module Polynome (C : Coefficient) (D : Degree) = |Null -> Null |NotNull (cp, dp, pp) -> NotNull (C.minus cp, dp, minus pp) in x add (minus y) - (*fonction privée pour couper un polynome*) + (*fonction privée pour couper un polynome selon un degree*) + (*polynome -> degree -> degree *) let cut x n = let rec acc_cut acc p i = match p, i with |Null, _ -> acc, Null - |_, 0 -> acc, p |NotNull (cp, dp, pp), j -> - let rec insert cc dd pp = (match pp with - |Null -> NotNull (cc, dd, Null) - |NotNull (ccp, ddp, ppp) -> + if D.is_null j then acc, p else + if D.is_bigger dp j then + let rec insert cc dd pp = (match pp with + |Null -> NotNull (cc, dd, Null) + |NotNull (ccp, ddp, ppp) -> NotNull (ccp, ddp, (insert cc dd ppp)) - ) in - acc_cut (insert cp dp acc) pp (j - 1) + ) in + acc_cut (insert cp (D.subtract dp j) acc) pp j + else acc, p in acc_cut Null x n (*fonction privée pour connaitre la longeur du polynome *) let length x = diff --git a/simplepolynome.ml b/simplepolynome.ml index b7f2de39bc1ecccaeebb3bb0332ec8ba0e55c787..98b7b732978fc4c5f4673a9f2092f85a08d55a5d 100644 --- a/simplepolynome.ml +++ b/simplepolynome.ml @@ -7,8 +7,10 @@ module SimpleDegree = type degree = int let print d = (string_of_int d) let add d1 d2 = d1 + d2 + let subtract d1 d2 = d1 - d2 let equal d1 d2 = (d1 == d2) let is_bigger d1 d2 = (d1 > d2) + let is_null d = (d == 0) end ;;