let rec decompose_aux u q = if u = 1 then [] else if u mod q = 0 then q :: decompose_aux (u / q) q else decompose_aux u (q + 1) ;; let decompose u = decompose_aux u 2 ;; |
let rec decompose_aux u q = let v = u / q in (* éviter de diviser deux fois, diviser c'est cher *) if v < q then [ u ] (* liste du seul élément u, même chose que u::[] *) else if u mod q = 0 then q :: decompose_aux v q else decompose_aux u (q + 1 + q mod 2) ;; let decompose u = if u <= 0 then failwith "decompose" else if u < 2 then [] else decompose_aux u 2 ;; |