(** Développement eulérien d'un réel > 1 **) (* x un réel > 1, alors x=(1+1/t1)(1+1/t2)..... *) (* Les fonctions plafond et plancher d'un réel *) let floor x = let t=int_of_float x in if x>=0. then t else if x=float_of_int t then t else t-1 ;; let ceil x = let t=int_of_float x in if x<=0. then t else if x=float_of_int t then t else t+1 ;; (* Crée une liste de n éléments tous égaux à x *) let make_list n x = let rec rmake x liste = function |0 -> liste |n -> rmake x (x::liste) (n-1) in rmake x [] n;; (* Algorithme d'exponentiation rapide *) let rec puiss_vit x n = if n=0 then 1. else let r=n mod 2 in if r=0 then puiss_vit (x*.x) (n/2) else x*.(puiss_vit (x*.x) (n/2)) ;; (* Les fonctions plafond et plancher d'un réel *) let dvlp_Euler x n = let n_zero=ceil(log(x)/.log(2.)) in let rec deveuler x liste = function |0 -> let t=floor(1./.(x-.1.))+1 in List.rev(t::liste) |n -> let t=floor(1./.(x-.1.))+1 in let y=x/.(1.+.1./.(float_of_int t)) in deveuler y (t::liste) (n-1) in deveuler (x/.(puiss_vit 2. (n_zero-1))) (make_list (n_zero-1) 1) (n-n_zero);; dvlp_Euler (sqrt 2.) 3;; let expand liste = let rec dvlp liste (a,b) = match liste with |[] -> a,b |t::q -> dvlp q ((t+1)*a,t*b) in dvlp liste (1,1);; (* Au delà de n=3, CAML fait n'importe quoi ...*) let rationalize x = let dvlp=dvlp_Euler (sqrt 2.) 3 in expand dvlp;;