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

Codes sources à télécharger Delphi Discussion :

Bibliothèques de routines de calculs pour les nombres entiers géants [Sources]


Sujet :

Codes sources à télécharger Delphi

  1. #1
    Membre actif

    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2009
    Messages : 128
    Points : 203
    Points
    203
    Par défaut Bibliothèques de routines de calculs pour les nombres entiers géants
    Bonjour,

    Je vous propose un nouvel élément à utiliser : Bibliothèques de routines de calculs pour les nombres entiers géants

    NewGInt et NewGCent sont deux bibliothèques sous forme d'unités .pas s'intégrant parfaitement à vos programmes Delphi compilés en 32 bits. Elles permettent toutes manipulations calculatoires sur des nombres entiers géants sans limite de taille (sauf capacité matérielle), l'une en base 256 et l'autre en base 100.



    Les deux fichiers .pas sont accompagnés dans le zip par une notice pour en saisir toute la philosophie et s'en approprier les nombreuses procédures et fonctions qu'elles contiennent.

    Qu'en pensez-vous ?

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Rekin85 : Qu'en pensez-vous ?
    Le ZIP est vide ... Sinon le sujet est intéressant.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 852
    Points : 11 285
    Points
    11 285
    Billets dans le blog
    6
    Par défaut
    Bonjour Gilbert,

    Certes vide, mais René a dû recevoir un message à ce sujet pour le téléverser à nouveau. Et pê ajouter un titre au bouton de téléchargement !

    Bon code,
    Yves.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre actif

    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2009
    Messages : 128
    Points : 203
    Points
    203
    Par défaut
    Effectivement Gilbert, le Zip est vide !... Et je ne parviens pas à le déposer à nouveau : je ne trouve aucune possibilité pour revenir dessus... Désolé...

    En attendant, je place le fameux Zip ici en pièce jointe.

    NewUnits.zip

    Bonjour Yves,

    Effectivement, je veux bien faire ce que Alcatiz et toi m'ont suggéré, mais comment ? Faut-il redéposer une nouvelle mouture complète ? Et alors, comment supprimer l'ancienne ? Je ne parviens pas à trouver une voie pour parvenir à modifier ce qui est déposé.

  5. #5
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 414
    Points
    59 414
    Billets dans le blog
    2
    Par défaut
    L'archive est de nouveau téléchargeable.

    Ne vois-tu pas le bouton d'édition tel qu'à gauche sur cette image ?
    Nom : bouton-edition-fiche-telechargement.png
Affichages : 637
Taille : 1,7 Ko
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  6. #6
    Membre actif

    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2009
    Messages : 128
    Points : 203
    Points
    203
    Par défaut
    Bonjour Alcatiz,

    Effectivement les icônes d'édition et suppression sont bien présentes et même les popups explicatifs de chacun. Je ne sais que dire ou faire pour obtenir des excuses : mea culpa ! Il faut dire qu'innocemment je voulais trouver un bouton explicite avec la mention "Editer" ou "Mettre à jour". A ma décharge, je reconnais ne pas être un habitué de la rubrique.

    Les unités sont maintenant téléchargeables et je souhaite à tous les amateurs éventuels de bien coder avec et d'en tirer toutes satisfactions.

    J'en profite pour signaler que le dossier contient dans un zip aussi un exécutable dénommé "Calculator". C'est une calculette créée pour illustrer quelques possibilités offertes par l'unité NewGInt sans plus.

  7. #7
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 414
    Points
    59 414
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Rekin85 Voir le message
    Je ne sais que dire ou faire pour obtenir des excuses : mea culpa !
    Non, surtout pas, c'est plutôt à nous de te remercier de proposer des ressources de qualité !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 448
    Points
    15 448
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Pour ceux qui (comme moi) ne connaissent pas l'assembleur, le code est impossible à étudier, d'autant qu'il est plutôt volumineux (presque 4000 lignes pour la seule unité NewGint) mais il a l'air très efficace. Félicitations !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    program Fibonacci;
    {$APPTYPE CONSOLE}
     
    uses
      NewGInt;
     
    const
      N = 10000;
     
    var
      a: array[0..N]of GInt;
      i: integer;
     
    begin
      a[0] := FStrToGInt('0');
      a[1] := FStrToGInt('1');
     
      for i := 2 to N do
        a[i] := FAddGInt(a[i - 1], a[i - 2]);
     
      WriteLn(FGIntToStr(a[N]));
      ReadLn;
    end.
    Testé avec Delphi 7 sous Windows 8.1.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  9. #9
    Membre actif

    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2009
    Messages : 128
    Points : 203
    Points
    203
    Par défaut
    Bonjour Roland,

    Bien vu le calcul du Nième de la suite de Fibonacci. Merci pour le test.

    Mais je me dois de faire une petite remarque : la capacité mémoire de la machine ! Avec les GInt et encore plus avec les GCent, dans les processus itératifs, on ne se rend pas toujours bien compte des kyrielles d'octets que les routines doivent manipuler et garder. Ainsi dans ton exemple, tu utilises un array qui, si on pousse les demandes de résultats va vite crier grâce...

    Je reviens à ce que je préconise dans la notice d'accompagnement : la simplicité du code. Ainsi pour ton exemple, ne garder que les deux derniers GInt pour toute la suite des calculs. Moi, voici ce que j'ai cogité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function Fibonacci(N: longword): GInt;
    var
      Nb1,Nb2,Nb3: GInt;
      i: integer;
    begin
      Nb3:=FGIntNul;
      Nb1:=FGIntNul;
      Nb2:=FIntToGInt(1);
      for i:=1 to N do begin
          Nb3:=FAddGInt(Nb2,Nb1);
          Nb1:=FCopyGInt(Nb2);
          Nb2:=FCopyGInt(Nb3);
      end;
      Result:=Nb3;
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var Nb: GInt;
    begin
       Nb:=Fibonacci(100000);
       Showmessage(FGIntToStr(Nb));
    end;
    En l'occurence, ici le 100 000 ième de Fibonacci est un GInt de plus de 8000 octets. Certes, les recopies bouffent du temps, mais garantissent le processus.

    Oui, l'ASM... C'est le lot des routines basiques si on veut qu'elles soient suffisamment efficientes...

  10. #10
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 448
    Points
    15 448
    Billets dans le blog
    9
    Par défaut
    Merci pour les explications et l'exemple.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Rekin85 : Mais je me dois de faire une petite remarque : la capacité mémoire de la machine ! Avec les GInt et encore plus avec les GCent, dans les processus itératifs, on ne se rend pas toujours bien compte des kyrielles d'octets que les routines doivent manipuler et garder. Ainsi dans ton exemple, tu utilises un array qui, si on pousse les demandes de résultats va vite crier grâce...
    Absolument d'accord René, mais comme Roland Chastain s'intéresse peut-être également aux GCent j'en profite pour signaler un avantage qui distingue les GCent des GInt :
    Comme les GCent sont des string codées en base 100 on peut à tout moment savoir (via le Result de la function IsDiv10GCent(Nv: GCent; var P10: boolean): longword) le nombre de 0 terminaux de la string lorsque la var P10 Renvoie true quand Nv=10^N ce qui permet de créer un troisième type de variables comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type tMonType = record
                  Signe : Char;    //< si besoin est
                  Nv     : GCent;  //< chaîne numérique représentée en base 100 expurgée des puissances de 10 
                  Expo  : Int64;   //< accumulateur des puissances de 10, qui permet en plus de déterminer la position de la virgule si on veut utiliser les GCent pour des calculs avec des Grands Réels ou des Réels lilliputiens.
                  end;
    et avec des variables de ce type dès que le GCent Nv contient des zéros terminaux on peut illico raccourcir la longueur du GCent et reporter les puissances de 10 dans Expo d'où gains de vitesse + gains de Ram disponible.

    Exemple pour Factorielle(1234567) = 621590586471231550926149008331891933156379855913769E6984170
    en plus un tel résultat s'affiche sur une seule et unique ligne alors qu'en affichant le même nombre non expurgé des puissances de 10, celui-ci avec ses 6984170 zéros occupe ou déborde tout l'écran car le problème avec les calculs sur des Grands nombres c'est que pour en connaître leur résultat il faut bien en afficher le résultat quelque part ...

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

Discussions similaires

  1. [Smarty] Séparateur de millier pour les nombres
    Par Dionyzos dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 10/11/2011, 17h21
  2. Aide pour les nombres palindromes
    Par MissB dans le forum C++
    Réponses: 7
    Dernier message: 04/11/2011, 10h07
  3. Inversion de calcul (pour les matheux)
    Par gglefoncede dans le forum Langage SQL
    Réponses: 6
    Dernier message: 15/05/2009, 23h15
  4. Imposer un format pour les nombres
    Par al85 dans le forum Struts 1
    Réponses: 0
    Dernier message: 02/02/2009, 16h34
  5. [XAML] Calcul pour les valeurs de variable
    Par MrDuChnok dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 05/05/2008, 20h59

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