CLASSE (OPTIMISÉE... :P) POUR MANIPULER LES TRÈS GRANDS ENTIERS

gordhan Messages postés 19 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 10 juin 2003 - 22 mai 2003 à 23:32
StanOfSky Messages postés 43 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 7 octobre 2006 - 4 mai 2004 à 01:17
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/10798-classe-optimisee-p-pour-manipuler-les-tres-grands-entiers

StanOfSky Messages postés 43 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 7 octobre 2006
4 mai 2004 à 01:17
c le top, moi qui voulait tester quelques algos de cryptages ;)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 nov. 2003 à 22:58
Visual Studio comme d'hab va impec.
nadfri Messages postés 9 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 19 novembre 2003
17 nov. 2003 à 22:46
Quand j'essaie de le compiler avec dev c++ 4, il me sort des erreurs de int out of range, vous le compiler avec koi vous?
gordhan Messages postés 19 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 10 juin 2003
26 mai 2003 à 23:18
(NB: le choix d'un axiome ne peut être remis en question vu qu'il s'agit justement d'un axiome !!!)
gordhan Messages postés 19 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 10 juin 2003
26 mai 2003 à 23:06
ben pour le constructeur a partir d'une chaine de caractere, c'est un choix... ca "devrait" donner, c'est ton critere... 987p654" devrait donner 987. Mais il donne 987654, faux... c'est faux pour toi... moi je dis on construit l'entier a partir des caracteres qui representent des chiffres en ignorant les autres. de toutes manieres, ca ne sert que pour l'initialisation! donc, a priori, la gestion de chaines invalides a peu d'interet (si on entre "105p151", on voulait sans doute initialiser avec 105x151, ou x est un chiffre, mais certainement pas avec 105..)
voila tout depend de ta notion du faux...
cs_nEUrOne Messages postés 41 Date d'inscription dimanche 17 novembre 2002 Statut Membre Dernière intervention 14 avril 2004
26 mai 2003 à 17:07
Excellent ... tout simplement ..
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 mai 2003 à 16:47
pour very_long_int::very_long_int(char* source)
version C++ refaite, ASM fait 5 fois + vite.
Juste que j'ai du derouler toutes boucles donc 209 lignes de code.
ciao...
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 mai 2003 à 16:29
very_long_int::very_long_int(char* source)
faudrait revoir car
vli = "987p654" devrait donner 987.
Mais il donne 987654, faux.
very_long_int::very_long_int(char* source)
{
char *c = source;
*this = 0;
while(*c >= 48 && *c <= 57) {
*this *= 10;
*this += (*c - 48);
c++;
}
}
comme cela va donner juste.
ciao...
gordhan Messages postés 19 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 10 juin 2003
25 mai 2003 à 14:35
ben je savais deja que ces appels au consctructeur etaient negligeables devant le temps de la division elle meme, mais voila, ils etaient inutiles...
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 mai 2003 à 14:10
par rdtsc, ticks nouvelle version, 4 tests.
boucles de 1000 iterations.
33385524916
32497783260
31983368860
32400000000
ticks ancienne version, moyenne sur 4
34369641228
ticks version ASM
10775374480
Comme tu vois, progression inferieure a 1% de ancienne a nouvelle.
Sera difficile aller au dela si on respecte le droit canon de la POO.
Info: fais gaffe, tu as oublie de remettre en service ta stringD dans le h.
ciao...
gordhan Messages postés 19 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 10 juin 2003
25 mai 2003 à 13:34
bonne remarque !! il y avait surtout des appels inutiles au constructeur dans la méthode division. j'ai updaté la source pour arranger ca.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 mai 2003 à 09:35
quand tu passes un param 10 comme dans division(), il est declare en classe donc appel constructeur a chaque tour, ainsi que x, y et r. Il est clair que tu n'es pas responsable, c'est le principe de la prog objet qui trouve ses limites dans la perf.
Pour ce qui est du code ASM equivalent sur le net, je ne sais pas mais j'ai refait moi meme la stringD en ASM dans une dll pour effectuer les tests. Je conserve les progs comparatifs, si veux pousser plus avant tu me contactes.
ciao...
gordhan Messages postés 19 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 10 juin 2003
25 mai 2003 à 00:19
sinon existe il quelque par sur le net un code ecrit en ASM qui gere justement les gds entiers? vu qu'en fait j'ai fait la classe la par besoin, mais si un truc meilleur existe ailleurs...
gordhan Messages postés 19 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 10 juin 2003
25 mai 2003 à 00:16
j'comprends pas la remarque la... quand on appelle une méthode amie, on alloue rien du tout non ? note aussi que quand on fait des tests, on peut parfois obtenir des temps differents que les temps usuels, ceci de maniere assez aleatoire...(on peut parfois multiplier le temps par 4 ou 5, phenomene restant cependant marginal)
ou, dans une classe, aloue - t - on plus de trucs que ds une structure?? (j'suis pas un boss de la programmation orienté objet, j'avoue..)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 mai 2003 à 21:57
Salut,
bon travail pour une classe mais toute optimisation est vaine par le fait meme que c'est une classe. Allocs et desallocs prennet les 3/4 du temps employe. J'ai fait des tests avec VLI2StringD, on divise le temps par un peu plus de 3 en mettant sous forme de struct au lieu de classe. Je pense qu'on continuera a ecrire les bibli maths en C et ASM encore un bon moment.
ciao...
gordhan Messages postés 19 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 10 juin 2003
24 mai 2003 à 00:06
de sauver la vie des gens ? jai pa pigé ! :p
cs_chmod777 Messages postés 46 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 2 décembre 2006 1
23 mai 2003 à 23:22
ça t'amuse de sauver la vie des gens, comme ça? lol
merci et bravo
gordhan Messages postés 19 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 10 juin 2003
22 mai 2003 à 23:32
ha j'ai oublié de dire, cé une classe d'entiers non signés! par contre ca gere la soustraction, mais si vous faites a - b avec a plus petit que b, ca va donne la valeur de a-b modulo 2^512 (ou autre chose si vous avez changé le #define VLINT_SIZE)
ceci permet d'avoir (a-b)+b = a, meme si a est plus petit que b
voila ;)
Rejoignez-nous