diff --git a/Source/scalable/scalable_basic_arithmetics.ml b/Source/scalable/scalable_basic_arithmetics.ml index 83e1223..2310aae 100644 --- a/Source/scalable/scalable_basic_arithmetics.ml +++ b/Source/scalable/scalable_basic_arithmetics.ml @@ -2,11 +2,20 @@ open Scalable +let sign l = + match sign_b l with + 1 -> [0;1] + | _ -> [1;1] + (** Greater common (positive) divisor of two non-zero integers. @param bA non-zero bitarray. @param bB non-zero bitarray. *) -let gcd_b bA bB = [] +let rec gcd_b bA bB = + let r = mod_b (mult_b (sign bA) bA) (mult_b (sign bB) bB) + in if (>>!) r [] then + gcd_b (mult_b (sign bB) bB) r + else bB;; (** Extended euclidean division of two integers NOT OCAML DEFAULT. Given non-zero entries a b computes triple (u, v, d) such that @@ -14,4 +23,11 @@ let gcd_b bA bB = [] @param bA non-zero bitarray. @param bB non-zero bitarray. *) -let bezout_b bA bB = ([], [], []) +let bezout_b bA bB = + let rec bezout_b_rec u v r u1 v1 r1= + if r1 = [] then + (u, v, add_b (mult_b bA u) (mult_b bB v)) + else + let q = quot_b r r1 in + bezout_b_rec u1 v1 r1 (diff_b u (mult_b q u1)) (diff_b v (mult_b q v1)) (diff_b r (mult_b q r1)) + in bezout_b_rec [0;1] [] bA [] [0;1] bB;;