bonjour,
Je me permets de vous solliciter , étant débutant en Perl , mon tuteur me donne des petit travaux à faire mais la je sèche, merci de votre aide , voici l'énoncé :
On nous demande de calculer les 1000 premières décimales de sqrt(2)
en utilisant l'algorithme le plus simple et certe le plus couteux en temps de calcul
par approximation successive en recherchant les nombre à 10^x près encadrant 10^x * sqrt(2), exemple :
1 < R(2)< 2
14 < R(200) < 15
141 < R(20000) < 142
1414 < R(2000000) < 1415
etc...
On va donc rechercher successivement les nombres entiers
qui encadre 2*10^N
On travaillera non pas sur ces nombres mais sur les chaines de caracteres qui représentent ces nombres.
Le langage de script conseillé est "perl" sous Linux pour plusieurs raisons :
- Perl permet de gerer les chaines sans se soucier de leur longueur, de leur allocation mémoire ou ré-allocation mémoire.
- Linux possède un utilitaire bc qui permet d'effectuer des opération sur des nombres entier arbitrairement long.
- Perl permet de recupérer le resultat de bc dans une chaine car bc donne sont résultat à stdout !
Ce qui n'est pas possible "simplement" en C.
On écrit en francais notre algorithme :
R representera la valeur courante de la racine :
on pose R=1
"Tant que" le nombre de chiffre de R < 1001
DEBUT BOUCLE
On mémorise R dans M : M = R
On Calcule le carré de R dans R2 : R2 = R * R
On incrémente la valeur de R : R = R + 1
ON BOUCLE tant que la chaine representant R2 est inférieure à "2"
on sait maintenant que les chiffres de M sont BONS pour representer notre resultat.
on va donc chercher le chiffre suivant
on multiplie donc M par 10 et on stocke dans R pour le tour suivant
R = M + "0" (en tant que chaine : on concatène "0 à M)
Fin "Tant que"
Arrivé ici R fait 1001 chiffres et la derniere est un 0 qu'on ne doit pas prendre en compte,
Mais on est sur d'avoir une valeur "par défaut" de sqrt(2)*10^x
Implémentation :
Je vois que mon algo me demande :
- de calculer le carré d'un nombre représenté en chaine de caractères
- d'incrémenter un nombre du meme genre de 1
- de faire des comparaisons de chaine
Je vais tester si bc fonctionne bien :
echo "19999999999999999+1" | bc
20000000000000000
Cool il sait faire des additions
echo "1234567912345679*999" | bc
1233333344433333321
Cool il sait multiplier
on test dans un script perl
$R="1414213562";
$R2=`echo "$R*$R" | bc`;
print $R2;
Affiche 1999999998944727844
Cool je sais utiliser bc dans perl !
Je sais aussi que je dois faire des "chomp" sur les chaines pour les "nettoyer" avant de les envoyer à bc
Je cherche comment ecrire proprement un bloc if (...) { ... } en perl, une boucle do { ... } while (...);
Je cherche comment faire une comparaison de chaines en perl.
Je cherche comment calculer la longueur d'une chaine en perl.
Voilà ce que j'ai fais mais visiblement c'est pas bon :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #!/usr/bin/perl $R = 1; #on pose R=1 Do #"Tant que" le nombre de chiffre de R < 1001 { Do #DEBUT BOUCLE { $chomp($R); $M=$R; #On mémorise R dans M $R2=`echo "$R*$R" | bc`; #On Calcule le carré de R dans R2 $R = $R+1; #On incrémente la valeur de R } while ($R2 < 2); #ON BOUCLE tant que la chaine representant R2 est inférieure à "2" $M = $M*10; #on multiplie donc M par 10 $R = $M+0; #on stocke dans R pour le tour suivant print $R; } while ($R < 1001); #Fin "Tant que"
Partager