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’eninspirerpourécrireuneroutineenPythonfaisantlamêmechoseenprécisionstandardeten
précisionétenduegrâceaumoduledecimal.
Pourfinir,cedernieralgorithmeenbasebizarreapermisdetrouverceci:
124
1264
1
Énoncé6pourlesbravesparmilesbraves.
Laracinecarréeinverserapideetlaconstante
0x5f3759df.
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
Ondemandealors(énoncé)decoder 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.