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
MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril SHAREPOINT 15 TECHNICAL PREVIEW MANAGED OBJECT MODEL SOFTWARE DEVELOPMENT KITSHAREPOINT 15 TECHNICAL PREVIEW MANAGED OBJECT MODEL SOFTWARE DEVELOPMENT KIT par Matthew
http://www.microsoft.com/download/en/details.aspx?id=28768&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+MicrosoftDownloadCenter+(Microsoft+Download+Center) ...
Cliquez pour lire la suite de l'article par Matthew
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|