X puissance n
3 participants
Page 1 sur 1
X puissance n
Donner la méthode la plus optimisée pour calculer X^n. (x est un réel non nul et n est un entier relatif quelconque).
manianis- Nombre Réel
-
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6256
Date d'inscription : 11/10/2007
Feuille de personnage
Capacité linguistique:
(999/1000)
Re: X puissance n
manianis a écrit:Donner la méthode la plus optimisée pour calculer X^n. (x est un réel non nul et n est un entier relatif quelconque).
Habituellement, la méthode 1ère méthode qui vient à l'esprit nécessite |n| multiplication(s).
- Code:
expo := 1;
pour i de 1 à |n| répéter
expo := expo * X;
Sauf que, à mon avis, on peut diminuer le nombre d'opérations de multiplications.
Exemple 1
on peut optenir X^9 en multipliant au fur et mesure les petits exposants qu'on est entrain de construire... en effet:
Calculons X^2
Au lieu de multiplier le résultat par X pour avoir X^3, on l'élève au carré.
On obtient (X^2)^2 = X^4.
On réitère tant que l'exposant obtenu est inférieur à l'exposant demandé.
Dans notre cas, X^9 = [((X^2)^2)^2]*2
Ca rappèle l'écriture de 9 dans la base 2 qui est 9 = 2^3+1.
Donc, avec la méthode naïve, on fait exactement 8 multiplications pour avoir X^9.
Avec la deuxièmen méthode, on fait uniquement 4 multiplications.
Exemple 2Combien d'opérations de multiplications pour calculer X^256 ?
Avec la méthode naïve, il faut 255 multiplications.
Or en remarquant que 256 = 2^8, on peut écrire:
- Code:
X^256 = 2^[2^8] = 2^(2*2*....*2) = (((((((2^2)^2)^2)^2)^2)^2)^2)^2
A mon avis, la question la plus judicieuse c'est à quelle base on doit écrire l'exposant "n" pour avoir le minimum de multiplications possible
ohh: j'espère que j'ai pas commis d'erreurs dans ce que j'ai écrit...
Napoléon- Admin
-
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 7873
Date d'inscription : 19/03/2007
Feuille de personnage
Capacité linguistique:
(999/1000)
Re: X puissance n
manianis a écrit:Donner la méthode la plus optimisée pour calculer X^n. (x est un réel non nul et n est un entier relatif quelconque).
Vraiment bravo pour le topic. Ca me donne l'idée de poster d'autres topics du style:
Quelle est la meilleure méthode pour calculer ....?
Ca révise les notions de base de la complexité.
C'est mon tour, la prochaine fois je posterai un sujet du même genre que le tien
Quelle est la meilleure méthode pour calculer ....?
Ca révise les notions de base de la complexité.
C'est mon tour, la prochaine fois je posterai un sujet du même genre que le tien
Napoléon- Admin
-
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 7873
Date d'inscription : 19/03/2007
Feuille de personnage
Capacité linguistique:
(999/1000)
Re: X puissance n
Merci, j'avais travaillé avec la méthode que tu avait indiqué et je cherche une plus optimisée.
Par exemple :
x^15 = x^8.x^4.x^2.x
d'ou :
Par exemple :
x^15 = x^8.x^4.x^2.x
d'ou :
- Code:
function puissance(x : real ; a : integer):real;
var
i : integer;
pu, p : real;
neg : boolean;
begin
pu := 1.0;
p := x;
neg := (a < 0);
while (a <> 0) do
begin
if (a mod 2 <> 0) then pu := pu * p;
p := p * p;
a := a div 2;
end;
if neg then puissance := 1/pu else puissance :=pu;
end;
manianis- Nombre Réel
-
Nombre de messages : 975
Localisation : Tunisie
Réputation : 4
Points : 6256
Date d'inscription : 11/10/2007
Feuille de personnage
Capacité linguistique:
(999/1000)
Re: X puissance n
manianis a écrit:Merci, j'avais travaillé avec la méthode que tu avait indiqué et je cherche une plus optimisée.
Par exemple :
x^15 = x^8.x^4.x^2.x
d'ou :
- Code:
function puissance(x : real ; a : integer):real;
var
i : integer;
pu, p : real;
neg : boolean;
begin
pu := 1.0;
p := x;
neg := (a < 0);
while (a <> 0) do
begin
if (a mod 2 <> 0) then pu := pu * p;
p := p * p;
a := a div 2;
end;
if neg then puissance := 1/pu else puissance :=pu;
end;
C'est exactement ça. 256 = 2^8 (en binaire, 256=10000000)
Tu as pris X^15, 15=2^3+2^2+2+1 (en binaire, 15=1111)
Je me suis posé la question: est-t-il intéressant de travailler dans une autre base (3, 5...). Est-ce qu'on gagne klk chose surtout que parler de "la méthode la plus optimisée" n'est pas toujours évident...
Napoléon- Admin
-
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 7873
Date d'inscription : 19/03/2007
Feuille de personnage
Capacité linguistique:
(999/1000)
Re: X puissance n
Je me suis rappelé mnt qu'il y a des algorithmes d'Exponentiation Rapide ou quelque chose pareille... je vais revoir les références... J'ai rencontré ça lorsque j'ai travaillé sur l'algorithme de cryptographie RSA qui se base sur l'exponentiation de grands nombres contenant parfois plus que 100 chiffres...
exmple:
Calculer
1217787912111777771112233778712797979^1221777117793
c'est passionnant à voir comme solution.
exmple:
Calculer
1217787912111777771112233778712797979^1221777117793
c'est passionnant à voir comme solution.
Napoléon- Admin
-
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 7873
Date d'inscription : 19/03/2007
Feuille de personnage
Capacité linguistique:
(999/1000)
Re: X puissance n
manianis a écrit:Merci, j'avais travaillé avec la méthode que tu avait indiqué et je cherche une plus optimisée.
Par exemple :
x^15 = x^8.x^4.x^2.x
d'ou :
- Code:
function puissance(x : real ; a : integer):real;
var
i : integer;
pu, p : real;
neg : boolean;
begin
pu := 1.0;
p := x;
neg := (a < 0);
while (a <> 0) do
begin
if (a mod 2 <> 0) then pu := pu * p;
p := p * p;
a := a div 2;
end;
if neg then puissance := 1/pu else puissance :=pu;
end;
PEUT-ON CALCULER LE NOMBRE MOYEN D'OPERATIONS (multiplications) REQUISES PAR CET ALGORITHME ???
methodiX- Admin
-
Nombre de messages : 1260
Localisation : Le couloir de l'école polytechnique de Tunis
Réputation : 68
Points : 7255
Date d'inscription : 22/03/2007
Feuille de personnage
Capacité linguistique:
(1000/1000)
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum