Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| DLL pour le calcul sur les grands entiers | |
| | Auteur | Message |
---|
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: DLL pour le calcul sur les grands entiers Lun 8 Avr 2013 - 11:13 | |
| Cette DLL est basée sur la bibliothèque LargeInt de S. J. Schaper. Elle permet de faire des calculs sur de grands nombres entiers. Il n'y a pas grand-chose pour l'instant : seulement l'affectation de valeurs et les 4 opérations. Mais ce sera complété progressivement. La Dll est téléchargeable ici : http://sourceforge.net/projects/panolib/files/bigint.zipEt voici un programme de démonstration : - Code:
-
' ********************************************************************** ' Demonstration de la bibliotheque BIGINT ' **********************************************************************
dll_on "bigint.dll"
' ---------------------------------------------------------------------- ' Variables globales utilisees par les sous-programmes ' ----------------------------------------------------------------------
dim bi_result% : ' Resultat d'un calcul dim bi_num$ : ' valeur d'un nombre sous forme de chaine de caracteres dim bi_temp$ : ' Variable temporaire
' ---------------------------------------------------------------------- ' Initialisation de la bibliotheque ' ----------------------------------------------------------------------
dim nInt%
nInt% = 1000
BigInit(nInt%)
print "Nous pouvons utiliser ", nInt%, " nombres de ", bi_result%, " chiffres chacun" print "Ces nombres ont les indices de 0 a ", nInt% - 1
' ---------------------------------------------------------------------- ' Affectation de valeurs aux nombres entiers d'indices 0, 1, 2 ' ----------------------------------------------------------------------
' Affectation par un nombre entier (32 bits) SetNum(0, 123456789)
' Affectation par une chaine de caracteres SetStr(1, "1267650600228229401496703205376") : ' 2^100
' Affectation par un entier aleatoire de n bits ' Intervalle [2^(n - 1) .. 2^n - 1] SetRnd(2, 128) : ' 128 bits
' ---------------------------------------------------------------------- ' Lecture de la valeur d'un nombre dans une chaine de caracteres, ' ainsi que du nombre de chiffres ' ----------------------------------------------------------------------
dim i%
for i% = 0 to 2 GetStr(i%) print print "Le nombre d'indice ", i%, " vaut ", bi_num$, " (", bi_result%, " chiffres)" next i%
' ---------------------------------------------------------------------- ' Operations arithmetiques ' ----------------------------------------------------------------------
SetRnd(0, 128) SetRnd(1, 64)
BigDiv(0, 1, 2, 3)
print : print "Division entiere :"
GetStr(0) : print " ", bi_num$, " \ " GetStr(1) : print " ", bi_num$, " = " GetStr(2) : print " ", bi_num$ GetStr(3) : print "reste ", bi_num$
print : print "Verification :"
GetStr(1) : print " ", bi_num$, " * " GetStr(2) : print " ", bi_num$, " + " GetStr(3) : print " ", bi_num$, " = "
BigMul(1, 2, 0) BigAdd(0, 3, 1)
GetStr(1) : print " ", bi_num$
end
' ---------------------------------------------------------------------- ' Sous-programmes ' ----------------------------------------------------------------------
sub BigInit(n%) bi_result% = dll_call1("BigInit", n%) bi_temp$ = string$(bi_result%, " ") end_sub
sub SetNum(i%, n%) bi_result% = dll_call2("SetNum", i%, n%) end_sub
sub SetStr(i%, a$) bi_result% = dll_call2("SetStr", i%, adr(a$)) end_sub
sub SetRnd(i%, nbits%) bi_result% = dll_call2("SetRnd", i%, nbits%) end_sub
sub GetStr(i%) bi_result% = dll_call2("GetStr", i%, adr(bi_temp$)) bi_num$ = left$(bi_temp$, bi_result%) end_sub
sub BigDup(i%, j%) bi_result% = dll_call2("BigDup", i%, j%) end_sub
sub BigAdd(i%, j%, k%) bi_result% = dll_call3("BigAdd", i%, j%, k%) end_sub
sub BigSub(i%, j%, k%) bi_result% = dll_call3("BigSub", i%, j%, k%) end_sub
sub BigMul(i%, j%, k%) bi_result% = dll_call3("BigMul", i%, j%, k%) end_sub
sub BigDiv(i%, j%, k%, m%) bi_result% = dll_call4("BigDiv", i%, j%, k%, m%) end_sub
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: DLL pour le calcul sur les grands entiers Lun 8 Avr 2013 - 12:05 | |
| Cool Jean est de retour De nouvelles applications mathématiques en perspectives. Merci d'avance. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 8 Avr 2013 - 12:39 | |
| Content de te relire Jean ! Encore une pierre à l'édifice Panoramic... ...çà va faire un sacré monument. | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: DLL pour le calcul sur les grands entiers Mar 9 Avr 2013 - 10:11 | |
| Merci pour ces encouragements. En récompense, voici un petit tutoriel - Code:
-
Bibliothèque BigInt : calcul sur les grands entiers ===================================================
Introduction ------------
La DLL BigInt (basée sur la bibliothèque LargeInt de S. J. Schaper) permet de réaliser des calculs sur de grands nombres entiers.
Les appels aux fonctions de la DLL sont inclus dans des sous-programmes Panoramic. L'utilisateur appelle donc directement ces sous-programmes.
Variables globales ------------------
La bibliothèque utilise 3 variables globales qui doivent être déclarées au début du programme Panoramic:
bi_result% : Valeur de retour d'une fonction de la DLL bi_num$ : Valeur d'un nombre sous forme de chaine de caracteres bi_temp$ : Variable temporaire utilisée par les sous-programmes
Initialisation --------------
Le sous-programme BigInit(n%) initialise la bibliothèque. Le paramètre n% représente le nombre d'entiers que l'on veut utiliser. Le nombre de chiffres maximum de chaque entier est retourné dans la variable bi_result%
P. ex. l'instruction :
BigInit(100)
permet de réserver 100 entiers pouvant avoir jusqu'à 4176 chiffres chacun.
Les entiers sont stockés dans un tableau. On accède à chaque entier par le biais de son indice. Les indices vont de 0 à (n% - 1)
Dans la suite, nous désignerons par (i%) l'entier d'indice i%
Note : la procédure BigInit crée un fichier PrimFlgs.bin de 0 octet qui sera utilisé par les procédures concernant les nombres premiers (non encore implémentées).
Affectation de valeurs ----------------------
Pour affecter une valeur à un grand entier on dispose de 3 procedures :
SetNum(i%, n%) : affecte à l'entier (i%) la valeur de n% (entier 32 bits)
Exemple : SetNum(0, 123456789)
SetStr(i%, a$) : affecte à l'entier (i%) le nombre représenté par la chaîne de caractères a$. On peut utiliser un nombre hexadécimal à condition de le préfixer par "&H" Exemple : SetStr(1, "12345678901234567890") SetStr(2, "&H123456789ABCDEF") SetRnd(i%, n%) : affecte à l'entier (i%) un nombre aléatoire de n% bits allant de 2^(n% - 1) à (2^n% - 1) Exemple : SetRnd(3, 128)
Lecture d'une valeur --------------------
La procédure GetStr(i%) permet de lire la valeur décimale de l'entier (i%) dans la chaîne de caractères bi_num$. Le nombre de chiffres est retourné dans bi_result%
Opérations arithmétiques ------------------------
On dispose des procédures suivantes :
BigDup(i%, j%) : Copie (i%) dans (j%)
BigAdd(i%, j%, k%) : Somme (i%) + (j%). Résultat dans (k%)
BigSub(i%, j%, k%) : Différence (i%) - (j%). Résultat dans (k%)
BigMul(i%, j%, k%) : Produit (i%) * (j%). Résultat dans (k%)
BigDiv(i%, j%, k%, m%) : Division entière de (i%) par (j%). Place le quotient dans (k%) et le reste dans (m%)
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: DLL pour le calcul sur les grands entiers Mar 9 Avr 2013 - 11:49 | |
| @Jean_debord Très intéressant, merci Jean_debord. @tous Pour les puristes qui ne jurent que par le PANORAMIC pur (sans DLL et autres INCLUDE) , je suis en train de coder les procédures nécessaires pour manipuler les grands nombres. Ces procédures permettront d’effectuer les 4 opérations arithmétiques de base, à savoir : l’addition, la soustraction, la multiplication et la division entière avec quotient et reste. Je ne prétends pas faire mieux que jean_debord (je n’en suis pas capable !) mais j’essaye d’apprendre : je suis un éternel étudiant ! | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: DLL pour le calcul sur les grands entiers Mar 9 Avr 2013 - 15:06 | |
| Merci Papydall En fait, je me contente d'adapter à Panoramic une bibliothèque existante. Tout le mérite revient au programmeur initial, le hollandais S. J. Schaper. Son site est ici : http://home.versatel.nl/vspickelen/index.htmlC'est vrai qu'il est un peu fastidieux de devoir passer par des DLL, mais pour le moment c'est le seul moyen de fusionner du code FreeBASIC existant avec du code Panoramic. Le nouveau compilateur devrait améliorer les choses... | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: DLL pour le calcul sur les grands entiers Mer 10 Avr 2013 - 10:52 | |
| 2 petites modifications :
- ajout d'une procédure BigRat qui fournit une approximation rationnelle du rapport de 2 grands entiers - les définitions des variables globales et des procédures sont désormais placées dans des fichiers à inclure
| |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: DLL pour le calcul sur les grands entiers Jeu 11 Avr 2013 - 10:57 | |
| Nouvelles fonctions : BigChs (changement de signe) BigSqr (élévation au carré) BigSqrt (racine carrée) BigPow (élévation à une puissance entière) BigFact (factorielle) Et un petit programme de démonstration : - Code:
-
' ********************************************************************** ' Demonstration de la bibliotheque BIGINT ' **********************************************************************
dll_on "bigint.dll"
' ---------------------------------------------------------------------- ' Definition des variables globales ' ----------------------------------------------------------------------
#include "bigvar.inc"
' ---------------------------------------------------------------------- ' Initialisation de la bibliotheque ' ----------------------------------------------------------------------
dim nInt%
nInt% = 1000 : ' Adapter en fonction de la taille des nombres a calculer
BigInit(nInt%)
print "Nous pouvons utiliser ", nInt%, " nombres de ", bi_result%, " chiffres chacun" print
' ---------------------------------------------------------------------- ' Demonstration des procedures BigPow, BigSqr, BigSqrt, BigFact ' ----------------------------------------------------------------------
' Calcul de 2^100 SetNum(0, 2) BigPow(0, 100, 1) GetStr(1) print "2^100 =", bi_num$ print
' Calcul de 2^200 par mise au carre du resultat precedent BigSqr(1, 2) GetStr(2) print "2^200 =", bi_num$ print
' Racine carree du resultat redonne 2^100 BigSqrt(2, 3) GetStr(3) print "2^100 =", bi_num$ print
' Calcul de la factorielle de 50 BigFact(50, 4) GetStr(4) print "50! =", bi_num$ print
' ---------------------------------------------------------------------- ' Fin du programme principal ' ----------------------------------------------------------------------
end
' ---------------------------------------------------------------------- ' Definition des sous-programmes ' ----------------------------------------------------------------------
#include "bigint.inc"
' ----------------------------------------------------------------------
| |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: DLL pour le calcul sur les grands entiers Jeu 25 Avr 2013 - 9:09 | |
| Nouvelles fonctions :
BigSwap : Echange de 2 grands entiers
BigCmp : Comparaison de 2 grands entiers
BigIsf : Comparaison d'un grand entier avec un entier 16 bits
BigInc : Incrémentation d'un grand entier par un entier 16 bits
BigShl : Décalage à gauche
BigShr : Décalage à droite
BigGCD : Plus grand commun diviseur de 2 grands entiers
BigLCM : Plus petit commun multiple de 2 grands entiers
BigPrimList : Ecrit une liste de nombres premiers dans un fichier texte | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: DLL pour le calcul sur les grands entiers Jeu 25 Avr 2013 - 10:43 | |
| Merci Jean, la bibliothèque commence à être bien fournie PS: Ca n'a rien n'a voir mais contribues-tu toujours à des emag ? J'étais tombé par hazard sur tes articles d'il y a une quinzaine d'années ... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 25 Avr 2013 - 12:58 | |
| Merci Jean ! Une dll que j' ajoute à la collection. Même si je n'utilise pas de grand entier pour l'heure, qui sait de quoi demain sera fait... | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: DLL pour le calcul sur les grands entiers Ven 26 Avr 2013 - 8:53 | |
| - Jicehel a écrit:
- Merci Jean, la bibliothèque commence à être bien fournie
PS: Ca n'a rien n'a voir mais contribues-tu toujours à des emag ? J'étais tombé par hazard sur tes articles d'il y a une quinzaine d'années ... Il y a une quinzaine d'années ? Ce devait être dans "Prograzine"... mais ce magazine a disparu ! En fait, ils disparaissent tous l'un après l'autre. Le dernier auquel j'ai collaboré était "Back2Basic", avec la traduction anglaise de mes articles sur Panoramic. Mais lui aussi a cessé de paraître ! Pour en revenir à la DLL, elle sera complétée prochaînement avec les fonctions de décomposition en facteurs premiers. | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: DLL pour le calcul sur les grands entiers Sam 4 Mai 2013 - 11:14 | |
| Nouvelle fonction : BigPrimDec (décomposition en facteur premiers) L'algorithme est une version améliorée de la méthode des divisions successives (voir http://fr.wikipedia.org/wiki/Nombre_premier). Il peut ne pas détecter les facteurs lorsque ceux-ci sont trop grands. dans ce cas, un point d'interrogation figure dans le résultat. P. ex. le nombre 2305843008139952128 est bien décomposé : 2^30 * 2147483647 En revanche, le nombre 2854495385411919762116571938898990272765493247 ne l'est qu'incomplétement. En effet on devrait obtenir : 18121 * 55871 * 165799 * 2332951 * 7289088383388253664437433 Mais les 2 derniers facteurs ne sont pas identifiés, donc on obtient : 18121 * 55871 * 165799 * (?) Des méthodes plus performantes existent (et seront probablement implémentées par la suite) mais il faut savoir que les nombres constitués de très grands facteurs (ces facteurs n'ayant pas de propriétés particulières) ne peuvent être décomposés dans un temps raisonnable. C'est le principe de la cryptographie à clé publique (algorithme RSA). | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: DLL pour le calcul sur les grands entiers Dim 22 Juin 2014 - 17:08 | |
| PS: Jean au fait, je suis retombé sur cette discution. Notre mag tient toujours pour le moment | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: DLL pour le calcul sur les grands entiers Dim 22 Juin 2014 - 19:11 | |
| Oui, notre magazine tient toujours, et je m'en réjouis bien sûr Le caractère collaboratif du magazine, avec les correcteurs etc., est un avantage par rapport aux magazines américains. Et en ce qui concerne les grands entiers, j'ai un projet d'article sur mon bureau ... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: DLL pour le calcul sur les grands entiers Dim 22 Juin 2014 - 19:47 | |
| Ça c’est bien ! De ma part, je rappelle aussi à Jicehel que « notre mag tient toujours pour le moment » | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: DLL pour le calcul sur les grands entiers Dim 22 Juin 2014 - 20:25 | |
| Cool Jean, c'est en effet un sujet intéressant. En fait, je viens de commencer un article sur le pseudo code (algorithmique) et je me suis servi des grands entiers comme type de données numérique personnalisé. Les types de variables sont très variables en pseudo code. On aura peut être à discuter sur mon article. Je ne suis pas sûr que tout le monde sera d'accord avec ce que j'écris. On verra bien En tout cas il y a d'autres type qu'il faut avoir avec les procédures qui vont bien comme les booléens, les réels en notation scientifiques, voir les irréels. Bon, ne tout cas, content de savoir que tu as un article sous le coude. Personnellement, j'ai trouvé beaucoup d’intérêt aux derniers articles. J'ai peut être un parti pris, mais bon, c'est mon avis. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 23 Juin 2014 - 19:59 | |
| Notre magazine tient et tiendra ! (Quitte à faire du 23/24 si il le faut... ...mais je n' en suis pas là heureusement)
@ Jean Debord,
Je suis impatient de lire ce nouvel article même si cela risque d' être "hard" pour moi. | |
| | | Contenu sponsorisé
| Sujet: Re: DLL pour le calcul sur les grands entiers | |
| |
| | | | DLL pour le calcul sur les grands entiers | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |