diff --git a/main.ml b/main.ml index 2177ea360178962916691024a7cfb001763c3dc5..d90c16df634e07a627ce27e7c7f20022da829553 100644 --- a/main.ml +++ b/main.ml @@ -18,7 +18,7 @@ print_string "P1 = "; print_string (P.print p1); print_string "\n";; -let p2 = P.generate 5;; +let p2 = P.generate 4;; print_string "P2 = "; print_string (P.print p2); diff --git a/polynome.ml b/polynome.ml index 56f05c40edcd67dd5677306d949481479307830b..7360ba4a65988785bf93d87b6b0c56dd0e6c16b0 100644 --- a/polynome.ml +++ b/polynome.ml @@ -31,6 +31,7 @@ module type Degree = val is_bigger: degree -> degree -> bool val is_null: degree -> bool val increment: degree -> degree + val double: degree -> degree val unit: degree end ;; @@ -52,10 +53,12 @@ module Polynome (C : Coefficient) (D : Degree) = type polynome = |Null |NotNull of C.coeff*D.degree*polynome + let rec print p = match p with |Null -> "0" |NotNull (cc, dd, pp)-> (C.print cc)^"X^"^(D.print dd)^"+"^(print pp) + let rec equal x y = match x with |Null -> (match y with |Null -> true @@ -72,33 +75,33 @@ module Polynome (C : Coefficient) (D : Degree) = else false ) (*addition de deux polynomes*) - let rec add x y = match x with - |Null -> y - |NotNull (cx, dx, xx)-> - (match y with - |Null -> x - |NotNull (cy, dy, yy)-> - if D.is_bigger dy dx + let rec add x y = match x, y with + |Null,_ -> y + |_, Null -> x + |NotNull (cx, dx, xx), NotNull (cy, dy, yy)-> + if D.is_bigger dy dx then NotNull (cy, dy, add x yy) - else + else if D.is_bigger dx dy - then NotNull (cx, dx, add xx yy) + then NotNull (cx, dx, add xx yy) else - let m = C.add cx cy in - if C.is_null m - then add xx yy - else NotNull (m, dx, add xx yy) - ) + let m = C.add cx cy in + if C.is_null m + then add xx yy + else NotNull (m, dx, add xx yy) + (*fonction privée pour incrémenter les degrees des monomes d'un polynome*) let rec increment_degree d x = match x with |Null -> Null |NotNull (cx, dx, xx)-> NotNull (cx, (D.add d dx), (increment_degree d xx)) - (*fonction privée pour multiplier les coefficients d'un polynome*) + + (*fonction privée pour multiplier les coefficients d'un polynome*) let rec multiply_coeffs c x = match x with |Null -> Null |NotNull (cx, dx, xx) -> if C.is_null c then Null else NotNull ((C.mul c cx), dx, (multiply_coeffs c xx)) + (*Naive multiplication de deux polynomes*) let rec naive_mul x y = match x, y with |Null, _ -> Null @@ -112,6 +115,7 @@ module Polynome (C : Coefficient) (D : Degree) = |Null -> Null |NotNull (cp, dp, pp) -> NotNull (C.minus cp, dp, minus pp) in add x (minus y) + (*fonction privée pour couper un polynome selon un degree*) (*polynome -> degree -> degree *) let cut x n = @@ -132,6 +136,7 @@ module Polynome (C : Coefficient) (D : Degree) = let cut_2 x = match x with |Null-> Null, Null |NotNull (cx, dx, xx) -> cut x (D.div dx 2) + (*multiplication de Karatsuba offman *) let rec karatsuba_mul x y = match x, y with |Null,_ -> Null @@ -147,7 +152,8 @@ module Polynome (C : Coefficient) (D : Degree) = let xy1 = karatsuba_mul x1 y1 in let xy2 = karatsuba_mul x2 y2 in let xy3 = subtract (karatsuba_mul (add x1 y1) (add x2 y2)) (add xy1 xy2) in - add (add (increment_degree degree_max xy1) (increment_degree n xy3)) xy2 + add (add (increment_degree (D.double n) xy1) (increment_degree n xy3)) xy2 + (*generate polynome from another polynome*) let generate n = let rec gen acc count = diff --git a/simplepolynome.ml b/simplepolynome.ml index 4d311389d672ee28abc76f23b35e5c34ad414d98..8fa34a4ec8fb8377419963a2030b101aa32bef35 100644 --- a/simplepolynome.ml +++ b/simplepolynome.ml @@ -17,6 +17,7 @@ module SimpleDegree = let is_null d = (d == 0) let unit = 1 let increment d = d+1 + let double d = d*2 end ;;