Apprendre Maple Index du Forum Apprendre Maple
Site dédié au logiciel de calcul formel Maple
 
  Page d'accueilPage d'accueil   FAQFAQ    RechercherRechercher    Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs 
S'enregistrerS'enregistrer    ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Exponentiation rapide qui ralentit

 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
Erable



Inscrit le: 06 Fév 2010
Messages: 16

MessagePosté le: 27 Mai 2010 17:38    Sujet du message: Exponentiation rapide qui ralentit Répondre en citant

Code:
ExponentiationRapide := proc (Matrice, Puissance, Taille)
local A, Resultat, n; A := Matrice; n := Puissance; Resultat := Matrix(Taille, Taille, shape = identity);
while 0 < n do
if type(n, odd) then Resultat := evalm(`&*`(Resultat, A)); n := n-1
else A := evalm(`&*`(A, A)); n := (1/2)*n
end if
end do;
evalm(Resultat)
end proc


Le temps d'exécution est plus long que quand je fais calculer normalement la puissance d'une matrice... Maple12 utilise déjà cette technique dans ses calculs?
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 28 Mai 2010 7:38    Sujet du message: Répondre en citant

Bonjour,
J'ai modifié &* en Multiply, sinon j'avais une erreur sous MAPLE 14. Maintenant, cela fonctionne et j'ai mesuré le temps de calcul sous les 2 méthodes pour une matrice aléatoire 100x100. Pour les petites valeurs de Taille, c'est maintenant légèrement meilleur avec ExponentiationRapide quand je remplace "if type(n,odd)" par "if n mod 2 =1". Pour les grandes valeurs de Taille, je suis d'accord avec vous.
Je pense qu'en interne MAPLE utilise cet algorithme, mais comment le savoir? on ne réussit pas à lister le code des fonctions du package LinearAlgebra.

Code:

> ExponentiationRapide := proc (Matrice, Puissance, Taille)
> local A, Resultat, n;
> A := Matrice; n := Puissance; Resultat := Matrix(Taille, Taille, shape = identity);
> while 0 < n do
> if n mod 2=1 then Resultat := Multiply(Resultat, A);
> n := n-1
> else A := Multiply(A, A);
> n := (1/2)*n
> end if
> end do;
> evalm(Resultat)
> end proc:

> with(LinearAlgebra):
> A:=RandomMatrix(100,100,generator=1..9);

                         [ 100 x 100 Matrix     ]
                    A := [ Data Type: anything  ]
                         [ Storage: rectangular ]
                         [ Order: Fortran_order ]

> t:=time(): ExponentiationRapide(A,15,100): time()-t;
> t:=time(): evalm(A^15): time()-t;

                                4.047

                                4.109

> t:=time(): ExponentiationRapide(A,100,100): time()-t;
> t:=time(): evalm(A^100): time()-t;

                                10.328

                                9.422



Je pense qu'il vaudrait mieux comparer ExponentiationRapide avec l'algorithme naif ExponentiationNaive:

Code:

> ExponentiationNaive := proc (Matrice, Puissance)
> local A,k, Resultat:
> Resultat := Matrice;
> for k to Puissance-1 do
>   Resultat:=Multiply(Matrice,Resultat)
> end do:
> evalm(Resultat)
> end proc:
 
> A:=RandomMatrix(100,100,generator=1..9);

                         [ 100 x 100 Matrix     ]
                    A := [ Data Type: anything  ]
                         [ Storage: rectangular ]
                         [ Order: Fortran_order ]

> t:=time(): ExponentiationNaive(A,15,100): time()-t;
> t:=time(): ExponentiationRapide(A,15,100): time()-t;
 

                                11.485

                                3.969



A plus tard.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Erable



Inscrit le: 06 Fév 2010
Messages: 16

MessagePosté le: 28 Mai 2010 22:58    Sujet du message: Répondre en citant

Oui, Maple doit utiliser cet algorithme en interne, il est quand même assez basique... mais pratique.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


phpBB

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com


Apprendre Maple - ©  - Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.