La voix du secrétaire (Jean)
Présents à la réunion, par ordre d'arrivée, ce qui correspond à peu près à la disposition autour de la table.
Nous avons mangé de la salade de magrets, de la salade de gésiers, des saucisses de Morteau avec purée, une andouillette, et un faux-filet. Je suis parti avant que les derniers présents commandent leur dessert. Nous avons bu de la bière Orval, un pastis et de la vodka.
La réunion a eu lieu au Maldoror.
Nous avons parlé de Perl, d'Internet en quelque sorte, d'informatique et de points divers.
Delenda est CGI.pm
Si l'on veut un vrai site web dynamique,
il vaut mieux utiliser un vrai framework
qui permet de séparer la partie graphique
de la partie programmation du site, de façon
à pouvoir faire évoluer le style d'ensemble
sans avoir besoin de changer la logique des programmes.
Mais pour une approche qui utilise une seule
page dynamique, pourquoi ne pas utiliser CGI.pm ?
Et maintenant, il faut que je parle d'un poney. Je ne comprend pas pourquoi, mais on m'a demandé d'en parler.Et il y a eu également la tentative de programmer Perl 5 sur la machine Parrot. Ce projet s'appelait Ponie, le rétroacronyme pour : Perl On a New Internal Engine.
Dans ce champ, vous tapez « J » pour « oui » ou « N » pour « non ».
############################################################################## ## Code fragment (Recommended) from Chapter 10 of "Perl Best Practices" ## ## Copyright (c) O'Reilly & Associates, 2005. All Rights Reserved. ## ## See: http://www.oreilly.com/pub/a/oreilly/ask_tim/2001/codepolicy.html ## ############################################################################## # Standard modules... use strict; use warnings; use IO::Prompt; use Carp; use English qw( -no_match_vars ); use Data::Alias; use Readonly; Readonly my @CONFIG_PATHS => qw( dev/config dev/config/alt ~/config /usr/config ); Readonly my $REMOTE_SERVER => 'foobar@foo.bar'; Readonly my $MAX_TRIES => 100; Readonly my $QUIT => qr/\A q(?:uit)? \z/ixms; sub init_from { return sleep 2; } sub connect_to { my ($server, $opt_ref) = @_; use List::Util qw( min ); sleep min(5,$opt_ref->{timeout}/1e6); return rand > 0.99 ? 'pipe' : undef; } my @fibonacci; sub fibonacci { my ($n) = @_; return 1 if $n < 2; return $fibonacci[$n] ||= fibonacci($n-1) + fibonacci($n-2); } my $prompt_str = '> '; use Smart::Comments; for my $possible_config ( @CONFIG_PATHS ) { ### Initializing... done init_from($possible_config); } my $connection; TRY: for my $try (1..$MAX_TRIES) { ### Connecting to server... done $connection = connect_to($REMOTE_SERVER, {timeout=>fibonacci($try)}); last if $connection; } croak "Can't contact server ($REMOTE_SERVER)" if not $connection; # Interactive portion of the program starts here... while (my $cmd = prompt($prompt_str, -fail_if=>$QUIT)) { remote_execute($connection, $cmd) or carp "Unknown command: $cmd"; } sub remote_execute { my ($connection, $cmd) = @_; print "remotely executing via $connection: $cmd\n"; return 1; }
$ perl -E 'say exp(-1), " ", .99**100' 0.367879441171442 0.366032341273229
f(n + 1) = a f(n) + b f(n - 1)et si l'équation
x2 = a x + badmet deux racines distinctes r et r' (éventuellement complexes), alors il existe deux coefficients lambda et mu tels que, pour tout entier n,
f(n) = lambda rn + mu r'nDans le cas de la suite de Fibonacci, r est égal au nombre d'or, (1 + sqrt(5)) / 2, soit environ 1,618, tandis que r' est égal à (1 - sqrt(5)) / 2, soit -0,618 environ. Quant à lambda et mu, ils sont donnés par le système d'équation :
lambda + mu = 1 = fibonacci(0) lambda r + mu r' = 1 = fibonacci(1)Pour calculer de tête, j'arrondis les coefficients des équations en
lambda + mu = 1 1,6 lambda - 0,6 mu = 1En substituant mu par 1 - lambda, on obtient :
2,2 lambda - 0,6 = 1soit
lambda = 1,6 / 2,2 = 8 / 11 = 0,727272...La valeur exacte, obtenue par une résolution sur papier, est :
lambda = (5 + sqrt(5)) / 10 = 0,7236...Pour n = 100, on peut négliger le terme basé sur r' et donc calculer 8 / 11 x 1,618100. Prenons une autre partie du programme de math de terminales, les logarithmes. Logarithmes décimaux en l'occurrence. On sait que log(2) vaut environ 0,3. Donc, log(16) = 1,2 et log(1,6) = 0,2. Finalement, log(1,6100) est égal à 20. Donc, fibonacci(100) microsecondes font de l'ordre de 1020 microsecondes, soit 1014 secondes ou si vous voulez 100 000 milliards de secondes. Et si vous préférez les moyens électroniques de calcul :
$ time perl -E 'say (((1 + sqrt(5)) / 2) ** 100 * (5 + sqrt(5)) / 10)' 5.73147844013819e+20 real 0m0.007s user 0m0.003s sys 0m0.003s $ time perl -MMemoize -E 'sub fib{ my($n)=@_; return $n<2 ? 1 : fib($n-1)+fib($n-2) }; memoize("fib"); say fib(100)' 5.73147844013817e+20 real 0m0.032s user 0m0.025s sys 0m0.004ssoit 573 000 milliards de secondes. Si vous vous souvenez qu'un milliard de secondes équivaut à 31 ans et 7 mois, vous vous rendez compte que ça fait un bon bout de temps, rien que pour la centième tentative, laquelle est précédée par les 99 autres ! Quant aux esprits chagrins qui s'offusquent que je me sois trompé d'un facteur 5 ou 6, je leur réplique que j'ai pris log(1,6) = 0,2 pour faciliter les calculs, alors que la véritable valeur est log(1,6) = 0,20411 et que j'aurais même dû prendre log(1,618) = 0,20898. Et comme il y a une multiplication par 100, l'absence du 0,00898 se fait sentir, même si elle est légèrement compensée par l'oubli de lambda = 0,7236. Finalement, l'utilisation de time dans ces deux lignes est un peu malhonnête : lorsque Ch10.069_Best modifié par l'ajout de Memoize calcule fib(100), il a déjà calculé (et mis en cache) fib(99) et fib(98). Donc, la version avec Memoize devrait être plus rapide que la version avec le nombre d'or.
appels(0) = 1 appels(1) = 1 appels(n + 1) = appels(n) + appels(n - 1) + 1Calculons les premiers éléments de la suite et mettons les en regard de la suite de Fibonacci.
n appels(n) fibonacci(n) 2.fibonacci(n) 0 1 1 2 1 1 1 2 2 3 2 4 3 5 3 6 4 9 5 10 5 15 8 16Il est assez clair que l'on a la relation
appels(n) = 2.fibonacci(n) - 1et ensuite, il est facile de la démontrer pour tout entier n. Donc, pour calculer fibonacci(100), il faut environ 1,14.1021 appels récursifs. Si vous comptez une nanoseconde par appel récursif, vous pouvez calculer que cela fait encore un paquet de temps !
############################################################################# ## Fragment de code (Recommandé) du chapitre 10 des ## ## « Règles de l'Art de la Programmation en Perl » ## ## Copyright © O'Reilly & Associates, 2005, 2006. Tous droits réservés ## ## Cf. http://www.oreilly.com/pub/a/oreilly/ask_tim/2001/codepolicy.html ## ############################################################################# # Modules standards use strict; use warnings; use IO::Prompt; use Carp; use English qw( -no_match_vars ); use Data::Alias; use Readonly; Readonly my @CHEMINS_CONFIG => qw( dev/config dev/config/alt ~/config /usr/config ); Readonly my $SERVEUR_DISTANT => 'foobar@foo.bar'; Readonly my $MAX_TENTATIVES => 100; Readonly my $QUIT => qr/\A q(?:uit(?:ter)?)? \z/ixms; sub init_a_partir_de { return sleep 2; } sub connecter_a { my ($server, $opt_ref) = @_; use List::Util qw( min ); sleep min(2, $opt_ref->{timeout}/1e6); return rand > 0.99 ? 'pipe' : undef; } Readonly my $PHI => (1 + sqrt(5)) / 2; Readonly my $COEF => (5 + sqrt(5)) / 10; sub fibonacci { my ($n) = @_; return int(.5 + $COEF * $PHI ** $n); } my $chaine_invite = '> '; use Smart::Comments; for my $config_possible ( @CHEMINS_CONFIG ) { ### Initialisation... fini init_a_partir_de($config_possible); } my $connexion; TENTATIVE: for my $tentative (1..$MAX_TENTATIVES) { ### Connexion au serveur... fini $connexion = connecter_a($SERVEUR_DISTANT, {timeout=>fibonacci($tentative)}); last if $connexion; } croak "Impossible de contacter le serveur ($SERVEUR_DISTANT)" if not $connexion; # la partie interactive du programme commence ici while (my $cmd = prompt($chaine_invite, -fail_if=>$QUIT)) { execution_distante($connexion, $cmd) or carp "Commande inconnue: $cmd"; } sub execution_distante { my ($connexion, $cmd) = @_; print "Exécution distante via $connexion : $cmd\n"; return 1; }Ça va nettement plus vite, n'est-ce pas ? Faut-il penser que l'auteur n'a pas testé Ch10.069_Best ? Je pense qu'en fait, il l'a testé avec $MAX_TENTATIVES initialisé à 5 ou 10, puis qu'il a passé ce nombre à 100 au moment de stocker ce script dans l'archive à télécharger. Ou bien, peut-être que le calcul récursif de la suite de Fibonacci a eu lieu sur un ordinateur quantique, in parallel, in multiple universes, in constant time.