######################## PROBLÈME 3: ######################### #@# 1) on suppose $n > 0$. Renvoie $(e_0,...,e_k)$ chiffres := proc(n0, B) local l,n; n := n0; l := NULL; while (n > 0) do l := l, irem(n,B,'n'); od; [l]; end: bits := n -> chiffres(n,2); #@# 2) ne marche pas si n = 0 Pow := proc(x, n) local i,y,z, e,k; y := 1; z := x; e := bits(n); k := nops(e) - 1; for i from 0 to k do print (i,y,z); #@# pour le voir fonctionner if (e[i+1] = 1) then y := y*z; fi; z := z^2; #@# inutile si i = k od; y; end: Pow(x,10); #@# plus simple, marche aussi si n = 0 PowDG := proc(x, n0) local i,n,y,z; y := 1; z := x; n := n0; while (n > 0) do if (irem(n, 2, 'n') = 1) then y := y*z; fi; if (n = 0) then RETURN (y); fi; #@# évite une mise au carré inutile z := z^2; od; y; end: #@# 3) on lit les bits a l'envers PowGD := proc(x, n) local i,y, e,k; if (n = 0) then RETURN (1); fi; y := x; e := bits(n); k := nops(e) - 1; for i from k to 1 by -1 do y := y^2; if (e[i] = 1) then y := y*x; fi; od; y; end: