• # Caclul symbolique en OCaml

    Posté par (site web personnel) . En réponse au journal Une petite histoire d'utilisation type fort dans Ocaml. Évalué à 3. Dernière modification le 18 janvier 2017 à 10:41.

    On peut (doit ?) pousser le concept plus loin, comme par exemple écrire une bibliothèque de calcul matriciel qui vérifie à la compilation la dimensionnalité des calculs.

    Je profite de ta remarque pour mentionner Abach un projet de calcul scientifique en OCaml. Ma motivation est de développer un outil qui permet le calcul formel (polynômes à plusieurs variables, quotients, algèbre linéaire...) sur des objets proches de la formulation mathématique des problèmes – là où la plupart des systèmes de calcul formel demandent de tout transformer en objets basiques du système, ce qui est une opération parfois difficile. Mon but est de pouvoir calculer bientôt des tables de multiplication pour les algèbres de Lie de petit rang puis des choses plus complexes comme les décompositions de Bialinicky-Birula de petites représentations ainsi que de pouvoir travailler sur les corps finis.

    Screenshot

    Un point sympa du programme est que les structures sont capables de transformer leurs éléments en formules TeX, comme illustré par la capture d'écran ci-dessus (en utilisant MathJax).

    Côté code, voici un extrait du programme example générant la sortie ci-dessus:

    
    module P =
    (* The ring of an integral thick point. *)
    struct
     module Internal =
     struct
     module Zepsilon =
     Abach_PolynomialRing.OverRing.Make
     (Z)(struct let indeterminate = Abach_Formula.(greek varepsilon) end)
     module I =
     struct
     type t = Zepsilon.t
     let epsilon2 = Zepsilon.of_array [| 0; 0; 1 |]
     let projection x =
     Zepsilon.rem x epsilon2
     let structure_formula =
     Abach_Formula.parenthesis (Zepsilon.to_formula epsilon2)
     end
     end
     include Abach_Ring.Quotient(Internal.Zepsilon)(Internal.I)
     let structure_formula =
     Internal.Zepsilon.structure_formula
     let epsilon =
     projection Internal.Zepsilon.indeterminate
    end
    module PX =
     Abach_PolynomialRing.OverRing.Make
     (P)(struct let indeterminate = Abach_Formula.(letter 'X') end)
    ...
     "Computing with polynomials over the ring of a thick point.",
     begin
     let a = PX.of_array [| P.one; P.epsilon |] in
     let b = PX.zpower 2 a in
     equal
     (parenthesis ~superscript:(integer 2) (PX.to_formula a))
     (PX.to_formula b)
     end;
    ...