Pour les pros de l'optimisation :)

Pour les pros de l'optimisation :) - C++ - Programmation

Marsh Posté le 21-04-2003 à 16:38:38    

Voila j'avais un peu de temps à perdre alors je me suis lancé dans le codage d'un programme qui cherche tous les nombres parfaits, mais mon algo est un peu poussif je voudrait savoir si c'est possible de l'optimiser avec les instruction mmx ou sse par exemple
 
Je sais pas du tout me servir de tout ca mais je croi que ca doit etre possible de faire faire au proco plusieur calcul en même temps, je pensai notamment à faire cette comparaison "if (n%j==0)" pour +sieur valeurs de j à la fois ...
 
Si vous voyez comment optimiser cet algo vos remarques sont les bienvenues :)
 
 

Code :
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. int parfait(int n)
  5. {
  6.     int a=1;
  7.     //cout<<"nb testé: "<<n<<endl;
  8.     for (int j=2;j<sqrt(n);j++)
  9.        {
  10.        if (n%j==0)
  11.           {a+=j; a+=n/j; }
  12.        //cout<<"j:"<<j<<" n%j:"<<n%j<<" a:"<<a<<" | ";
  13.        }
  14.     //cout<<endl;
  15.     return(a==n);
  16. }
  17. int main()
  18. {
  19.     int max;
  20.     cout<<"limite de test:";
  21.     cin>>max;
  22.     cout<<endl;
  23.     for (int i=2;i<=max;i++)
  24.        if (parfait(i))
  25.           cout<<i<<" est parfait !"<<endl;
  26.     system("PAUSE" );
  27. }


---------------
P@F deathlist
Reply

Marsh Posté le 21-04-2003 à 16:38:38   

Reply

Marsh Posté le 21-04-2003 à 16:52:41    

le modulo est une opération gourmande il me semble...

Reply

Marsh Posté le 21-04-2003 à 16:58:04    

éjection du sqrt() hors du for.

Reply

Marsh Posté le 21-04-2003 à 17:17:48    

c'est une question d'algo. pre-calcul le maximum de choses, amis surtout, revois ton algo, par ce que si j est divisible par 2n il le sera pas n. cela dit, ç'est quand meme dejà assez rapide
 
'optimiser avec les instruction mmx ou sse par exemple'
 
masturbation de newbie détectée

Reply

Marsh Posté le 21-04-2003 à 17:44:43    

++Taz a écrit :


'optimiser avec les instruction mmx ou sse par exemple'
 
masturbation de newbie détectée
 


 
http://msdn.microsoft.com/library/ [...] isualC.asp
 
attends tu peux gagner jusqu'a 3% c'est enorme !!!

Reply

Marsh Posté le 21-04-2003 à 18:54:50    

n%j et n/j sont deux opérations redondantes
(de par la definition de la division euclidienne
a = q*d + r; d etant le diviseur, q le quotient soit a/d et r le reste soit a%d)
 
Ceci dit, si on applique l'algo "beta" de la division
alors on a le reste en bonus mais ce n'est pas dit
que le processeur ne soit pas plus rapide a faire
cette operation du fait d'optimisations qui ne donneront
pas le reste. (ou le modulo obtenu par une autre méthode)
 
Quelqu'un pour eclairer ma lanterne ?
 
Optimisation evidente de ce fait :
 
remplacer n%j par
modulo = n - q * j;
avec q = n/j;
 
[edit] en fait le gain n'est pas si enorme que ca puisque
tu ne fais pas l'operation de division a chaque iteration :D
 
LeGreg


Message édité par LeGreg le 21-04-2003 à 19:02:49

---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 21-04-2003 à 18:57:40    

ecoute, je vois pas pourqoi mosieur aurait besoin de vitesse à ce point... le "system("PAUSE" );" en dit long  :D

Reply

Marsh Posté le 21-04-2003 à 19:05:30    

Reply

Marsh Posté le 21-04-2003 à 19:34:44    

VignoS a écrit :

Voila j'avais un peu de temps à perdre alors je me suis lancé dans le codage d'un programme qui cherche tous les nombres parfaits


tiens, c'est marrant, c'est là-dessus que mon cousin a fait sa thèse il me semble.

Reply

Marsh Posté le 21-04-2003 à 19:47:59    

nraynaud a écrit :


tiens, c'est marrant, c'est là-dessus que mon cousin a fait sa thèse il me semble.


Ca a dû être vite torché, en 10 lignes de C.

Reply

Marsh Posté le 21-04-2003 à 19:47:59   

Reply

Marsh Posté le 21-04-2003 à 19:55:12    

verdoux a écrit :


Ca a dû être vite torché, en 10 lignes de C.


http://www.math.jussieu.fr/~rouqui [...] rints.html
Ça doit être là-dedans, je trouve pas (et je comprends rien aux titres).

Reply

Marsh Posté le 21-04-2003 à 20:05:54    


mouarf le dossier de dingue... en fait c'est trop cho à trouver un nombre parfait c decourageant :)
le system("pause" ) c'est juste pour eviter que la fenetre dos se referme toute seule quand je test le prog (j'utilise devc++), pkoi tu me fait une remarque la dessus :??:  
 
A part ca je pensait pas que les instructions type mmx ou sse apportait si peu de gain :heink: , tant de tapage pour si peu ...


---------------
P@F deathlist
Reply

Marsh Posté le 21-04-2003 à 21:23:23    

VignoS a écrit :

A part ca je pensait pas que les instructions type mmx ou sse apportait si peu de gain :heink: , tant de tapage pour si peu ...

vraiment, tu ferais mieux de te documneter un peu avant de nous répéter les solgans de la pub intel

Reply

Marsh Posté le 21-04-2003 à 21:27:06    

VignoS a écrit :

A part ca je pensait pas que les instructions type mmx ou sse apportait si peu de gain :heink: , tant de tapage pour si peu ...


Ca dépend comment elles sont utilisées... Ce sont des unités SIMD, qui peuvent exécuter un nombre d'opérations simultanées assez conséquent (8 multiplications d'octets en une passe pour le MMX par exemple).
Faut voir le taux de dépendance entre les instructions, etc... Le SSE peut faire très fort (x4 ou plus).


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 21-04-2003 à 21:29:24    

RISC powa  :o  :sol:

Reply

Marsh Posté le 21-04-2003 à 21:29:48    

VignoS a écrit :


A part ca je pensait pas que les instructions type mmx ou sse apportait si peu de gain :heink: , tant de tapage pour si peu ...


 
Bien utilise ca apporte beaucoup (tout comme 3Dnow/SSE)
mais bon comme on te l'a dit il y a sans doute
plus de gain a attendre du cote de l'algorithmique.
 
++Taz, il y a une grosse incohérence dans le lien que tu as passé
en gros il dit: tous les nombres parfaits sont de la forme 2^(n-1)(2^n - 1)
Et au dessus il dit qu'on ne sait toujours pas s'il y a des nombres parfaits impairs..  
C'est un peu enorme non??
 
LeGreg
 
 


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 21-04-2003 à 21:32:33    

> legreg : je sais, mais d'un autre coté, si personne n'en a encore trouvé, je doute que meme si notre ami faisait tourner son pentieum toute sa vie il arrive à découvrir un nombre qui n'est déjà été calculé. mais il y a peut etre moyen d'exploiter la dite formule pour calculer plus rapidement

Reply

Marsh Posté le 21-04-2003 à 21:38:14    

++Taz a écrit :

> legreg : je sais, mais d'un autre coté, si personne n'en a encore trouvé, je doute que meme si notre ami faisait tourner son pentieum toute sa vie il arrive à découvrir un nombre qui n'est déjà été calculé. mais il y a peut etre moyen d'exploiter la dite formule pour calculer plus rapidement


 
Ben il n'a pas besoin de faire tourner son PC toute sa vie pour detecter qu'il y a une contradiction logique.
 
Ou alors il se contente de dire "tous les nombres parfaits que l'on a DEJA trouve sont de la forme [..] et l'on ne sait pas s'il y en a qui ne respectent pas cette forme"..
Bref ca me donne vraiment pas envie de lire ce qu'il a ecrit d'autre sur son site.
 
LeGreg
 


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 21-04-2003 à 21:41:26    

ecoute, ce n'est pas parce que ça à l'air contradictoire, que c'est completement faux. la science avance comme ça. on a pas trouvé de nombre parfait pair, tous les nombres trouvés répondent à cette formule, jusqu'à preuve du contraire, elle fonctionne. le jour ou on la met en déroute, on sera oobliger de la revoir.
 
il s'est passer la meme chose il y a quelques mois avec la célèbre E=mc²

Reply

Marsh Posté le 21-04-2003 à 21:58:34    

++Taz a écrit :

RISC powa  :o  :sol:  


 
pentium pro pawa  :o

Reply

Marsh Posté le 21-04-2003 à 22:18:49    

++Taz a écrit :

ecoute, ce n'est pas parce que ça à l'air contradictoire, que c'est completement faux. la science avance comme ça. on a pas trouvé de nombre parfait pair, tous les nombres trouvés répondent à cette formule, jusqu'à preuve du contraire, elle fonctionne. le jour ou on la met en déroute, on sera oobliger de la revoir.
 
il s'est passer la meme chose il y a quelques mois avec la célèbre E=mc²


 
je crois que tu n'as pas compris
effectivement en science on emet des theories qui restent
valides un certain temps etc..
 
Sauf que la je ne remets pas en cause une theorie mais l'expression de celle-ci dans un domaine que je connais bien (les mathematiques) et qui sous cette forme n'est pas valide.
 
Quand je mets  
"propriete: tous les nombres parfaits sont sous cette forme"
 
je n'emets pas une theorie mais une propriete que je suis sense pouvoir demontrer, sinon j'appelle ca une conjecture.
 
Bref pour un site qui parle de math ce n'est pas du tout rigoureux.
 
Je suis d'accord que selon les disciples d'Euclide tous les nombres parfaits sont de cette forme (affirmant donc implicitement qu'il n'y avait pas de nombre parfait impair)
mais on ne peut pas mettre les deux affirmations au meme niveau.
 
C'est soit:
- il n'y a pas de nombre parfaits impairs et tous les nombres parfaits sont sous cette forme (forme d'Euclide non démontrée)
- il existe peut-etre des nombres parfaits impairs et tous les nombres parfaits PAIRS sont sous cette forme (forme démontrée).
 
Ceci dit comme on a deja explore pas mal (je dirais pas une grosse partie parce que c'est infini) de l'ensemble des entiers et qu'on n'a pas trouve de nombre parfait impair, il peut raisonnablement se restreindre aux nombres pairs (et a la formule d'Euclide) pour une recherche cantonnee a l'intervalle de validite d'un int.
 
En fait c'est meme plus fort: comme dans cet intervalle de validite il y a un tout petit nombre de nombres parfaits
il sera plus rapide algorithmiquement parlant de tester l'egalite avec ces nombres plutot que de tester la formule avec la somme des diviseurs qui risque d'etre tres longue ;).
Enfin je parle d'efficacité algorithmique qui est tres eloignee des besoins des mathematiciens.
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 21-04-2003 à 23:00:42    

Faut aller sur le lien spécifique: http://membres.lycos.fr/villeminge [...] ixNbPf.htm
 
Euler a montré que tous les nombres parfaits pairs étaient de la forme énoncée plus haut.
 
Le fait qu'il n'y a pas de nombre parfait impair est une conjecture.

Reply

Marsh Posté le 21-04-2003 à 23:10:45    

:dtc:

Reply

Marsh Posté le 21-04-2003 à 23:58:14    

Jusqu'à maintenant, on en a découvert que 39 ou 40 je sais plus, nombres premiers, avec beaucoup de chiffres :D (environ 10000 je crois), je pense donc que l'utilisation d'une bibliotheque de manipulation des grands nombres serait une bonne chose =)
 
[incrust inside] J'ai fait ca en OcamL, j'ai d'ailleurs plus galéré sur des problèmes de syntaxe de BASE ( raynaud à l'aide :D > http://forum.hardware.fr/forum2.ph [...] h=&subcat= ! )
[/incrust inside]


Message édité par Evadream -jbd- le 21-04-2003 à 23:59:11
Reply

Marsh Posté le 22-04-2003 à 00:26:52    

Evadream -jbd- a écrit :

Jusqu'à maintenant, on en a découvert que 39 ou 40 je sais plus, nombres premiers, avec beaucoup de chiffres :D (environ 10000 je crois), je pense donc que l'utilisation d'une bibliotheque de manipulation des grands nombres serait une bonne chose =)
 
[incrust inside] J'ai fait ca en OcamL, j'ai d'ailleurs plus galéré sur des problèmes de syntaxe de BASE ( raynaud à l'aide :D > http://forum.hardware.fr/forum2.ph [...] h=&subcat= ! )
[/incrust inside]


http://www.pps.jussieu.fr/Livres/o [...] tml#toc108
Kado (désolé pour le lien mais j'ai pas accès à caml.inria.fr)

Reply

Marsh Posté le 22-04-2003 à 00:40:07    

nraynaud a écrit :


http://www.pps.jussieu.fr/Livres/o [...] tml#toc108
Kado (désolé pour le lien mais j'ai pas accès à caml.inria.fr)

question en passant: t'aurais un bon algo de division pour une arithmetique exacte sur des grands entiers représenter par  un tableau de caractères?

Reply

Marsh Posté le 22-04-2003 à 00:47:55    

++Taz a écrit :

question en passant: t'aurais un bon algo de division pour une arithmetique exacte sur des grands entiers représenter par  un tableau de caractères?


Non, mais c'est un domaine _vraiment_ merdique, j'ai eu un prof qui a fait sa thèse là dessus (3ans pour une divison ...).

Reply

Marsh Posté le 22-04-2003 à 01:06:35    

nraynaud a écrit :


Non, mais c'est un domaine _vraiment_ merdique, j'ai eu un prof qui a fait sa thèse là dessus (3ans pour une divison ...).
 

par ce que c'est chouette d'avoir un bon algo pour la multiplication (genre mult indienne) mais si on travaile en base décimal et qu'on à pas un bon truc pour diviser par 2, spa gagner

Reply

Marsh Posté le 22-04-2003 à 09:54:57    

pour diviser par 2 il suffit de faire un deplacement de bit vers la droite, ca doit pas pomper gros de ressources..
apres si tu veux diviser par un autre chiffre qu'un multiple de 2 c'est une autre histoire..


---------------
P@F deathlist
Reply

Marsh Posté le 22-04-2003 à 10:28:04    

VignoS a écrit :

pour diviser par 2 il suffit de faire un deplacement de bit vers la droite, ca doit pas pomper gros de ressources..
apres si tu veux diviser par un autre chiffre qu'un multiple de 2 c'est une autre histoire..
 


ben il te suffit de décaler d'autant de bits vers la droite :
diviser par 2 => shr ax,1
diviser par 4 => shr ax,2
diviser par 8 => shr ax,3
etc..
 
même topo pour multiplier, sauf qu'on décale vers la gauche :
multiplier par 2 => shl ax,1
multiplier par 4 => shl ax,2
multiplier par 8 => shl ax,3
etc...
 
c'est diablement efficace !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-04-2003 à 14:07:15    

VignoS a écrit :

pour diviser par 2 il suffit de faire un deplacement de bit vers la droite, ca doit pas pomper gros de ressources..
apres si tu veux diviser par un autre chiffre qu'un multiple de 2 c'est une autre histoire..
 

z'en avez d'autres des comme ça? en base 10 avec représentation en string, spa gagner
 

Citation :

grands entiers représenter par  un tableau de caractères

Reply

Marsh Posté le 22-04-2003 à 14:11:37    

vi mais le monsieur il était resté bloqué en entier-entier  :wahoo:

Reply

Marsh Posté le 22-04-2003 à 15:43:33    

rappel: l'instruction div (asm) calcule la division (entiere) et le modulo en même temps.

Reply

Marsh Posté le 22-04-2003 à 15:51:52    

sans allez jusque là
 
voir div et ldiv de <stdlib.h> qui font également le boulot d'un seul coup

Reply

Marsh Posté le 23-04-2003 à 11:03:50    

Code :
  1. int parfait(int n)
  2. {
  3.   switch (n)
  4.   {
  5.   case 6 :
  6.   case 28:
  7.   case 496:
  8.   case 8128:
  9.   case 33550336:
  10.     return true;
  11.   default:
  12.     return false;
  13. }


 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 23-04-2003 à 11:06:29    

et encore, si tres int sont sur 16bits, le 33........ ne passe pas.
 
mais c'est vrai que c'est pas con.

Reply

Marsh Posté le 23-04-2003 à 11:22:24    

++Taz a écrit :

et encore, si tres int sont sur 16bits, le 33........ ne passe pas.
 
mais c'est vrai que c'est pas con.


 
c'est comme ca que je ferais si je devais l'utiliser
dans un programme qui sert a quelque chose.
 
Evidemment si l'interet est purement theorique..
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 24-04-2003 à 23:40:52    

legreg a écrit :

Code :
  1. int parfait(int n)
  2. {
  3.   switch (n)
  4.   {
  5.   case 6 :
  6.   case 28:
  7.   case 496:
  8.   case 8128:
  9.   case 33550336:
  10.     return true;
  11.   default:
  12.     return false;
  13. }


 
LeGreg


 
 [:schumacher]  
 
 :lol:  :lol:  :lol:  :lol:  :lol:  
 
Mais le pire c'est que je serais prof, j'y mets 20/20. Parce qu'un bon programmeur c'est celui qui a un minimum de pragmatisme pour résoudre un porblème au plus simple au lieu de pondre des truc alambiqués et inéficaces.


Message édité par sr16 le 24-04-2003 à 23:43:10

---------------
TOPIC PERMANENT Matrox Parhelia
Reply

Marsh Posté le 24-04-2003 à 23:43:04    

Sr16 a écrit :


 
 [:schumacher]  
 
 :lol:  :lol:  :lol:  :lol:  :lol:  
 
Mais le pire c'est que je serais prof, j'y mets 20/20. Parce qu'un bon programmeur c'est celui qui a un minimum de pragmatisme.


Et surtout ça veut dire que le gars s'est documenté et a trouvé la meilleure solution possible.

Reply

Marsh Posté le 24-04-2003 à 23:44:04    

verdoux a écrit :


Et surtout ça veut dire que le gars s'est documenté et a trouvé la meilleure solution possible.


 
 :jap:


---------------
TOPIC PERMANENT Matrox Parhelia
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed