CLASSE INTEGER POUR GÉRER LES GRANDS ENTIERS

BinOff Messages postés 25 Date d'inscription mardi 24 juillet 2001 Statut Membre Dernière intervention 13 décembre 2007 - 4 janv. 2004 à 11:30
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 - 23 janv. 2013 à 12:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/19105-classe-integer-pour-gerer-les-grands-entiers

007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
23 janv. 2013 à 12:06
Bonjour,

Merci pour cette classe utile qui nous permet de progresser...

Ayant à manipuler de très grands nombres j'aimerais accélerer la racine carrée (de A Integer) en partant d'une première approximation (prmRcn) calculée à partir de la racine d'un float calculé à partir des m_Digits (et utiliser ensuite l'algorythme newVal=(oldVal+A/oldVal)/2 s'il est plus rapide que la dichotomie).

Malheureusement, je m'en sort pas avec les lists et n'arrive pas à construire une fonction float GetValue(Integer &a const); ou même à utiliser la fonction existante GetDigits()...

D'avance merci.

NB : Je suggère un ajout pour la fonction pow

Integer pow(Integer a, int b)
{
if(a == 0) return 1;
if(a == 1) return 1;if(a -1) return (b % 2 0) ? 1 : -1;
if(b == 0) return 1;
if(b < 0) throw Error("Erreur de domaine");
Integer result=1,p=a;
while (0>1)) p*=p;
}
return result;
}
TheCamel Messages postés 26 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 23 février 2011 1
23 févr. 2011 à 13:47
Bonjour,

Magnifique classe qui va m'être très utile. J'ai cependant un petite question : pourquoi utilise-tu des int que tu limites à 10000 (perte considérable de mémoire) au lieu de char que tu limiterais à 100 (grosse économie de place par rapport à ton code) ?

Merci beaucoup pour cette classe très utile.

Cordialement,
Benoît
skone007 Messages postés 166 Date d'inscription mercredi 24 avril 2002 Statut Membre Dernière intervention 23 juin 2009
30 janv. 2008 à 16:18
Il y a un bug quand je fais Integer("2971215073") / Integer("27011") Donc quand je fais aussi Integer("2971215073") % Integer("27011"). L'opération ne ce fait jamais
skone007 Messages postés 166 Date d'inscription mercredi 24 avril 2002 Statut Membre Dernière intervention 23 juin 2009
21 juil. 2007 à 22:23
oupss en effet mais la sorti de ma fonction est un entier comment gérer as tu une solution ? ret est un entier
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
20 juil. 2007 à 21:08
Comme son nom l'indique, mon code gère les entiers.

sqrt5 = sqrt5.Sqrt(Integer("5")); vaut donc 2
et Integer invsqrt5 = Integer("1") / sqrt5; vaut 0

ce qui explique tes résultats
skone007 Messages postés 166 Date d'inscription mercredi 24 avril 2002 Statut Membre Dernière intervention 23 juin 2009
20 juil. 2007 à 15:23
J'ai un petit problème avec la classe je est utilisé pour calculer la suite de fibonacci avec la formule explicite voilà mon code :
Integer fib(int n)
{
Integer ret;
try
{
Integer sqrt5 = Integer("5");
sqrt5 = sqrt5.Sqrt(Integer("5"));
Integer invsqrt5 = Integer("1") / sqrt5;

Integer phi = (Integer("1") + sqrt5)/Integer("2");
phi = pow(phi, n);
Integer phi2 = (Integer("1") - sqrt5)/Integer("2");
phi2 = pow(phi2, n);
ret = invsqrt5 * (phi - phi2);
}
catch(Error& e)
{
cout << "Erreur: " << e.GetMessage();
}

return ret;
}

et dans mon main
while(a != 10)
{
cout << fib(a).to_string() << endl;
cout << fib(a).to_int() << endl;
cout << fib(a) << endl;
a++;
}

mais rien j'ai affichié
0
0
0_
0
0
0_
0
0
0_...
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 mars 2006 à 17:33
Problème de multiplication en fait: si on fait 10000000 par exemple, on sera obligé d'utiliser des entiers 64 bits pour faire tenir le résultat intermédiaire. Alors que 10000*10000 tient bien sur 32 bits
Si je me souviens bien, c'est quand même un perte de vitesse non négligeable
cs_Sparow Messages postés 5 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 mars 2006
30 mars 2006 à 01:05
Vraiment pas mal ! Mais j'ai tjrs pas compris pourquoi tu limites la valeur des entiers de ta sdt::list à 10000 (plus de la moitié des bits ne servent à rien... 10000 étant codé sur 14 bits alors qu'un entier en contient 32). C'est une question de vitesse? Où alors une question de portabilité pour les compilos à entiers de 16 bits? (anciennes versions de borland par exemple...)
clem0338 Messages postés 65 Date d'inscription mercredi 19 juin 2002 Statut Membre Dernière intervention 9 mars 2008
8 août 2005 à 09:11
oki, seigneur, je te remercie infiniment
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
5 août 2005 à 18:04
J'ai ajouté une focntion Sqrt, mais avec un autre algo, plus rapide
clem0338 Messages postés 65 Date d'inscription mercredi 19 juin 2002 Statut Membre Dernière intervention 9 mars 2008
5 août 2005 à 09:23
Yo, integer me semble parfait, si tu veut, voici un algo parmis d'autre:
type Racine( type x )
type i = 1;
type n = 0;

while ( i < x ) {
x -= i;
i += 2;
n++;
};

return ( n );
}

@+
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 août 2005 à 17:50
Deja faut voir ce que tu veux en résultat: la partie entiere de la racine carrée, sous forme de Integer, ou bien un float?
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 août 2005 à 17:47
Bien sur, si tu me donne un algo. Je sais plus trop comment on calcule la recine carrée. Je vais chercher
clem0338 Messages postés 65 Date d'inscription mercredi 19 juin 2002 Statut Membre Dernière intervention 9 mars 2008
4 août 2005 à 10:50
Yo, vecchio,

ca vas ?

Je voulais savoir s'il y avais une evolution possible de ce code pour gerer la racine carré de l'integer.

Merci
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 avril 2004 à 18:59
Le problème de puissances est réglé
Pour l'autre problème, tu peux monter un cas ou ca foire?
newic500 Messages postés 6 Date d'inscription vendredi 26 mars 2004 Statut Membre Dernière intervention 10 juin 2005
26 avril 2004 à 21:24
#include "Integer.h"

//calcule (value^e)%n
Integer powermod(Integer value, Integer e , Integer n)
{
Integer answer;
bool flag = true;

if (e%2 == 0)
answer = 1;
else
answer = value;
do
{
e = e/2;
if (e == 0)
flag = false;
else
{
value = (value*value)%n;

if (e%2 != 0)
answer = (answer*value)%n;
}

}while(flag);

return answer;
}

int main()
{
try
{
Integer e = Integer("811962581");
Integer d = Integer("3894647741");
Integer n = Integer("4080527237");

Integer answer = powermod(1, e, n);
cout << answer << endl;
answer = powermod(answer, d, n);
cout << answer << endl;

}
catch(Error& e)
{
cout << "Erreur: " << e.GetMessage();
}
return 0;
}

Ce code la fonctionne pour les petits nombres !
Vous reconnaitrez un algo RSA avec ses clefs e,d,n !
Mais pour les grands nombres, c'est dead :(

Sinon il y a un bug pour la fonciton puissance (tu as oublié un cas ou la puissance est nulle ou egale a un... Je me souviens plus lequel ! En tout cas merci de developper de tels outils !
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 mars 2004 à 00:38
ca y est j'ai résolu le problème
et merci infiniment a toi qui m'a mis 1/10
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
8 mars 2004 à 01:27
ne pas arriver a faire la division = ca bloque, donc on dirait que ca boucle a l'infini.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
8 mars 2004 à 01:25
salut. ya un bug ds ta fonction de division (ou ptet ca vient d'ailleurs...)
avec ce main la:
#include "Integer.h"

int main()
{
try
{
Integer a = Integer("30");
Integer b = Integer("19");
cout << "a = " << a << endl;
cout << "b = " << b << endl << endl;
cout << "a + b = " << a + b << endl;
cout << "a - b = " << a - b << endl;
cout << "a * b = " << a * b << endl;
cout << "a / b = " << a / b << endl;
cout << "a! = " << fact(a) << endl;
cout << "b! = " << fact(b) << endl;
cout << "19! = " << fact(Integer("19")) << endl;
cout << "a! / b! = " << endl;
cout << fact(a) / fact(b) << endl;
cout << "salut ;)" << endl;
}
catch(Error& e)
{
cout << "Erreur: " << e.GetMessage();
}
return 0;
}

ca n'arrive pa a faire la division.
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
6 janv. 2004 à 09:56
joli code :)

juste une petite chose : les classes d'exception devraient dériver de std::exception pour plus de sécurité.
BinOff Messages postés 25 Date d'inscription mardi 24 juillet 2001 Statut Membre Dernière intervention 13 décembre 2007
4 janv. 2004 à 11:30
excelent...
Rejoignez-nous