Notice d'utilisation de la CALCULEXT

version 1.30    [Tyrtamos - Déc 2007]

La calculext est une calculatrice scientifique, présentée dans une fenêtre graphique, qui permet de calculer des expressions (algériques et autres) très diverses et si nécessaire très complexes.

Elle a en plus l'avantage d'être facilement extensible par ajout de nouvelles fonctions (mathématiques et autres) par l'utilisateur.

Elle fonctionne de la même façon sur Windows et sur Linux, et c'est le même programme pour les 2 OS.

Elle est programmée dans le langage Python, et vous avez droit à toutes les possibilités de calcul d'expressions en python (=tout ce que la fonction "eval()" peut supporter). Reportez-vous au manuel python pour plus d'info.

Cette notice traite aussi des fonctions additionnelles (et optionnelles) que je vous propose et que vous ne trouverez pas dans les manuels python.

A noter qu'à partir de la version 1.30, on peut aussi utiliser la calculext sans l'installer, parce que je vous propose une version web "en ligne". Il vous suffira d'un simple navigateur web et, bien sûr, d'une connexion Internet. Elle se trouve ici: http://calculext.jpvweb.com/ . Elle a quelques limitations qui se trouvent au début de sa propre notice. Les modules additionnels utilisés sont les mêmes que pour la présente calculatrice. Bien entendu, si vous avez besoin d'ajouter de nouvelles fonctions, vous préférerez la calculext installable qui met son code à votre disposition.

Amusez-vous bien!



Sommaire de l'aide



Sites web de référence

Pour la calculette CALCULEXT: http://linux.jpvweb.com/mesrecetteslinux/calculatrice

Pour les fonctions courantes du langage python, vous pouvez avoir des infos complémentaies ici:

Pour le developpement de fonctions supplémentaires:

Et pour utiliser la calculext en ligne (donc sans l'installer): http://calculext.jpvweb.com/



Fonctionnement de la calculext

La calculext dans sa version installable sur PC s'exécute dans une fenêtre graphique:

Une fois la calculatrice lancée, on peut taper une formule (algébrique ou non) quelconque dans la zone de saisie blanche.

L'édition dans la zone de saisie se fait avec toutes les facilités habituelles d'édition, y compris le copier-coller.

Attention: pour l'introduction et l'affichage des nombres décimaux, la virgule est toujours remplacée par un point décimal: c'est 3.14 et pas 3,14!

Un clic droit de souris sur la zone de saisie fait apparaitre un menu flottant à 2 niveaux. Si vous sélectionnez une fonction dans le menu 2ème niveau, celle-ci s'insère à l'endroit du curseur de la zone de saisie. Si la fonction a des parenthèses, le curseur se positionne entre elles.

L'exécution est lancée par le bouton "Calculer" ou par la touche de clavier "retour". (clavier normal et clavier numérique).

Quelque soit le résultat:

L'effacement des 3 zones (saisie, résultat et durée du calcul) peut être obtenu par le bouton "Effacer" ou par la touche de clavier "échappement".

La touche de clavier "flèche en bas" fait venir le dernier résultat calculé dans la zone de saisie, ce qui permet d'enchaîner les calculs avec le dernier résultat obtenu sans le retaper au clavier.

Au delà du 2ème calcul fait, la touche de clavier "flèche en haut" fait venir les formules précédentes dans la zone de saisie.

Le bouton "Aide" ou la touche de clavier [F1] fait venir la présente page d'aide dans le navigateur web par defaut.

Une fois lancé, le calcul s'exécute en tâche de fond, et peut être interrompu s'il dure trop longtemps (bouton “stopper” ou touche [F2]).

La séquence de touches Ctle-R ("R" pour Résultat) sauvegarde le dernier résultat calculé sur disque, à la fin du fichier resultat.txt. Pour que l'action soit exécutée, il faut que le focus (=le curseur) soit sur l'une des 2 lignes (saisie ou résultat).

La séquence de touches Ctle-E ("E" pour Expressions) sauvegarde la liste de toutes les expressions calculées depuis le lancement de l'exécution de la calculatrice, complétée par le dernier résultat calculé. Cette liste est ajoutée au fichier resultat.txt. Pour que l'action soit exécutée, il faut que le focus (=le curseur) soit sur l'une des 2 lignes (saisie ou résultat).

Arrêt normal de la calculette par la croix dans la case rouge en haut à droite de la fenêtre.

Pour les nombres réels (à virgule flottante), les calculs sont toujours faits en double précision, c'est à dire avec 16 ou 17 chiffres significatifs, mais l'affichage se limite à 15 chiffres significatifs pour éviter les résultats irritants comme 0.1 => 0.10000000000000001. Ce n'est pas un problème spécifique python qui utilise la bibliothèque C, mais cela correspond à la façon dont les nombres à virgule flottante sont stockés en mémoire dans l'ordinateur. Il est possible de changer ce mode d'affichage des nombres réels, ponctuellement ou en permanence: voir ci-dessous le chapitre qui traite des nombres réels.



Types de données et conversions entre les données


Booléen (type bool)

Un booléen est une donnée qui ne peut prendre que 2 valeurs: True (=vrai) et False (=faux).

NB: ne pas oublier que la 1ère lettre est en majuscule

Dans la calculette, si vous calculez "1==2", le résultat est "False". Si vous calculez "2<3", le résultat est "True"

Certaines fonctions additionnelles renvoient un résultat booléen comme bissextile(2008) => True qui dit que l'année 2008 est bissextile.

Cela permet de faire des calculs logiques aussi complexe que vous voulez avec des opérateurs comme "and" (=et), "or" (=ou) et "not" (=non).


Nombre entier (type int)

Un entier est un nombre sans virgule ni exposant. Exemples: 12   785   5   99

Un entier est en général compris entre -231 et 231-1 (cela dépend de la machine dont vous disposez)

Vous pouvez calculer cela avec la calculette: cela donne de (-2**31)=-2147483648 à (2**31-1)=2147483647

La valeur correcte pour votre machine se trouve dans la variable "sys.maxint" . Vous pouvez en afficher la valeur avec la calculette:

sys.maxint   =>   2147483647  

Heureusement, si un calcul devait dépasser cette valeur maxi, python la convertirait automatiquement en entier long!


Nombre entier long (type long)

Pour python, un entier long est un entier dont le nombre de chiffres n'est limité que par la mémoire...

Pour entrer un nombre entier long dans une expression: il suffit d'ajouter un "L":

123456789L  

C'est en général inutile, car Python convertit automatiquement un entier en entier long si c'est nécessaire.

Cela permet de faire des calculs assez rares avec votre calculette, comme, par exemple 2 à la puissance 1000 :

2**1000  

qui renvoie (sur une seule ligne!):

107150860718626732094842504906000181056140481170553360744375038837035105  

112493612249319837881569585812759467291755314682518714528569231404359845

775746985748039345677748242309854210746050623711418779541821530464749835

819412673987675591655439460770629145711964776865421676604298316526243868

37205668069376L

Vous récupérez le résultat par copier-coller ou avec la  séquence de touche Ctle-R.

Vous noterez que le résultat est affiché avec le "L" à la fin, ce qui permet à ce nombre d'être réutilisé dans d'autres calculs sans perdre sa définition.


Conversion d'un entier sur plusieurs bases: 2, 8, 10, 16 et ascii

Un même nombre peut être exprimé selon plusieurs bases de numération. Par exemple le nombre 123:

La calculette donne toutes les possibilités de conversion dans les 2 sens:

oct(123) donne 0173

0173 donne 123           (NB: un entier avec un zéro devant est toujours pris pour un nombre octal)

 

hex(123) donne 0x7B

0x7B donne 123          (NB: un entier avec "0x" devant est toujours pris pour un nombre hexadécimal)

 

Pour les conversions en binaire (module additionnel "bibgene"):

dec2bin(123) donne "1111011"

Variante:

dec2bin(123,16) donne "0000000001111011"      avec la 2ème paramètre facultatif =16, ajoute des "0" à gauche pour atteindre 16 caractères  

 

dec2bins(-91,12) donne "111110100101"   conversion en binaire signé (complément à 2) pour un mot de 12 bits (8 par défaut).

 

bin2dec("1111011") donne 123.          (module additionnel "bibgene").

 

bin2decs("111110100101",12) donne -91     binaire signé (complément à 2) pour un mot de 12 bits (8 par défaut).  

 

Pour saisir un nombre binaire, n'oubliez pas les guillemets ou les apostrophes: c'est une chaîne de caractère.

Et, bien sûr, il n'y a pas de réelle limite de précision, tant qu'on reste avec les nombres entiers:

dec2bin(78965412356894213)   donne "100011000100010101001111111001001000100110010111000000101"  

Conversion avec les caractères (très pratique pour les informaticiens!)

ord("A") donne 65, valeur ascii du caractère "A"

hex(ord("A")) donne la même chose, mais en hexa: '0x41'

chr(65) ou chr(0x41) donne le caractère dont le nombre ascii est 65 (ou 0x41 en hexa).


Nombre réel ou à virgule flottante (type float)

Un nombre réel (ou à virgule flottante), est un nombre qui a une virgule et/ou un exposant. Ex: 1.2  0.365   1.87e15   8.9E-5

Attention: dans la calculette, la virgule sera toujours introduite et affichée par un "point décimal" (comme les anglo-saxons)

Le réel de python correspond au "double précision" du langage C, avec environ 17 chiffres significatifs et une étendue de 10-308 à 10+308

L'utilisateur peut changer le mode d'affichage des nombres réels, grâce à la fonction "precision(n)", selon la valeur de n entre -15 et +15:

Cet affichage fonctionne aussi:

On peut obtenir le même effet ponctuellement, c'est à dire sans changer le mode courant d'affichage, avec la fonction arrond(x,n). Par exemple, arrond(0.1,4) => "0.1000" ne change pas "nbchiffres" qui peut rester à -15.


Nombre complexe (type complex)

Un nombre complexe est un nombre composé d'une partie réelle et d'une partie imaginaire. Ex: (2, 9j) => partie réelle=2, partie imaginaire=9. Le "j"  est un symbole qui représente racine de -1. Ici, comme souvent en informatique, c'est "j" qui est utilisé (pratique anglo-saxonne), et non "i".

Les 2 parties numériques sont des nombres à virgules flottantes: (2,9j) est codé et utilisé comme  (2.0,9.0j).

Exemple de calcul sur les nombres complexes:

complex(1,2)+complex(2,3) => (3+5j)  

complex(-2,5)*complex(1,-3) => (13+11j)

complex(3,1)/complex(-2,-5) => (-0.379310344827586+0.448275862068966j)   (en fait, avec le calcul à la main, on trouve (-11/29 + 13/29j))  

Une expression saisie comme (1,2j) n'est pas tout de suite considérée comme un nombre complexe, mais comme une sorte de liste (appelée "tuple" en Pyhon). Pour que ce soit un nombre complexe, il faut le dire à la calculette par complex(1,2). Mais si on affecte le résultat à une variable, celle-ci est utilisée après comme un nombre complexe sans qu'on ait à le rappeler::

sto("x",complex(1,2)) => (1,2j)  

sto("y",complex(2,3)) => (2+3j)

x+y => (3+5j)

Le calcul sur les nombres complexes avec les fonctions trigonométriques (et autres) nécessite l'importation du module "cmath". Il est ici importé avec "import cmath", ce qui oblige les fonctions à être préfixées avec "cmath.". C'est pour ne pas confondre avec les fonctions du module "math" qui portent le même nom. Exemple:

cmath.sin(complex(3,1)) => (0.217759551622152-1.16344036370325j)  (notez le pré-fixage de la fonction sinus avec "cmath.")  

Liste non commentée des fonctions du module "cmath" dédiées aux nombres complexes:

A noter que toutes les fonctions dédiées aux complexes ne renvoient que des complexes. Dans ce cas, un nombre réel est simplement un nombre complexe dont la parte imaginaire est nulle (ex: "(2,0j)").


Conversion entre les principaux types de données numériques

Conversion automatique:

Lorsque l'interpréteur python doit appliquer un opérateur de calcul entre deux nombres et que ces 2 nombres n'ont pas le même type, il convertit automatiquement l'un des types dans l'autre.

Les choix automatiques sont les suivants int -> long -> float -> complex et vont toujours dans ce sens.

Conversion à la demande:

On peut appliquer une conversion de type (= transtypage) de la façon suivante:

long(n) transforme n en type long

int(n) transforme n en type entier (int)

float(n) transforme n en type réel (float)

bool(n) vaut "False" si n=0, et "True dans n'importe quel autre cas.

complex(n) transforme n en type complexe (complex). Ex: complex(5) -> (5,0j).

complex(nr,ni) transforme le couple "nr" et "ni" en type complexe (complex). Ex: complex(5,6) -> (5,6j)

 


Nombre décimal (type Decimal)

Le type Decimal est un type particulier qui emprunte certaines caractéristiques aux entiers long et aux réels: il a une virgule et peut comporter un nombre quelqconque de chiffres significatifs définis à l'avance..

Il est apporté par le module "decimal"

Il permet des calculs décimaux (avec une virgule comme un réel) mais avec une précision supérieure aux réels en nombre de chiffre, et sans avoir les effets bizarres sur les derniers chiffres comme avec lesnombres à virgule flottante.

Ce type est à utiliser pour des applications comme la comptabilité.

Exemple extrème d'utilisation pour laquelle les nombres type float ne pourrait convenir:

precisiondecimal(28)    => permet de fixer la précision de calcul (28 chiffres, c'est la précision par defaut) 

Decimal("3.333333333333333333333333333")+Decimal("0.000000000000000000000000001")  =>  Decimal("3.333333333333333333333333334")  

Actuellement, les changements de precision ne peuvent se faire que dans une liste de calculs enchaînés comme:

[precisiondecimal(5),Decimal("10")/3]  =>  [5,Decimal("3.3333")]  


chaîne de caractères (type str)

Les chaînes de caractères sont des morceaux de texte comme par exemple: "n'importe quoi pourvu que ça mousse".

Les chaînes sont entourées par des guillemets (comme dans "toto") ou des apostrophes (comme dans 'toto'). L'intérêt d'avoir 2 signes possibles est qu'on peut utiliser l'un, pour des textes qui contiennent l'autre.

Bien entendu, les chaînes ne peuvent pas être utilisées directement dans les calculs numériques, mais certaines fonctions les utiliseront en entrée ou en sortie: Par exemple:

bin2dec("100101001110") => 2382  (fonction du module additionnel "bibgene")

cejour() => '31/10/2007' (fonction du module additionnel "temps")


Listes (type list)

Une liste est un assemblage de plusieurs valeurs, séparées pardes virgules et entourés par des crochets. Par exemple, [2, 3.7, 0.7, 99].

Python est très doué pour manipuler les listes.

Qu'est-ce que ça vient faire dans une calculatrice? La liste est utilisée quand une fonction doit renvoyer plusieurs valeurs. Par exemple, "facteurs(n)" du module additionnel "arithmétique" renvoie la décomposition de n en facteurs premiers sous forme d'une liste de nombres:

facteurs(56987124) => [2, 2, 3, 47, 79, 1279]  

Et pour permettre l'enchaînement des calculs (utilisation directe du résultat précédent comme donnée pour le calcul suivant), certaines fonctions acceptent une liste comme paramètre (ne pas oublier les crochets):

deg2dms(45.0) => [45, 0, 0.0]  conversion d'un angle en degrés décimaux  => [degré,minutes,secondes]

dms2deg([45, 0, 0.0]) => 45.0  convertion d'un angle en [degré,minutes,secondes]  =>  degrés décimaux  

ce qui permet:

dms2deg(deg2dms(45.0))  =>  45.0

Vous pouvez manipuler les listes:

sto("x",facteurs(56987124))  =>  [2, 2, 3, 47, 79, 1279]  

x[0]  =>  2

x[2]  =>  3

x[-2]  => 79]  avec un indice négatif, on renvoie les valeurs à partir de la fin  

x[1:4]  =>  [2,3,47]  renvoie la liste des valeurs de 1 à 4 (4 exclu)

len(x)  =>  6  nombre de valeurs de la liste

x.append(55)  =>  [2, 2, 3, 47, 79, 1279, 55]  ajoute 55 à la liste x

etc... Voir le manuel python

On peut avoir des listes de n'importe quoi, y compris des listes de chaînes ou même des listes de listes.



Fonctions de base de la calculette


Fonctions pour avoir de l'aide

Pour avoir l'aide générale (la présente page):

Pour avoir l'aide sur une fonction en particulier, calculez "aide(nomdelafonction)".

Par exemple:

aide(sin) => "sin(x) Return the sine of x (measured in radians)."  

NB: l'aide pour les fonctions intégrées "python" est en anglais

aide(bissextile) => "bissextile(a): dit si l'année donnée est bissextile ou non (True=oui, False=non)"  

NB: c'est une fonction du module additionnel "temps" et l'aide est en français

Et, bien sûr (je ne pouvais pas rater ça  ;-) ):

aide(aide) => "aide(fn): affiche l'aide sur une fonction donnée fn"  


Création dynamique de variables et affectation de valeurs

Une formule comme x=2*sin(0.5)/pi ne marchera pas avec votre calculette, parce que l'affectation du résultat d'une expression à une variable n'est pas elle-même une expression valide pour python. Seule la partie droite après le signe "="  est une expression valide.

Alors, j'ai fabriqué une fonction qui fait la même chose: sto("x",2*sin(0.5)/pi).  

sto("x", E) affecte la valeur de l'expression E à la variable x. Si x n'existe pas, une nouvelle variable portant ce nom est créée. Si x existe, elle porte désormais la nouvelle valeur de E et la précédente est perdue.

Dans cette formule, E peut être une expression quelconque donnant un résultat d'un type quelconque.

Exemple:

sto("toto",5/cos(0.3654))  =>   5.35342849518736  

Comme la fonction "sto" renvoie la valeur de l'expression, vous pouvez l'utiliser à l'intérieur d'une autre expression:

2/cos(0.78)*sto("toto",2**3)+5  =>  27.5062530736666  

Après cette expression, vous pouvez utiliser directement la variable toto dans un autre calcul. Sa valeur 2**3 => 8 sera utilisée:

2*toto  =>  16  

Contrairement à d'autres langages plus "typés", la même variable peut porter des valeurs de différents types au gré de ses affectations successives:

sto("toto", "bonjour tout le monde")  =>   'bonjour tout le monde'  

sto("toto", True)  =>  True

sto("toto", [4, 55, 99, 6])  =>  [4, 55, 99, 6]

sto("toto", 45893271002598563254L)  =>  45893271002598563254L  

etc...

Si par prudence vous voulez vérifier que la variable "toto" n'est pas déjà utilisée par le système, vous demandez son exécution dans la calculatrice. si elle n'existait pas, son résultat est "error". Sinon, c'est sa valeur qui est affichée.



Fonctions intégrées de calcul d'expression

 


Constantes mathématiques prédéfinies

pi = 3.14159265359

e = 2.71828182846


Opérateurs et fonctions mathématiques de base

Il y a les priorités habituelles entre tous ces opérateurs. En cas de doute, utilisez les parenthèses.

+ => addition

- => soustraction

* => multiplication

/ = division. Attention: contrairement aux habitudes python, les divisions entre 2 entiers sont décimales et non entières! Par exemple: 10/3 donnera "3.3333333333333333" .

// = division avec troncature (ex: 10.0//3 => 3.0 au lieu de 3.33333333333)

** = élévation à un puissance (ex: 2**3 => 8)

pow(x,y) => idem à x**y

% = reste de la division entière (ex: 11%2 => 1) = fonction "modulo"

( et ) = parenthèses

sqrt(x) => racine carrée de x (ex: sqrt(2) => 1.41421356237)

exp(x) => e élevé à la puissance x (ex: exp(2) => 7.38905609893)

floor(x) => arrondi à l'entier inférieur: floor(3.9) donne 3.0, et floor(-3.9) donne -4.0.

log(x) => logarithme népérien de x (ex: log(e) => 1.0)

log10(x) => logarithme base 10 de x (ex: log10(10) => 1.0)

abs() => donne la valeur absolue (ex: abs(-5) => 5 et abs(-5.1) => 5.1

fabs() => idem, mais renvoie toujours un nombre réel (ex: fabs(-5) => 5.0)


Opérateurs logiques

>, >=, <, <=,  ==, != comparent 2 nombres et renvoient True (=vrai) ou False (=faux)selon le résultat

and fait un "et" booléen entre 2 états True et False (ex: True and True => True)

or fait un "ou" booléen entre 2 états True et False (ex: True or False => True)

not fait un "non" booléen (ex: not True => False)


Opérateurs binaires

& permet un "et" bit à bit (ex: 2&6 => 2)

| pemet un "ou" bit à bit (ex: 2|6 => 6)

^ permet un "ou" exclusif (ex: 2^6 => 4)

~ fait un "non" bit à bit

<< et >> = décalage de bits à gauche et à droite (ex: 2<<1 => 4)


Priorité décroissante des opérateurs

(la même liste se trouve dans le menu flottant)

"", ''

chaîne (ex: "toto")

[]

liste (ex: [4,6,8,9])

()

parenthèses

Fn()

appel de fonction

X[i1:i2]

découpage de chaînes ou de listes

X[i]

indexation de chaînes ou de listes

**

puissance (ex: 2**3 => 8)

~

"non" binaire

+, -

opérateurs. unaires (ex: -2, +5)

*, /, //, %

mult., div., div entière, modulo

+, -

addition, soustraction

<<, >>

décalage (opérateur sur les bits)

&

"et" (opérateur sur les bits)

^

"ou" exclusif (opérateur sur les bits)

|

"ou" (opérateur sur les bits)

<, <=, >, >=

comparaison

==, !=

comparaison

is, not is

test d'identité

in, not in

test d'appartenance

not

"non" (opérateur logique)

and

"et" (opérateur logique)

or

"ou" (opérateur logique)

lambda

fonction lambda (construction de fonction)

 


Fonctions trigonométriques

Toutes les fonctions trigonomériques utilisent les angles en radians

degrees(x) transforme des radians en degrés décimaux. Par exemple: degrees(pi/2) => 90.0

radians(x) transforme des degrés décimaux en radians. Par exemple radians(90.0) => 1.5707963267948966 soit pi/2. Si vous avez un angle en "20°, 35mn 12sec", vous faites la conversion dans la fonction: radians(20+35/60+12/3600)

 

sin(x) => sinus de x

cos(x) => cosinus de x

tan(x) => tangente de x

 

acos(x) => arc cos x

asin(x) => arc sin x

atan(x) => arc tangente de x

 

sinh(x) => sinus hyperbolique de x

cosh(x) => cosinus hyperbolique de x

tanh(x) => tangente hyperbolique de x.

 

hypot( x, y) => valeur de l'hypothénuse d'un triangle rectangle de côté x et y (=sqrt(x*x + y*y))

 


Fonctions diverses

 

lambda  si vous avez une expression complexe à calculer plusieurs fois avec des valeurs différentes, ça peut être assez pénible de changer les valeurs directement dans le texte de l'expression. Par exemple, la fonction:

sin(0.25698)*1/sqrt(2*pi)*log(1.25698)**(1.6987) => 0.00827261825741359  

Vous voulez calculer cette fonction avec d'autres valeurs que 0.25698 (qui intervient à 2 endroits) et 1.6987. Vous faites:

sto("mafonction",lambda x,y: sin(x)*1/sqrt(2*pi)*log(1.25698)**(y))  

Désormais, vous pouvez calculer:

mafonction(0.25698,1.6987) => 0.00827261825741359  

mafonction(0.65423,1.7298) => 0.0189192228012913

mafonction(1.9875,1.0749) => 0.0747066661174212

mafonction(2.86278,0.0749) => 0.0983086841243615

etc...

Dans le contexte de la calculette, vous pouvez utiliser un ou plusieurs paramètres avec “lambda”, voire même une liste de paramètres. Mais vous n'avez droit qu'à une seule expression après le ”:” (et pas d'instruction python comme print, x=, for, while etc...).

 

map(f,L): permet de calculer une fonction f avec chaque valeur d'une liste L de paramètres, et de restituer la liste des résultats

Exemple avec la fonction sinus, qui va donc calculer sin(0.1), puis sin(0.2), etc…:

map(sin,[0.1, 0.2, 0.3, 0.4, 0.5]) => [0.0998334166468282,0.198669330795061,0.29552020666134,0.389418342308651,0.479425538604203]  

On peut faire des choses étonnantes avec map(). Exemple , vous obtenez ici les dates de Pâques des 5 prochaînes années (fonction jeuxdessais: module bibgene et fonction paques: module temps):

map(paques,jeuxdessais(5,2008,2012)) => ['23/03/2008', '12/04/2009', '04/04/2010', '24/04/2011', '08/04/2012']  

 

filter(f,L): permet de ne retenir d'une liste L que les valeurs qui rendent la fonction f vraie.

Par exemple, on fabrique la fonction lambda qui donne vrai quand son paramètre y est >=100:

sto("f",lambda y: y>=100)  

Et on cherche la liste des nombres premiers compris entre 100 et 200:

filter(f,premiers(200))  =>  [101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199]  

On peut aussi chercher, par exemple, des variables aléatoires distribuées au hasard selon la loi normale réduite (module probabilite), mais en ne retenant que les valeurs positives. Dans cet exemple, nous avons enchaîné les expressions dans une liste:

[sto("f",lambda y: y>=0),filter(f,hgaussred(10))] -> [0.70683994795139,0.139106211249837,0.517782930504369,0.222072398717544,0.578393938896522]  

 

Compréhension de liste

C'est une appellation étrange, parce que ce n'est pas forcément facile à "comprendre". Il s'agit d'une boucle conditionnelle dans une liste qui est considéré par Python comme une expression, et donc qui est calculable par la calculext. Par exemple:

[3*x for x in range(0,10) if x%2==0]  =>  [0,6,12,18,24]  

Dans cette expression:

La condition avec "if" est optionnelle. Par exemple: les 5 prochaines dates de Pâques:

[paques(x) for x in range(2008,2013)]  =>  ["23/03/2008","12/04/2009","04/04/2010","24/04/2011","08/04/2012"]  

On peut, bien sûr, combiner toutes ces fonctions: sto, lambda, map, filter, compréhension de liste, etc... pour obtenir ce qu'on veut.



Fonctions des modules additionnels

Cette partie de l'aide est destinée à être mise à jour au fur et à mesure de l'évolution des modules utilisateurs

 


Module "bibgene"

Bibliothèque générale / fonctions diverses

 

dec2bin(x) convertit un entier en nombre binaire (=chaîne de caractère).

dec2bin(63)  =>  "111111"  

 

dec2bin(x, L)convertit un entier en nombre binaire (=chaîne de caractère) en ajoutant des zéros à gauche pour atteindre la longueur L.

dec2bin(63,8)  =>  "00111111"  

 

dec2bins(x, L=8) convertit un nombre entier signé en nombre binaire signé par la méthode du complément à 2.

dec2bins(-63)  =>  "11000001"

dec(-63,16) => "1111111111000001"  

 

bin2dec(x) convertit un nombre binaire en entier décimal (ne pas oublier les guillemets autour du nombre binaire: c'est une chaîne!)

bin2dec("00111111")  =>  63  

 

bin2decs(x,L=8) convertit un nombre binaire signé en entier décimal signé (ne pas oublier les guillemets!) par la méthode du complément à 2.

bin2decs("11000001")  =>  -63

bin2decs("1111111111000001",16)  =>  -63  

 

deg2dms(DD) convertit des degrés décimaux en une liste [degrés, minutes, secondes].

deg2dms(50.75) => [50,45,0]  

 

dms2deg(L) convertit une liste [degrés, minutes, secondes] en degrés décimaux.

dms2deg([50,45,0]) => 50.75  

 

jeuxdessais(n,L1,L2): construit une liste de n jeux de paramètres commençant à L1 et se terminant à L2.

jeuxdessais(10,0,9) => [0,1,2,3,4,5,6,7,8,9]  

jeuxdessais(3,[1,2,3],[3,4,5]) => [[1,2,3],[2,3,4],[3,4,5]]  

Avec lambda et map(), on peut obtenir une liste de valeurs d'une fonction testée avec n valeurs de plusieurs paramètres passés à la fonction.

Créer une fonction avec lambda. On prend l'exemple ici d'une fonction simple avec 3 paramètres passés dans une liste L. Cette fonction se contente de renvoyer la somme des 3 paramètres:

sto("X",lambda L: L[0]+L[1]+L[2])  

Et on va utiliser la fonction python “map()” pour appliquer ces jeux de paramètres à la fonction X:

map(X, jeuxdessais(5,[1,2,3],[3,4,5])) => [6,7.5,9,10.5,12]  

 

volcuve(h,d,vt): calcule le volume de liquide restant dans une cuve cylindrique horizontale de diamètre d et de volume total vt, à partir de la hauteur h du liquide.

Par exemple, j'ai une cuve de diamètre 1.20 m qui contient 3500 litres de mazout, et il m'en reste une hauteur de 40cm: combien j'en ai en litres?

volcuve(40,120,3500)  =>   1021.26992026825  

Remarques:

 

mdp2hex(ch): Convertit en séquence hexadécimale les mots de passe donnés en texte clair. Utilisation: les mots de passe utilisés en wifi. Exemple:

mdp2hex("MotDePasseSecret789")  =>   "4d6f7444655061737365536563726574373839"  

 

hex2mdp(ch): Convertit en texte clair les mots de passe donnés en séquence hexadécimale. Exemple:

hex2mdp("4d6f7444655061737365536563726574373839")  =>  "MotDePasseSecret789"  


Module "arithmetique"

 

fact(n) = factorielle n = 2*3*4*5*...*n  (n doit être une entier >=0). Permet le calcul avec des valeurs très grandes. Exemple:

fact(50)  =>  30414093201713378043612608166064768844377641568960512000000000000L  

En quelques secondes, on peut aussi calculer fact(5000) qui comporte tout de même 16325 chiffres!

 

pgcd(a,b) = PGCD de a et b => Plus Grand Commun Diviseur des 2 nombres entiers (>0) a et b.

pgcd(1071,1029)  =>  21  

 

ppcm(a,b) = PPCM de a et b => Plus Petit Commun Multiple des 2 nombres entiers (>0) a et b.

ppcm(60,168)  =>  840  

 

facteurs(n) = décomposition en facteurs premiers => renvoie la liste des facteurs premiers trouvés.

facteurs(789456123)  =>  [3,3,6343,13829]  

 

estpremier(n) = teste si le nombre entier "n" est premier ou non => renvoie True s'il l'est et False sinon.

estpremier(999983)  =>  True (calcul fait en moins d'une milliseconde)

 

premiers(n) = calcule tous les nombres premiers inférieurs ou égaux à n => renvoie la liste.

premiers(100)  =>  [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]  


Module "combinatoire"

 

permut(n) = nombre de permutations possibles de n objets. Le calcul est le même que factorielle de n: Ainsi, il y a 6 possibilités de ranger les 3 objets A, B et C: ABC, BCA, CAB, ACB, CBA, BAC.

permut(3) => 6  

 

arrang(n,p) = arrangement de n objets pris p à p, en tenant compte de l'ordre, c'est à dire que "AB" et "BA "sont deux cas différents .

arrang(10,2)  =>  90  

 

combin(n,p) = combinaison de n objets pris p à p sans tenir compte de l'ordre, c'est à dire que "AB" est le même cas que "BA"

combin(10,2)  =>  45  

A noter que nous avons, bien entendu:

arrang(10,2)/permut(2)  =  combin(10,2)  =  45  

 


Module "probabilite"

 

binom(k,n,p) = loi binomiale => probabilité d'avoir k réussite(s) dans n évènements indépendants, chaque évènement ayant une probabilité p de réussite..

binom(2,10,0.2)  =>  0.301989888  

 

binomcum(k,n,p) = loi binomiale cumulée =>  probabilité d'avoir 0, 1, ..k  réussite(s) dans n évènements indépendants, chaque évènement ayant une probabilité p de réussite.

binomcum(2,10,0.2)  =>   0.6777995264  

Ce qui correspond à: binom(0,10,0.2)+binom(1,10,0.2)+binom(2,10,0.2)

 

hypgeo(k,n,g,t) = loi hypergéométrique => probabilité d'avoir k réussite(s) dans n évènements indépendants, sachant qu'il y a g réussites dans la population de taille t.

Par exemple, nous avons 30 billes rouges dans un lot de 100 billes, et nous en prélevons 10 au hasard, (c'est à dire que chaque bille a une chance égale d'être prélevée). La probabilité qu'il y ait 2 boules rouges dans cet échantillon de 10 billes est:

hypgeo(2,10,30,100)  =>   0.237231613942767  

Remarque: quand la taille de l'échantillon (n) est <10% de la taille de la population (t), on commet peu d'erreur en utilisant la loi binomiale.

 

hypgeocum(k,n,g,t) = loi hypergéométrique cumulée => probabilité d'avoir 0,1,..,k  réussite(s) dans n évènements indépendants, sachant qu'il y a g réussites dans la population de taille t.

Même exemple que précédemment, à part que nous voulons connaître la probabilité d'obtenir 0 ou 1 ou 2 billes rouges dans l'échantillon de 10 billes:

hypgeocum(2,10,30,100)  =>   0.372856594358271  

Cela correspond, bien entendu, à: hypgeocum(0,10,30,100)+hypgeocum(1,10,30,100)+hypgeocum(2,10,30,100)

Remarque: quand la taille de l'échantillon (n) est <10% de la taille de la population (t), on commet peu d'erreur en utilisant la loi binomiale.

 

pgaussred(x) = probabilité qu'une variable aléatoire distribuée selon une loi normale réduite soit inférieure à x

pgaussred(2)  =>   0.977249865802216  

Remarque: le calcul est obtenu par "intégration numérique", en calculant l'intégrale par ajout de nombreux petits rectangles (2000 par écart type). Le calcul reste très rapide puisque pgaussred(3) qui demande le calcul de 6000 rectangles (avec une exponentielle à chaque rectangle) ne demande que 1/100 seconde. Vous pouvez compter sur une précision d'au moins 5 ou 6 chiffres après la virgule. A partir de 8 écarts types, la fonction renvoie "1", ce qui est normal parce que la différence par rapport à 1 devient inférieure au 16ème chiffre après la virgule et dépasse donc les capacités de calcul de la bibliothèque du C en double précision.

 

pgauss(x,m,s) = probabilité qu'une variable aléatoire distribuée selon une loi normale (m=moyenne, s=écart-type) soit inférieure à x.

pgauss(8,2,3)  =>   0.977249865802216  

On trouve bien entendu la même valeur que précédemment, puisque x=8 correspond ici à la moyenne (m=2) plus 2 écarts types (2*s = 6)

 

xgaussred(p) = renvoie la variable x distribuée selon la loi normale réduite, et correspondant à la probabilité p  que la variable soit <= x (ce sont les "fractiles" des tables papier)

xgaussred(0.977249865802216)  =>   2  (arrondi à 12 chiffres après la virgule)  

 

xgauss(p,m,s) = renvoie la variable x distribuée selon une loi normale (m=moyenne, s=écart-type), et correspondant à la probabilité p que la variable soit <=x

xgauss(0.977249865802216,2,3)  =>   8  (arrondi à 12 chiffres après la virgule)  

 

hgaussred(n=1) = renvoie une valeur au hasard de la variable x distribuée selon la loi normale réduite. Si n (optionnel) est >1, renvoie une liste de n valeurs.

hgaussred()  =>   0.567294449931055

hgaussred(5)  =>   [1.32776690852703,1.27764227667921,-0.533627075302324,0.258655633309361,-1.76545189227476]

Le principe de ce calcul est très simple. On tire au hasard une probabilité p avec random(), et on cherche le x correspondant avec la fonction xgaussred(p).

 

hgauss(m,s,n=1) = renvoie une valeur au hasard de la variable x distribuée selon une loi normale (m=moyenne, s=écart-type). Si n (optionnel) est >1, renvoie une liste de n valeurs.

hgauss(2,3)  =>  4.03242270571878  

hgauss(2,3,5)  =>  [0.201618530765891,3.22913260911314,-0.842929170234812,4.07519103175748,7.25240024441201]

 


Module "credit"

 

menscredit(C, IA, N): => calcul de la mensualité de remboursement d'un crédit, correspondant à un capital emprunté de C avec un intérêt de IA en % (ex: "10" pour 10%) par an à rembourser en N mois.

Par exemple, on emprunte 1000 Euros à 10% par an, à rembourser en 12 mois:

menscredit(1000,10,12) => 87.92 (arrondi à 2 chiffres après la virgule)   

Remarques:

 

moiscredit(C,IA,M) => trouve le nombre de mois de remboursement d'un prêt, connaissant le capital emprunté C, l'interet annuel IA% et la mensualite M

Par exemple, on emprunte 1000 euros à 10% par an, et on rembourse 87.92 euros par mois: pendant combien de mois?

moiscredit(1000,10,87.92) => 12 (arrondi à 2 chiffres après la virgule)   

Remarque: si le nombre de mois trouvé est décimal (ex: 20.5), le crédit devrait comporter un dernier mois avec une mensualité inférieure aux autres

 

capcredit(IA,M,N) => trouve le capital emprunté à IA%/an d'intérêt, remboursé en N mois avec une mensualité de M

Par exemple, on se sent capable de rembourser 87.92 euros pendant 12 mois avec un crédit à 10% par an. Quel capital peut-on emprunter avec ça?

capcredit(10,87.92,12)  =>  1000 (arrondi à zéro chiffres après la virgule)  

Remarque: fonction à utiliser lors d'un achat important pour estimer ses propres capacités maxi d'emprunt. Par exemple, pour une maison, un remboursement maxi de 1500 Euros par mois sur 25 ans à 4% par an donne un emprunt  de 284178. euros (calculé par capcredit(4,1500,300)). A noter qu'en France, les banques limitent les remboursements de l'ensemble des crédits à 30% des revenus. Les américains devraient faire ça pour éviter les crises bancaires... (crises qu'ils exportent ensuite généreusement partout dans le monde).

 

intcredit(C,M,N) => calcule l'intérêt annuel IA% correspondant à un capital emprunté C, une mensualité M et un nombre de mois N de remboursement.

Par exemple, un organisme de crédit à la consommation vous propose de vous prêter 1000 euros à 14% par an, à rembourser par 50 euros par mois pendant 24 mois: Sa proposition est-elle correcte?

intcredit(1000,50,24)  =>  18.15%   

Non, ce n'est pas correct: C'est du 18% et pas 14%. Soit il ne sait pas compter, soit il vous ment. Dans les 2 cas, cherchez ailleurs!

 

coutcredit(C,M,N,sup=0) => calcule le coût d'un crédit connaissant le capital emprunté C, la mensualité M et le nb de mois de remboursement N

coutcredit(1000,50,24)  =>  200  

Ce n'est qu'une récapitulation facile à calculer (50*24-1000). On peut ajouter comme 4ème paramètre des frais supplémentaires, s'ils n'ont pas déjà été intégrés dans la mensualité (exemple: 20 euros=frais de dossier):

coutcredit(1000,50,24,20)  =>  220  

Vous pouvez obtenir directement le pourcentage que cela représente par rapport au capital emprunté, en divisant par le capital emprunté (=1000 ici) et en multipliant par 100 pour avoir les pourcentages:

coutcredit(1000,50,24,20)/1000*100  =>  22%  

 


Module "temps"

 

tempsordi() => donne la date et l'heure de l'ordinateur avec le jour de la semaine (en français) sous le format.

tempsordi()  =>  "dimanche 27/01/2008 19:14:26"  

 

tempsntp(sntp='ntp.univ-lyon1.fr') => donne la date et l'heure exacte (à la seconde) par consultation d'un serveur de temps "ntp" (nécessite un accès internet). Le serveur ntp par defaut: est: "ntp.univ-lyon1.fr" mais on peut en donner d'autres (voir http://www.cru.fr/services/ntp/serveurs_francais). J'ai vérifié que l'heure était la même à la seconde près qu'une horloge dont la mise à jour est faite par radio.

tempsntp()  =>   "dimanche 27/1/2008 19:15:25"  

 

cetteheure() => donne l'heure courante (de l'ordinateur) sous le format: "hh:mm:ss"'

cetteheure()  =>   "19:17:29"  

 

sec2hms(sd) => donne l'heure en "hh:mm:ss.sss" à partir des secondes décimales.

sec2hms(84125.321456)  =>   "23:22:05.321"  

 

cejour() => donne la date du jour sous le format: "jj/mm/aaaa".

cejour()  =>  "27/01/2008"  

 

bissextile(a) => dit si l'année donnée "a" est bissextile ou non.

bissextile(2008)  =>  True

bissextile(2009)  =>  False  

 

nbjoursan(a) => donne le nombre de jour de l'annee "a".

nbjoursan(2007) => 365

nbjoursan(2008)  => 366  

 

numjouran(D) => donne le numéro du jour dans l'année d'une date D 'j/m/a' (1er janvier = 1, ...).

numjouran("11/11/2007")  =>  315  

 

datenumjouran(n,a) => donne la date qui est le nième jour de l'année "a".

datenumjouran(315,2007)  =>  "11/11/2007"  

 

diffdate(D1,D2) => donne le nombre de jours entre 2 dates (format 'j/m/a'). Si D2 postérieure ou égale a D1, renvoie un nb positif ou nul. Sinon, renvoie un nb négatif.

diffdate("14/7/1789","11/11/2007")  =>  79742

diffdate("1/1/2008","11/11/2007")  =>  -51  

 

adddate(D,n) => donne la date qui est postérieure de n jours à la date D 'j/m/a', ou anterieure de n jours si n<0.

adddate("11/11/2007",-79742)  =>  "14/07/1789"

adddate("11/11/2007",51)  =>  "01/01/2008"  

 

numjoursem(D) => donne le numéro du jour de la semaine d'une date D 'j/m/a' (lundi=1, ...).

numjoursem("1/1/2008")  =>  2  (donc, c'est un mardi)

 

joursem(D) => donne le jour de la semaine d'une date D 'j/m/a' ('lundi' pour lundi, ...).

joursem("1/1/2008")  =>  "mardi" (je vous l'avais bien dit)  

 

lundi(D) => trouve la date du lundi d'une semaine qui contient une date D 'j/m/a'.

 lundi("1/1/2008")  =>  "31/12/2007"  

 

paques(an) => trouve la date de Pâques d'une année donnée "an" par la méthode Hodges (validité: calendrier grégorien de 1593 à 4100). Vérification a été faite (par programme) avec toutes les dates officielles. Pour plus d'infos sur l'algorithme, voir http://users.chariot.net.au/~gmarts/eastalg.htm#EasterHodges .

paques(2008) => "23/03/2008"  

 

ascension(an) => trouve la date du jeudi de l'ascension (paques + 39j).

ascension(2008) => "01/05/2008"  

 

pentecote(an) => trouve la date du dimanche de la pentecote (paques + 49j).

pentecote(2008) => "11/05/2008"  

 

mardigras(an) => trouve la date du mardi gras (paques - 47j).

mardigras(2008) => "05/02/2008"  

 

rameaux(an) => trouve la date du dimanche des rameaux (paques - 7j).

rameaux(2008) => "16/03/2008"  

 

feries(an,sd=0) => renvoie la liste des jours fériés (France) de l'année donnée en 1er paramètre.

feries(2008,1)  =>  ["Jour de l'an = mardi 01/01/2008","Jour de Pâques = dimanche 23/03/2008","lundi de Pâques= lundi 24/03/2008","Fête du Travail = jeudi 01/05/2008","Fête de la Victoire 1945 = jeudi 08/05/2008","Ascension = jeudi 01/05/2008","Pentecôte = dimanche 11/05/2008","Lundi de Pentecôte = lundi 12/05/2008","Fête Nationale = lundi 14/07/2008","Assomption = vendredi 15/08/2008","Toussaint = samedi 01/11/2008","Armistice 1918 = mardi 11/11/2008","Noël = jeudi 25/12/2008"]