Pizza-coke.net : Blog Linux & OpenBsd, accompagné d'une pizza

Aller au contenu | Aller au menu | Aller à la recherche

vendredi 27 mai 2011

Les nombres premiers

Depuis quelques temps, je m'amuse à améliorer un petit script Perl qui a pour fonction de trouver des nombres premiers. Il utilise la méthode brute de tester tous les nombres premiers comme diviseurs potentiels avant de déclarer si, oui ou non, un nombre peut être déclaré premier. Rien de bien original en somme. Pourtant, une particularité de mon programme me laisse à penser que je pourrais bientôt conjecturer quelque chose pour compléter le théorème fondamental de l'arithmétique. Bref, on en reparlera le moment venu.

Aujourd'hui, j'ai pensé à utiliser les six coeurs de mon processeur pour trouver plus vite ces fameux nombres qui m'obsèdent. Ce soir, j'ai trouvé tous les nombres premiers jusqu'au environ de 24 000 000. Alors que pour scanner une distance d'un million, dans ce voisinage des plus de 10 000 000, il me faut un peu plus de deux heures de calcul. J'ai pour le même temps, en répartissant un programme de recherche par coeur de mon processeur, scanné 2 500 000. Du bon boulot :-)

Non seulement ça "justifie" l'investissement en processeur, mais également c'est une excellente école sur la mise en place de calcul parallèle et l'optimisation des algorithmes. Bref, je suis heureux. Objectif : les 50 000 000 pour dimanche soir.

Pizza

dimanche 24 avril 2011

Compiler Perl sur sa Linux Debian Squeeze

J'adore le langage Perl. Pourquoi ? Parce qu'à part faire mon café, il fait à peu près tout ce que je veux, sans poser aucune difficulté, avec un temps de programmation ultra réduit (contrairement à des langages comme C ou Java). Faisons d'abord une petite vérification. Sur ma Debian, je tape en ligne de commande :

# perl -v

This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi (with 51 registered patches, see perl -V for more detail)

Copyright 1987-2009, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page.

La dernière version de Perl, qui est stable, est 5.12.3. Inutile de dire, qu'en bon geek, je me dois de mettre en place la dernière version. J'ai choisi, pour ce faire, de réaliser ça à l'ancienne, c'est-à-dire en compilant mes sources moi-meme.

Première étape : téléchargement des sources.

Je vais donc sur le site de Perl : http://www.perl.org/

Deuxième étape : création d'un répertoire de travail

Pour plus de propreté dans mon travail, je crée un répertoire de travail que j'appelle "working_progress" par la commande:

# mkdir working_progress

J'y installe mes sources encore toutes chaudes du téléchargement.

# mv /home/téléchargements/perl-5.12.3.tar.gz /home/working_progress

Troisième étape : la compilation

Pour compiler les sources, j'ai besoin d'un compilateur C (gcc par exemple) que l'on peut utiliser par le biais du programme 'make'. Je vérifie l'existence de ses deux programmes :

# make -v

GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.

Ceci est un logiciel libre ; voir le source pour les conditions de copie. Il n'y a PAS de garantie ; tant pour une utilisation COMMERCIALE que pour RÉPONDRE À UN BESOIN PARTICULIER.

Ce logiciel est construit pour x86_64-pc-linux-gnu

# gcc -v

Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v with-pkgversion='Debian 4.4.5-8' with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs enable-languages=c,c+ + ,fortran,objc,obj-c+ + prefix=/usr program-suffix=-4.4 enable-shared enable-multiarch enable-linker-build-id with-system-zlib libexecdir=/usr/lib without-included-gettext enable-threads=posix with-gxx-include-dir=/usr/include/c++/4.4 libdir=/usr/lib enable-nls enable-clocale=gnu enable-libstdcxx-debug enable-objc-gc with-arch-32=i586 with-tune=generic enable-checking=release build=x86_64-linux-gnu host=x86_64-linux-gnu target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.5 (Debian 4.4.5-8)

Ensuite, je désarchive le fichier.

# tar xvzf perl-5.12.3.tar.gz

Je me rends dans le nouveau répertoire créer :

# cd perl-5.12.3

Avant de lancer la compilation, je dois configurer Perl. Je le fais par le biais d'un programme shell appelé "configure" que j'appelle par la commande (en root) :

# sh Configure

Beginning of configuration questions for perl5.



Checking echo to see how to suppress newlines... ...using \c The star should be here-->*



First let's make sure your kit is complete. Checking... Looks good...

This installation shell script will examine your system and ask you questions to determine how the perl5 package should be installed. If you get stuck on a question, you may use a ! shell escape to start a subshell or execute a command. Many of the questions will have default answers in square brackets; typing carriage return will give you the default. '' On some of the questions which ask for file or directory names you are allowed to use the name ok)".''

Type carriage return to continue

The prompter used in this script allows you to use shell variables and backticks in your answers. You may use $1, $2, etc... to refer to the words in the default answer, as if the default line was a set of arguments given to a script shell. This means you may also use $* to repeat the whole default line, so you do not have to re-type everything to add something to the default.

Everytime there is a substitution, you will have to confirm. If there is an error (e.g. an unmatched backtick), the default answer will remain unchanged and you will be prompted again. '' If you are in a hurry, you may run 'Configure -d'. This will bypass nearly all the questions and use the computed defaults (or the previous answers if there was already a config.sh file). Type 'Configure -h' for a list of options.'' You may also start interactively and then answer '& -d' at any prompt to turn on the non-interactive behaviour for the remainder of the execution. '' Type carriage return to continue''

D'autres écrans d'installations se suivent... Au terme d'une longue série de questions, pas toujours compréhensibles, on aboutit à la fabrication du makefile, qui est la matrice meme du futur Perl. Il n'y a plus qu'à lancer "make".

# make

Attention, peut-être que certaines erreurs vont être générées. Pour moi, malgré ma version Debian "Squeeze", une première erreur a été générée comme étant un problème de librairie manquante et de chemin. J'ai corrigé en donnant la bonne adresse des répertoires. Par défaut, Perl s'installe dans /usr/local /bin. En indiquant le chemin : /usr/ systématiquement plutot que /usr/local/, cela corrige une grande partie des erreurs. Par ailleurs, il manquait quelques librairies que j'ai ajoutées. Enfin, beaucoup de chemin de librairie (lib) étaient faux et menaient à des répertoires vides... Il faut bien vérifier le tout :-)

Après cela, j'obtiens un résultat du logiciel "make" sans erreur. L'opération de correction peut prendre du temps. Personnellement, j'ai mis trois heures pour tout corriger (à chaque fois, il faut relancer "sh Configure").

Ensuite, il faut poursuivre par la commande indispensable :

# make test

Si cette opération ne génère pas d'erreur fondamentale - ou pas trop d'erreurs - il reste une dernière étape :

# make install

Une fois cette dernière opération terminée, vous pouvez vérifier que tout va bien en faisant un :

# perl - v

This is perl 5, version 12, subversion 3 (0x1f16400) built for x86_64-linux-stdio

Copyright 1987-2010, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page.

Et bien voilà, votre version de perl est à la pointe :-)

Je vais aller me préparer une pizza, parce que les nourritures intellectuelles, ça creuse...

Pizza