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.