séance exercices Cl..

publicité
SéancedeTDetTP
pourMPetMP*
LycéeClémenceau
Décembre2016
Préliminaires.
Onpeutchargerlalibrairie‘decimal’:fromdecimalimport*quipermetdemanipulerdesnombresen
précisionarbitraire.
Onpeutlireicilasyntaxepourl’utilisationdesprogrammesavecDecimal:
https://docs.python.org/2/library/decimal.html
On peut s’inspirer des 3 documents newton.py, dichotomie.py et secante.py sur le site
http://plouffe.fr/IUT/Clemenceau
Articletraitantdusujetici:http://www.plouffe.fr/simon/gendev/ouici:
http://rxiv.org/pdf/1408.0193v1.pdf
Énoncé1
UtilisationdelaméthodedeNewtonpourlecalculdel’inversed’unnombreréel.
Utiliser un algorithme en Python pour résoudre le problème en précision par défaut (53 bits) et en
précisionétenduegrâceàl’appeldeDecimal(x).Calculerl’inversedePià1000décimales.
BiensûrpouravoirPià1000décimales,ilsuffitdetaperenUnixlacommande:
Énoncé2
Algorithmesplusavancéspourledéveloppementdesnombresenbasesdiverses.
LedéveloppementensériedeEngel.Soitunnombreréely,onpeutécrire
Référence:https://fr.wikipedia.org/wiki/D%C3%A9veloppement_en_s%C3%A9rie_de_Engel
Pour y arriver, on peut remarquer que la plupart des algorithmes du genre fraction continuée ou
développementensériedeEngelpeuventêtredécritsdelafaçonsuivanteàl’aidede2suites.
Pourledéveloppementenfractioncontinuéebienconnuona
Fractioncontinue,ici et sontlespartiesentièresetfractionnairesd’unnombre
,
Ilsuffitdoncdeprogrammerunepetiteroutinepermettantd’yarriver.
ParexempleavecledéveloppementensériedeEngel,Briggsaeul’idéed’utiliserl’algorithmesuivant.
Ouditautrement:
,
Onremarquequelenombreexp 1 acommedéveloppementensériedeEngelquiest 1,2,3,4,5,… .
Égalementquesinh 1 1,6,20,42,72,110,156,210,272,342,420,506,… .
Calculerledéveloppementdetanh 1 aumoins10termes enPythonenutilisantlemoduledecimal.
Énoncé3
Danslemêmeesprit,ilexisteunautredéveloppementexotiquequiestledéveloppementenfraction
égyptienne.Leségyptiensavaientl’habituded’exprimerlesquantitésparuneséried’inversesd’entiers.
Plusprécisément,pourunnombreréelxdonnéona
1
1
1
1
1
… Lesx,sontcalculésavecl’équationderécurrencesuivante.
1, y Parexemple,enMaplel’algorithmedevient:
egyptien:=proc(s)
local i, j, max, aa, bb, lll, prod, S, T, kk;
S := evalf(frac(abs(s)));
max := 10^(Digits - 10);
prod := 1;
lll := [0];
while prod <= max do T := 1 + trunc(1/S); S := S - 1/T; lll := [T, op(1 .. nops(lll), lll)];
prod := prod*T end do;
aa := [seq(op(nops(lll) - kk, lll), kk = 1 .. nops(lll) - 1)];
bb := convert(aa, list);
RETURN(bb)
end proc
S’eninspirerpourécrireunprogrammeenPythonquifaitlamêmechoseettrouverledéveloppement
enfractionégyptiennedunombre0,99999999999999999999999… attentionlaréponsen’estpas
triviale .Sipossible oudisponible aveclemoduledecimalà100chiffresdeprécision.
Énoncé4
Danslamêmeveine,écrireunalgorithmeenPythonpourdévelopperunnombreenbasefactorielle.
Commeonlesait,lenombreeacommedéveloppement[1,1,1,1,1,…]danscettebase.UncertainW.
Sierpinskis’estdemandéunjoursilesautresnombresconnusavaientundéveloppementaussiélégant.
Eneffetonpeutécrire:pourunxdonée(toujoursentre0et1).
!
,
Cequinousdonne
!
… 2! 3! 4!
Oùles sontdonnésaveclaformulederécurrence.
Trouver le développement en base factorielle du nombre
3 en précision standard Python et en
précisionétenduegrâceaumoduledecimal.
Énoncé5Pourlesbraves
Engénéralisantleprocédéd’avoirunnombreécritenbasediverseonpeutimaginerparexemplede
1 ,pouryvoirapparaîtrededrôlesdemotifspourcertains
développerunnombrexenbase
x,maisseulementcertainsx.Parexemple,lenombre1/24danscettebaseest:[0, 22, 18, 22, 18, 22, 18, 22, 18, 22, …]. Voicil’équivalentdecetalgorithmeenMaple:
0!
1!
Basesbizarres :=proc(s, b, sgn, k)
local i, j, v, premier, fin, lll, liste, w, baz;
baz := evalf(b);
v := abs(frac(evalf(s)));
fin := trunc(evalf(Digits/log10(b)));
lll := [seq(i^k*(baz^i + sgn), i = 1 .. fin)];
liste := [];
for i to fin do w := trunc(v*lll[i]); v := v - w/lll[i]; liste :=
[op(liste), w] end do;
RETURN(liste)
end proc
S’en inspirer pour écrire une routine en Python faisant la même chose en précision standard et en
précisionétenduegrâceaumoduledecimal.
Pourfinir,cedernieralgorithmeenbasebizarreapermisdetrouverceci:
1
24
1
264
1
Énoncé6pourlesbravesparmilesbraves.
Laracinecarréeinverserapideetlaconstante0x5f3759df.
/
Voicil’histoired’unétrangealgorithme.Ils’agitdecalculer
,pourtantsimple.
Cetalgorithmeestapparunécessairedanslesordinateurspourleurpermettred’afficherunescèneavec
delalumièreréfléchie.LacompagnieSiliconGraphicsadéveloppécetalgorithmepourqu’ilpuisseêtre
trèsrapidesurdesmotsmémoirede32bitsdanslesannées1990.
Onpeutvoirunrésumétrèsinstructifici:
https://github.com/ajcr/ajcr.github.io/blob/master/_posts/2016‐04‐01‐fast‐inverse‐square‐root‐
python.md
Enfrançaissurwikipedia:
https://fr.wikipedia.org/wiki/Racine_carr%C3%A9e_inverse_rapide
Enanglais(meilleureexplication)
https://en.wikipedia.org/wiki/Fast_inverse_square_root
On demande alors (énoncé) de coder cet algorithme en Python et d’évaluer le temps de calcul
précisément.
Ensuite,comparercetalgorithmeavecceluiplusclassiqueducalculaveclaméthodedeNewtonpure.
Onpeutvoiricidifférentesméthodespourlecalculdelaracinecarrée:
https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Approximations_that_depend_on_
the_floating_point_representation
Aufinal,ondemandedetrouverlaméthodelaplusrapideenpointflottant(précisionnormaleenPython)
qualliesimplicitéd’implantationetrapidité.OncomprendquePythonn’estpaslelangageleplusrapide
pourcecalculmaisencomparantlesdifférentesméthodes:trouvercellequiseraitlaplusrapidesion
traduitl’algorithmeenC++avecuncodageutilisantleIEEE754.
Téléchargement