FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» KGF.dll - demandes ou suggestions de modifications ou ajouts
par Klaus Aujourd'hui à 19:12

» KGF_dll - nouvelles versions
par Klaus Aujourd'hui à 16:47

» track_bar circulaire
par Klaus Aujourd'hui à 13:54

» API Windows
par Klaus Aujourd'hui à 3:21

» Cartes de voeux, menus, etc.
par JL35 Hier à 17:48

» Mah-Jong européen new-look
par jjn4 Hier à 15:48

» a l'aide klaus
par Minibug Hier à 11:42

» bug SYNEDIT_TARGET_IS_OBJECT
par Jack Hier à 0:16

» Jukebox : Serge Reggiani
par papydall Sam 9 Déc 2017 - 5:58

» Ecouter la radio fm sur votre pc
par pascal10000 Sam 9 Déc 2017 - 3:42

» anomalie
par Klaus Sam 9 Déc 2017 - 3:21

» hommage
par Jicehel Ven 8 Déc 2017 - 11:29

» Logiciel de soutien scolaire en langues.
par Pedro Alvarez Ven 8 Déc 2017 - 10:43

» carte son
par Klaus Ven 8 Déc 2017 - 2:37

» mise a jour calculatrice
par joeeee2017 Mer 6 Déc 2017 - 22:19

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Décembre 2017
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
25262728293031
CalendrierCalendrier

Partagez | 
 

 DLL pour le calcul sur les grands entiers

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
jean_debord

avatar

Nombre de messages : 765
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: DLL pour le calcul sur les grands entiers   Lun 8 Avr 2013 - 12: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.zip

Et 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
Jicehel

avatar

Nombre de messages : 5863
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Lun 8 Avr 2013 - 13:05

Cool Jean est de retour Wink De nouvelles applications mathématiques en perspectives. Merci d'avance.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Lun 8 Avr 2013 - 13:39

cheers Content de te relire Jean !

Encore une pierre à l'édifice Panoramic...
...çà va faire un sacré monument. Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
jean_debord

avatar

Nombre de messages : 765
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Mar 9 Avr 2013 - 11:11

Merci pour ces encouragements. En récompense, voici un petit tutoriel Smile

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%)
                       


               
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
papydall

avatar

Nombre de messages : 5613
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Mar 9 Avr 2013 - 12: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 ! Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
jean_debord

avatar

Nombre de messages : 765
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Mar 9 Avr 2013 - 16:06

Merci Papydall Smile

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.html

C'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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
jean_debord

avatar

Nombre de messages : 765
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Mer 10 Avr 2013 - 11: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
jean_debord

avatar

Nombre de messages : 765
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Jeu 11 Avr 2013 - 11: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"

' ----------------------------------------------------------------------
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
jean_debord

avatar

Nombre de messages : 765
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Jeu 25 Avr 2013 - 10: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
Jicehel

avatar

Nombre de messages : 5863
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Jeu 25 Avr 2013 - 11:43

Merci Jean, la bibliothèque commence à être bien fournie Smile
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 ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Jeu 25 Avr 2013 - 13: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... Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
jean_debord

avatar

Nombre de messages : 765
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Ven 26 Avr 2013 - 9:53

Jicehel a écrit:
Merci Jean, la bibliothèque commence à être bien fournie Smile
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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
jean_debord

avatar

Nombre de messages : 765
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Sam 4 Mai 2013 - 12: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).

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
Jicehel

avatar

Nombre de messages : 5863
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Dim 22 Juin 2014 - 18:08

PS: Jean au fait, je suis retombé sur cette discution. Notre mag tient toujours pour le moment Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
jean_debord

avatar

Nombre de messages : 765
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Dim 22 Juin 2014 - 20:11

Oui, notre magazine tient toujours, et je m'en réjouis bien sûr Smile

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 ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
papydall

avatar

Nombre de messages : 5613
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Dim 22 Juin 2014 - 20:47

Ça c’est bien !
De ma part, je rappelle aussi à Jicehel que « notre mag tient toujours pour le moment »  Smile 
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Jicehel

avatar

Nombre de messages : 5863
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: DLL pour le calcul sur les grands entiers   Dim 22 Juin 2014 - 21: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 Smile

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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Lun 23 Juin 2014 - 20: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: DLL pour le calcul sur les grands entiers   

Revenir en haut Aller en bas
 
DLL pour le calcul sur les grands entiers
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Haribo, c'est beau la vie pour les grands et les petits ♥
» Voie de Programmation pour profil de vitesse
» Calcul des points de fidélité
» logiciel pour faire un plan de grille en fer forgé
» Pourquoi utiliser la pression atmosphérique pour mesurer l'altitude

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos projets-
Sauter vers: