(* Decomposition of the numbers into arrays *) let decomposition10 a= let rec log10 a= if a<10 then 1 else 1+(log10 (a/10)) in let lga=log10 a in let resultat=Array.create (lga) 0 in let rec decomp_aux a i= if a=0 then () else begin let b=a/10 in resultat.(i)<-(a-10*b); decomp_aux b (i+1) end in decomp_aux a 0; resultat;; (* Power function, defined recursively *) let rec ( ** ) nb pb= if pb=0 then 1 else nb*(nb**(pb-1));; (* Gives both arrays the same length *) let equilibre vecta vectb= let pluslong=max (Array.length vecta) (Array.length vectb) in let m=Array.make_matrix 2 pluslong 0 in for i=0 to pluslong-1 do begin try m.(0).(i)<-vecta.(i) with _->m.(0).(i)<-0; end; begin try m.(1).(i)<-vectb.(i) with _->m.(1).(i)<-0; end done; m.(0),m.(1);; (* Karatsuba multiplication function *) let karatsuba a b= let decompa0=decomposition10 a and decompb0=decomposition10 b in let decompa,decompb=equilibre decompa0 decompb0 in let rec karatsuba_aux xi xj yi yj= if xi=xj && yi=yj then decompa.(xi)*decompb.(yi) else begin let x1y1=karatsuba_aux xi ((xi+xj)/2+1) yi ((yi+yj)/2+1) and x2y2=karatsuba_aux ((xi+xj)/2) xj ((yi+yj)/2) yj and x1y2=karatsuba_aux xi ((xi+xj)/2+1) ((yi+yj)/2) yj and x2y1=karatsuba_aux ((xi+xj)/2) xj yi ((yi+yj)/2+1) and m2=(xi-xj)/2+1 in x1y1*(10**(2*m2))+(x1y2+x2y1)*(10**m2)+x2y2 end in karatsuba_aux (Array.length decompa -1) 0 (Array.length decompa-1) 0;;