Accueil > Forum > > > > Tres longue variable
Tres longue variable
samedi 6 octobre 2007 à 20:19:09 |
Tres longue variable

elephant13
|
Bonjour, Alors en faite je n'arrive pas à stocker dans des variables des nombres depassant la vingtaine de chiffres. Mais je souhaiterais effectuer des calculs avec des nombres beaucoup plus grands (aux environ de 1000 chiffres). En effet, je suis sur un projet de cryptographie (afin d'appliquer les connaissance vu en cours) ce qui implique des calculs avec de tres grands nombres premiers ..... D'où ma question, est-il possible de stocker des nombres de cette importance dans une variable? si oui comment?
En vous remerciant d'avance, elephant13
|
|
samedi 6 octobre 2007 à 23:01:10 |
Re : Tres longue variable

niky
|
Réponse acceptée !
Salut,
Tu ne peux pas stocker directement des nombres aussi grands. Les types de bases sont généralement limités à 64 bits (c'est le cas de .Net avec les long), ce qui représente une vingtaine de chiffres en base décimale.
Ce que tu peux faire, c'est créer ton propre type de nombres. Le principe consiste à créer une classe qui stocke un tableau d'entiers (par exemple de taille 4) : int[] nbre = new int[4]; A partir de là, tu disposes de 32 (taille des int) * 4 = 128 bits pour stocker un nombre : - les 32 premiers bits sont stockés dans nbre[0] - les bits 33 à 64 sont stockés dans nbre[1] - etc. Cela implique juste de recoder les opérations d'addition, de soustraction, etc. pour permettre de travailler avec ces nombres. En effet, lors des calculs, il faut gérer le report de la retenue entre deux éléments du tableau nbre. Tu peux envisager d'implémenter cela en utilisant la surcharge d'opérateurs disponible en C#.
Pour référence, tu peux voir l'implémentation de la classe BigInteger du langage Java qui réalise exactement ce type de traitement. A noter que le code de cette classe est un peu effrayant : les algorithmes utilisés sont assez costauds :-)
|
|
samedi 6 octobre 2007 à 23:32:38 |
Re : Tres longue variable

coq
|
Salut, Au passage, juste pour info, .NET 3.5 bénificiera d'un type BigInteger : [ Lien ]/* coq MVP Visual C# CoqBlog*/
|
|
dimanche 7 octobre 2007 à 10:50:41 |
Re : Tres longue variable
|
dimanche 7 octobre 2007 à 10:55:15 |
Re : Tres longue variable

Bidou
|
Merci pour l'info coq, c'est vrai que ça pouvait manquer dans certains cas 
-My Blog-
|
|
dimanche 7 octobre 2007 à 15:50:57 |
Re : Tres longue variable

elephant13
|
L'idée qui serait de stocker ces nombre par "paquet" dans un tableau me plait plutot bien. Mais je sais pas trop comment on les "découpe en paquet" (de 10 chifres par ex)...
|
|
dimanche 7 octobre 2007 à 17:05:37 |
Re : Tres longue variable

niky
|
Tu ne pourras pas faire tes calculs en base 10 puisque ce n'est pas comme cela qu'un ordinateur fonctionne.
Pour commencer, ne voit plus tes nombres comme une succession de chiffres (terme couramment employé pour la base décimale) mais comme une suite de bits (spécifiques à la base 2).
Un entier (int) en C# est codé sur 32 bits, c'est à dire un peu plus de 9 chiffres (= (32 * ln 2) / ln 10) en base 10. Sa plage de valeurs s'étend jusqu'à -2^31 dans les négatifs, et jusqu'à 2^31-1 dans les positifs. Si tu oublies la notion de signe (uint), tu peux coder de 0 à 2^32-1 avec un entier de 32 bits.
Maintenant, si tu veux manipuler des nombres de 64 bits, tu divises ces nombres en deux paquets de 32 bits. Pour des nombres de 128 bits, tu feras 4 paquets de 32 bits. Cela implique d'implémenter les opérations mathématiques sur les règles du calcul binaire. Pour cela, les opérateurs binaires de C# te seront utiles : &, |, ^, <<, >>, ~ J'ai moi-même réalisé une version basique de cela il y a quelques
années en C++ :
http://tuxy2885.free.fr/index.php?cat=labo&id=integer
Une fois que tout cela est fait, tu pourras écrire une fonction qui va te transformer ton nombre binaire en une chaîne de caractères qui représentera ton nombre dans la base de ton choix (binaire, octale, décimale, hexadécimale, etc.).
J'ignore ton niveau en maths mais pour calculer sur des nombres aussi grands, il te faut de bonnes connaissances en conversion de bases, logique/algèbre de Boole et calcul sur des nombres binaires.
En espérant t'avoir aidé.
|
|
dimanche 7 octobre 2007 à 17:59:13 |
Re : Tres longue variable

elephant13
|
Oulalalalalala......... Alors mon niveau en math: bon niveau (19 de moyenne) mais je ne suis qu'en debut de TS (specialité maths).
J'ai oublier de preciser que pour les operations je compte me tenir au modulo pour l'instant du genre 183^1079 mod 5141. Peur-être que ca pourra plus t'eclaircir.... Donc je comptais faire des "paquets" elevé à une puissance de 10 par var du tableau puis faire les operation modulo variable par variable donc faire des operation sur des uint64. Donc je croit que ca va pas vraiment avec ce que tu me dis auparavant ce qui me perd un peu dans mes idées. De plus mon niveau en programmation est de debutant, c'est mon premier vrai programme. Donc pour les convertions en suite de bits je suis aussi un peu perdu.
Conclusion: Je suis un peu perdu mais je tiens à preciser que je comprend ce que tu me dis, c'est juste que je ne vois pas vraiment comment l'appliquer à mon problème.
|
|
dimanche 7 octobre 2007 à 18:50:36 |
Re : Tres longue variable

niky
|
Réponse acceptée !
Oki doki...
Je vois ce que tu veux faire. Pour faire 183^1079 mod 5141, il te faut écrire la puissance (donc la multiplication et l'addition) et le modulo (donc la division et la soustraction). Donc presque tout :-)
Pour t'aider à commencer, je vais te montrer comment faire une addition sur une tableau de 2 entiers de 32 bits (qui représentent donc un nombre de 64 bits)... attention, tout ça se fait sur des entiers non signés :
/* Additionne a et b a et b doivent être des tableaux de longueur 2 (si non, il faut adapter le code) a[0] (respectivement b[0]) contient les bits de poids faibles de a (resp. b) a[1] (resp. b[1]) contient les bits de poids forts de a (resp. b) C'est à dire : a = a[0] + 2^32 * a[1] */ public static uint[] Addition(uint[] a, uint[] b) { bool carry = false; // indique s'il y a une retenue uint[] result = new uint[2]; for (uint i = 0; i < 2; i++) { result[i] += a[i] + b[i]; /* Incrémente encore le résultat de 1 s'il y a une retenu Comme on est en base 2, la retenue est soit de zéro, soit de 1 */ if (carry) result[i]++; /* On calcul s'il y a une retenue pour le tour suivant C'est le cas si le résultat de l'addition est plus petit que a (ou b) En effet, cela signifie que l'addition a provoqué un dépassement de capacité pour le processeur et qu'il a du tronqué un bit du nombre. */ carry= (result[i] < a[i]); }
/* ATTENTION ! Si à ce stage carry est à true, cela signifie que l'addition a provoquée un dépassement de capacité (il aurait fallu faire l'addition sur au moins 65 bits parce que a et b étaient trop grand pour que a+b tiennent sur 64 bits). */ return result; }
Je te laisse imaginer la généralisation de cet algo avec des entiers plus grands (=> remplacer les "2" avec la taille des tableaux).
Pour faire 270363096527615 + 68388485210612178, il suffit de pratiquer ainsi : uint[] a = new uint[] { 0xd05432ff, 0x0000f5e4 }; // = 0x0000f5e4d05432ff (hexa)= 270363096527615 (décimal) uint[] b = new uint[] { 0x07b4a1d2, 0x00f2f6f7 }; // = 0x00f2f6f707b4a1d2 (hexa) = 68388485210612178 (décimal) uint[] res = Addition(a, b);
Ce qui doit te renvoyer 0xF3ECDBD808D4D1 (res[0] = D808D4D1, res[1] = F3ECDB).
Si tu veux avoir la représentation décimale à l'écran (68658848307139793 pour notre calcul), il te faut faire la conversion de la base 2 à la base 10. Pour arriver à cela, encore faut il implémenter la division et le modulo ;-)
Good luck !
|
|
dimanche 7 octobre 2007 à 21:13:26 |
Re : Tres longue variable

elephant13
|
Ok merci beaucoup, Je ferais des test demain, et j'essaierais de faire un autre algorythm que je posterais.
Mais tout de même quelque "questions": - "ATTENTION ! Si à ce stage carry est à true, cela signifie que l'addition a provoquée un dépassement de capacité (il aurait fallu faire l'addition sur au moins 65 bits parce que a et b étaient trop grand pour que a+b tiennent sur 64 bits)." Ce que je comprend: Si carry est true, cela eut dire qu'il y a une retenue (65ème bit) et donc cela l'incrementera le tour suivant. Vrai? - Mais imaginons que ca fasse une retenue à la derniere boucle, cela ne pourra pas implementer la suivante ou alors il faut le prevoir et toujours laisser un bit en plus dans le tableau... - pour l'ecriture en base 16, je les "0x"... c'est spour indiquer que c'est en base16, non?
Et autrement en binaire ca donnerais pour le meme exmple: uint[] a = new uint[] { 011010000010101000011001011111111, 0000000000000000111101011110010}; La flemme de faire le b... mais si j'ai pas perdu la main et bien compris ce que tu as dit ca doit être ca, non?
|
|
Cette discussion est classée dans : variable, chiffres, nombres, longue, stocker
Répondre à ce message
Sujets en rapport avec ce message
Stocker le contenu d'un fichier dans une variable en c# [ par Souliabdo ]
Bonjour, <p
c# et variable en mémoire réutilisable dans plusieurs forms [ par djbabou ]
Bonjour, j'aimerai savoir s'il existe une autre façon de garder une variable en mémoire sans pour autant utiliser la classe singleton.En fait, j'ai de
Insérer Variable C# dans un string eval créant du code javascript [ par doublex ]
ie.Frame (Find.ById(testFrame)).Eval("document.write(" + testMod2 + ")")Eval("code j
Insérer Variable C# dans un string eval créant du code javascript [ par doublex ]
Bonjour,Je fais des tests automatiques de non-régression avec WatiN.J'ai une ligne de code où j'utilise la méthode Eval de la bibliothèque WatiN.Voici
Avis développement [ par arnaudpe ]
Bonjour, Je souhaite développer en interne une application qui permet d'éditer est de stocker des fiches comportantde caractéristiques de machines i
enregistrer d'un document Byte [ par Souliabdo ]
Bonjour,J'ai un attribut dans ma classe qui stocke un fichier <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office
PB Avec IF :(( [ par avatar69 ]
Bonjour,j'ai encore 1 ou 2 soucis :(pour des choses simp)lissimes je coince !!!row[96] et un objet semberais t'il est pas une variable comment faire p
Implementer le contenu d'une variable [ par Marcel62 ]
Bonjour, Je suis debutant en C#, et j'aurais besoin de votre aide: Je dispose d'une variable contenant le nom d'une textbox ausquel je veux modifier
Type double problème de calcul [ par mouic ]
Bonjour , je rencontre un problème assez contrariant au sujet des types double. J'ai une variable double nommée total. Je lui ajout une première valeu
Stocker un Cookie [ par tipdeep ]
Bonjour à tous, C'est mon premier message sur CodeS-SourceS ! Cela fait quelques temps que je s'acharne à écrire une fonction mais sans succès. Je c
Livres en rapport
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
Comparez les prix

HTC Magic
Entre 429€ et 429€
|