begin process at 2010 02 10 01:46:28
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Mono

 > 

Général

 > 

Tres longue variable


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Membre Club
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

Administrateur CodeS-SourceS
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

elephant13

Oki merci
dimanche 7 octobre 2007 à 10:55:15 | Re : Tres longue variable

Bidou

Administrateur CodeS-SourceS
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

Membre Club
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

Membre Club
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?

1 2 3 4

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


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales