IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Correction de programmes simples.


Sujet :

Caml

  1. #1
    Inactif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Points : 25
    Points
    25
    Par défaut Correction de programmes simples.
    Bonjour, pouvez-vous me dire comment améliorer/corriger/simplifier/, etc., les programmes suivants (écrits en Caml light):

    1) Suppression de tous les zéros à la fin d'un vecteur (si le vecteur ne contient que des zéros, en laisser quand même un).

    2) Egaliser la longueur de 2 vecteurs en complétant par des zéros à la fin.


    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let kill_zeros v =
    	let n=vect_length v and p=ref 0 in
    	while !p<n & v.(n- !p-1) =0  do p:= !p+1 done;
    	if !p=n then [|0|] else
    		begin
    			let res=make_vect (n- !p) 0 in
    				for k=0 to (n- !p-1) do
    					res.(k) <- v.(k)
    				done;
    			res
    		end
    ;;
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    let mmlong u v=
    (*complete u ou v par des zéros à droite pour qu'ils aient la même longueur, et renvoie (u,v) *)
    	let aux u1 u2 p q= (* p=vect_length u1, q=vect_length u2, p<q *)
    		let res=make_vect q 0 in
    			for k=0 to p do
    				res.(k)<-u1.(k)
    			done;
    		(res,u2)
    	in
    	let m=vect_length u and n=vect_length v in
    	if m<n then aux u v m n
    	else if m>n then aux v u n m
    	else (*m=n*) (u,v)
    ;;

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    1) ton code ne marchera pas si tu oublies les déréférencements

    tu aurais du utiliser cette fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (* sub_vect : 'a vect -> int -> int -> 'a vect *)
     
    sub_vect v 0 (n-(!p)+1)
    2) utilises concat_vect

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     (* concat_vect : 'a vect -> 'a vect -> 'a vect *)
    let mmlong u v =
      let n = vect_length u in 
      let m = vect_length v in
      if n=m 
      then (u,v)
      else
        if n<m then (concat_vect u (make_vect (m-n) 0),v) 
                 else (u,concat_vect v (make_vect (n-m) 0))
    ;;

    au passage, n'hésites pas à lire ceci : http://caml.inria.fr/pub/distrib/cam...cl74refman.pdf
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    C'est pour faire une multiplication Karatsuba ?
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  4. #4
    Inactif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Points : 25
    Points
    25
    Par défaut
    1) Je n'ai pas compris :
    Qu'est-ce qu'un déférencement ?
    Pourquoi utiliser la fonction sub_vect ?
    Qu'est-ce qui ne marche pas ?

    2) ok, je ne connaissais pas cette fonction, il est vrai que c'est plus élégant.


    Non ce n'est pas pour faire une multiplication rapide, c'est pour faire des multiplications (et opérations en général) sur des nombres dits p-adiques (en gros, ce sont un peu des entiers, voir par exemple wikipedia pour plus de détails).

    Par ailleurs, que pensez-vous des deux "programmes" suivants :

    un type produit pour les adique (notamment, pensez-vous le choix d'un vecteur approprié pour sauvegarder un nombre p-adique, ou une liste serait-elle mieux ?) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type adique={mantisse : int vect ; base : int};;
    la fonction d'affichage, qui va afficher un nombre sous la forme (312)_5, où 5 est la base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    let affichage a=
     let rec concat_elements v n acc=
      if acc=n then "" else (string_of_int v.(acc)) ^ (concat_elements v n (acc+1))
     in
     let affiche_mantisse vect = concat_elements vect (vect_length vect) 0
     in
     "(" ^ (affiche_mantisse a.mantisse) ^ ")_" ^ (string_of_int a.base) ;;

  5. #5
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Le déréferencement c'est l'opérateur ! qui le réalise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # (!);;
    - : 'a ref -> 'a = <fun>
    Pour l'addition on veut d'abord traiter les digits de poids faible.
    Pour la comparaison on veut d'abord traiter les digits de poids fort.
    Par conséquent un vecteur est plus approprié qu'une liste parce que moins orienté.

    Je vois bien l'utilité d'enlever les zéros non significatifs, par contre j'avoue ne pas voir l'intérêt d'en ajouter, ni même d'avoir deux vecteurs de même longueurs.
    Tu dois pouvoir appliquer Karatsuba si la multiplication est distributive dans Qp.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Si tu as besoin de redimensionner tes tableaux sans cesse, c'est sans doute qu'il y a un problème. Peut-être qu'une liste est alors plus adaptée. As-tu vraiment besoin de l'accès à une position arbitraire ?

Discussions similaires

  1. Réponses: 11
    Dernier message: 12/12/2006, 00h53
  2. Quel langage de programmation pour des programmes simples ?
    Par Pierre.g dans le forum Langages de programmation
    Réponses: 18
    Dernier message: 22/11/2006, 14h22
  3. Programme "simple" devient très lent ?
    Par Invité dans le forum Delphi
    Réponses: 8
    Dernier message: 18/09/2006, 22h32
  4. Correction de programme
    Par Thesilverking dans le forum Assembleur
    Réponses: 4
    Dernier message: 09/09/2006, 04h07
  5. Création de programme simple
    Par mz-hacker dans le forum Windows
    Réponses: 1
    Dernier message: 06/08/2006, 00h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo