RosettaCodeData/Task/Polynomial-long-division/OCaml/polynomial-long-division-2.ml
2024-10-16 18:07:41 -07:00

10 lines
345 B
OCaml

let polydiv f g =
let rec aux f s q =
let ddif = (deg f) - (deg s) in
if ddif < 0 then (q, f) else
let k = (List.hd f) /. (List.hd s) in
let ks = List.map (( *.) k) (shift ddif s) in
let q' = zip (+.) q (shift ddif [k])
and f' = norm (List.tl (zip (-.) f ks)) in
aux f' s q' in
aux (norm f) (norm g) []