(* module de manipulation de nombres complexes *) type complexe = {Re :float; Im :float} ;; let unC = {Re = 1.; Im = 0.};; let zeroC= {Re = 0.; Im = 0.};; let iC={Re = 0.; Im = 1.};; let JC={Re = -0.5; Im = 0.866025403784};; let conjC a= {Re = a.Re;Im = -.a.Im};; #infix "aC";; (* ajoute dans C *) #infix "sC";; (* soustrait dans C *) #infix "pC";; (* produit dans C *) #infix "dC";; (* divise dans C *) let prefix aC a b= {Re = a.Re+.a.Im; Im = a.Im+.b.Im};; let prefix pC a b= {Re = a.Re*.b.Re-.a.Im*.b.Im;Im = b.Re*.a.Im+.a.Re*.b.Im};; let prefix sC a b= {Re = a.Re-.a.Im; Im = a.Im-.b.Im};; let prefix dC a b= let module_carre=b.Re*.b.Re+.b.Im*.b.Im in {Re = (a.Re*.b.Re+.a.Im*.b.Im)/.module_carre;Im = (b.Re*.a.Im+.a.Re*.b.Im)/.module_carre} ;; (* les détails du module sont d'une inutilité profonde, mais c'est l'usage de faire cela pour montrer qu'on sait le faire*) let modarg {Re=x; Im=y} = let module= let ax=(abs_float x) and ay=(abs_float y) in if ax=0. then ay else if ay=0. then ax else if ax>.ay then let q=ay/.ax in ax*.sqrt(1.+.q*.q) else let q=ax/.ay in ay*.sqrt(1.+.q*.q) in (module,atan2 x y) ;; (* un exemple de calcul *) (* conjC(JC pC JC) sC JC;; *) (* ce qui suit nécessite le chargement préalable de Ini_gr *) let pointC=function {Re=x;Im=y} -> (premier_point (x,y));; let joinsC z=match z with {Re =x;Im =y} -> joins_a (x,y);; pointC JC;; joinsC unC ;;joinsC (JC pC JC);; joinsC JC;;