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
QUELQUES TRUCS INTéRESSANTS (05/09/2010)QUELQUES TRUCS INTéRESSANTS (05/09/2010) par coq
Cette fois-ci : .NET Debug / Performance Sécurité SQL Server .NET Determining if a type is defined in the .NET Framework (blog de Scott Dorman) Ha tiens, je n'avais jamais vraiment pensé à utiliser le jeton de clé publique...
Cliquez pour lire la suite de l'article par coq ENUMERABLECOLLECTIONENUMERABLECOLLECTION par Matthieu MEZIL
Prenons le scénario suivant. On utilise MVVM. On a les deux classes suivantes dans le model : public class Child { } public class Parent { private ObservableCollection < Child > _children; public ObservableCollection < Child > Children { get {...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [HS] CHROME 6 + MOI = COUP DE GUEULE ![HS] CHROME 6 + MOI = COUP DE GUEULE ! par JeremyJeanson
Attention, le poste qui suit n'est pas la complainte d'une personne : Qui n'aime pas Chrome. D'un anti Google. D'un développeur qui a un poil énorme dans la main. Ceux qui me fréquentent savent que je change de navigateur favori tous les 2 ou 3 mois afin ...
Cliquez pour lire la suite de l'article par JeremyJeanson [WP7] UTILISER UN WRAPPANEL DANS UNE APPLICATION WINDOWS PHONE 7[WP7] UTILISER UN WRAPPANEL DANS UNE APPLICATION WINDOWS PHONE 7 par Audrey
Lors de la réalisation de ma 2ème application Windows Phone 7, j'ai souhaité utiliser un WrapPanel pour afficher plusieurs photos. Mais le contrôle WrapPanel ne fait pas parti de la liste des contrôles inclus dans le SDK de la version Beta des outils pour...
Cliquez pour lire la suite de l'article par Audrey [WP7] BESOIN D'AVOIR DES DONNéES EN CACHE[WP7] BESOIN D'AVOIR DES DONNéES EN CACHE par Nicolas
Les développeurs ASP.NET ont l'habitude de mettre des données en cache pour éviter de requêter a chaque fois la base de données. Et il est toujours utilie de penser que vos utilisateurs mobiles n'ont pas troujours une super connexion 3G/WIFI et un for...
Cliquez pour lire la suite de l'article par Nicolas
Logiciels
WebLogAndPass (1.0.0)WEBLOGANDPASS (1.0.0)WebLogAndPass est un logiciel permettant de mémoriser vos sites préférés et pour chacun d'entre-e... Cliquez pour télécharger WebLogAndPass uTorrent (2.0.4)UTORRENT (2.0.4)C'est un client BitTorrent très puissant et très performant. Comme son nom l'indique, uTorrent (m... Cliquez pour télécharger uTorrent Bureau de Gestion - ERP Devis Facturation (2.02)BUREAU DE GESTION - ERP DEVIS FACTURATION (2.02)- Version gratuite du 10/06/2010
Le Bureau de Gestion est un logiciel dédié à la gestion de l'en... Cliquez pour télécharger Bureau de Gestion - ERP Devis Facturation 4Videosoft Transfert iPod Mac (3.2.08)4VIDEOSOFT TRANSFERT IPOD MAC (3.2.08)4Videosoft Transfert iPod-Mac caractérise principalement à transférer les fichiers iPod vers Mac.... Cliquez pour télécharger 4Videosoft Transfert iPod Mac 4Videosoft HD Convertisseur (3.3.08)4VIDEOSOFT HD CONVERTISSEUR (3.3.08)Etant le meilleur HD Vidéo Convertisseur, 4Videosoft HD Convertisseur, vous pouvez regarder la vi... Cliquez pour télécharger 4Videosoft HD Convertisseur
|