007Julien
Messages postés276Date d'inscriptionmercredi 22 septembre 2010StatutMembreDernière intervention 8 janvier 20144 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és26Date d'inscriptiondimanche 16 mars 2008StatutMembreDernière intervention23 février 20111 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és166Date d'inscriptionmercredi 24 avril 2002StatutMembreDernière intervention23 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és166Date d'inscriptionmercredi 24 avril 2002StatutMembreDernière intervention23 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és166Date d'inscriptionmercredi 24 avril 2002StatutMembreDernière intervention23 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;
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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és5Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 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és65Date d'inscriptionmercredi 19 juin 2002StatutMembreDernière intervention 9 mars 2008 8 août 2005 à 09:11
oki, seigneur, je te remercie infiniment
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 5 août 2005 à 18:04
J'ai ajouté une focntion Sqrt, mais avec un autre algo, plus rapide
clem0338
Messages postés65Date d'inscriptionmercredi 19 juin 2002StatutMembreDerniè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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és65Date d'inscriptionmercredi 19 juin 2002StatutMembreDerniè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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és6Date d'inscriptionvendredi 26 mars 2004StatutMembreDernière intervention10 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");
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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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és700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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és338Date d'inscriptionjeudi 22 août 2002StatutMembreDernière intervention14 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és25Date d'inscriptionmardi 24 juillet 2001StatutMembreDernière intervention13 décembre 2007 4 janv. 2004 à 11:30
23 janv. 2013 à 12:06
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;
}
23 févr. 2011 à 13:47
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
30 janv. 2008 à 16:18
21 juil. 2007 à 22:23
20 juil. 2007 à 21:08
sqrt5 = sqrt5.Sqrt(Integer("5")); vaut donc 2
et Integer invsqrt5 = Integer("1") / sqrt5; vaut 0
ce qui explique tes résultats
20 juil. 2007 à 15:23
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_...
31 mars 2006 à 17:33
Si je me souviens bien, c'est quand même un perte de vitesse non négligeable
30 mars 2006 à 01:05
8 août 2005 à 09:11
5 août 2005 à 18:04
5 août 2005 à 09:23
type Racine( type x )
type i = 1;
type n = 0;
while ( i < x ) {
x -= i;
i += 2;
n++;
};
return ( n );
}
@+
4 août 2005 à 17:50
4 août 2005 à 17:47
4 août 2005 à 10:50
ca vas ?
Je voulais savoir s'il y avais une evolution possible de ce code pour gerer la racine carré de l'integer.
Merci
27 avril 2004 à 18:59
Pour l'autre problème, tu peux monter un cas ou ca foire?
26 avril 2004 à 21:24
//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 !
11 mars 2004 à 00:38
et merci infiniment a toi qui m'a mis 1/10
8 mars 2004 à 01:27
8 mars 2004 à 01:25
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.
6 janv. 2004 à 09:56
juste une petite chose : les classes d'exception devraient dériver de std::exception pour plus de sécurité.
4 janv. 2004 à 11:30