NOMBRES - Curiosités, théorie et usages

 

Accueil                           DicoNombre            Rubriques           Nouveautés      Édition du: 29/04/2020

Orientation générale        DicoMot Math          Atlas                   Actualités                       M'écrire

Barre de recherche          DicoCulture              Index alphabétique        Références      Brèves de Maths          

     

Programmation

 

Débutants

Programmation

PYTHON

 

Glossaire

Informatique

Glossaire

Algorithme

 

 

 

INDEX

Python

 

Programmation

Informatique

Multimédia

Ordinateur

 

Python (la base)

Glossaire

Palindrome

Les classiques

Arithmétique

Dessins

Puissances

Plus de chiffres

Trucs

Chiffres

NumPy

Lycée

 

Sommaire de cette page

>>> Diviseurs – Programme d'initiation

>>> Division par soustractions

>>> PGCD – Algorithme d'Euclide

>>> Nombres premiers – Identification

>>> Premiers – Optimisé

>>> Factorisation des nombres

>>> Factorisation des nombres au format standard

>>> Diviseurs d'un nombre

>>> Commande compactée – Boucle et condition

>>> Diviseurs – Programme compacté

>>> Bilan

 

 

 

 

 PROGRAMMATION

PYTHON – Arithmétique

 

Mes premiers programmes en arithmétique avec Python.   Occasion de découvrir quelques subtilités du langage par l'expérimentation.

Voir absolument  Mon espace de travail en Python

 

 

Diviseurs – Programme d'initiation

Programme dans l'éditeur

 

 

Affichage dans l'interpréteur

 

But

Trouver tous les diviseurs d'un nombre entier n.

 

Exemple

1, 2, 3, 4, 6 et 12 sont diviseurs de 12

 

Principe

Exploration des nombres successifs i de 1 à n et test si ce nombre i divise n.

Un nombre n est divisible par i si le reste de la division est nul. 

 

Commentaires

La première instruction permet de donner un nombre entier. Input donne la main pour taper ce nombre qui est compris comme une chaine de caractères. L'instruction int (integer = nombre en anglais) transforme cette chaine en nombre.

Lancement d'une boucle qui s'arrête à n en lui commandant n+1.

Si le reste de la division (n%i) est nul, imprimer n.

 

Résultat

Ici, on a tapé 60 après l'invitation : nombre.

Le programme lancé (run) donne la liste des diviseurs de 60.

 

Division par soustractions

 

Programme dans l'éditeur

 

 

Affichage dans l'interpréteur

 

 

 

But

Trouver le quotient de la division de a par b. Annoncer également le reste.

 

Exemple

100 / 12 = 8 reste 4.
En effet: 12 x 8 =94 reste 4.

100 / (–4) = –25 reste 0

 

Principe

Soustraire le diviseur (b) du dividende (a) autant de fois que la soustraction est possible.

 

Commentaires

On définit la fonction division avec deux arguments (dividende et diviseur).

On traite le signe en premier et, ceci fait, on ne conserve que la valeur absolue (abs) des deux nombres. Notez l'antislash qui permet de continuer l'instruction sur la ligne suivante.

Le quotient est en fait un compteur de soustractions, mis à zéro au départ.

Tant que (while) le dividende reste plus grand que le diviseur, on soustrait et on ajoute un au compteur-quotient.

Le dernier dividende calculé est égal au reste de la division

La fonction nous transmet (return) le quotient trouvé assorti du signe, puis le reste.

Le programme principal exécute les deux exemples de divisions.

 

 

PGCD – Algorithme d'Euclide

 

Programme dans l'éditeur

 

 

Affichage dans l'interpréteur

 

 

But

Trouver le PGCD de deux nombres selon l'algorithme d'Euclide

 

Exemple

PGCD (1000, 22) = 2

 

Principe

Algorithme d'Euclide.

 

Commentaires

On trouve ici de nombreux symboles dont la signification est expliquée en Bases Python.

 

On définit la fonction pgcd(a,b) qui retourne la variable mini qui en fin de boucle vaut le pgcd.

Le programme principal introduit le dialogue au clavier.

Tant que la variable encore vaut o (on a pris la précaution de l mettre à cette valeur avant de commencer), demander deux nombres dont la frappe sera placée en N et M.

Impression d'une expression alternant du texte et les variables  N, M et le pgcd.

 

 

Identification des nombres premiers

 

Programme dans l'éditeur

 

Affichage dans l'interpréteur

 

 

But

Trouver si un nombre est premier. Le programme retourne 0 si n est premier, sinon il indique le facteur le plus petit.

 

Principe

Tout d'abord, on détecte si le nombre est pair, alors on retourne 2. Sinon on examine les diviseurs impairs jusqu'à ce que leur carré dépasse n.

Si aucune divisibilité n'est trouvée, on retourne 0; le nombre est premier

 

Notes

Astuce pour détecter si un nombre est pair: on utilise n en binaire que l'on compare à 1:
Exemple: 4 = 0100 => 0100 ET 0001 = 0000 => pair
                   5 = 0101 => 0101 ET 0001 = 0001 => impair

Pour savoir si n est divisible par i, on teste si son modulo (n % i) est nul.

 

Test

Le nombre 1999 produit 0, il est premier

Le nombre 1234567 produit 127, il composé et divisible par 127.

 

 

Programme optimisé

 

 

But

Accélérer la recherche (sans aller chercher les algorithmes avancés de la théorie des nombres)

 

Principe

Utiliser la barre magique des nombres premiers. Elle dit que les nombres premiers ne sont seulement qu'en 6n  1. Ces nombres sont donc, espacés alternativement de 2 et 4 pas.

 

Programme

Le programme élimine d'abord les cas n = 2, n = 3, n divisible par 2 et n divisible par 3.

 

Il traite ensuit les nombre à partir de i = 5 et jusqu'à ce que le carré de i dépasse ou égale n.

 

La boucle incrémente i de la valeur d qui prend alternativement les valeurs 2 puis 4.

Si aucune divisibilité n'est trouvée, le programme renvoie "True" qui signifie que le nombre est premier.

 

Le programme principal analyse, par exemple, la plage des nombres de 1008 à 1015 (non compris).

 

 

 

Factorisation des nombres

Algorithme

 

Programme dans l'éditeur

 

Affichage dans l'interpréteur

 

But

Lister tous les facteurs d'un nombre. Facteur = diviseurs premiers.
Comme: 50 = 2 x 5 x 5

 

Description de l'algorithme

La variable n est le nombre à factoriser. Lorsqu'un diviseur (i) sera trouvé, elle prendra la valeur du quotient (n / i).

Lorsque les divisions successives conduiront à n = 1, alors la factorisation sera terminée (boucle de droite).  

 

Si i divise n (symbole barre verticale), on retient le facteur et  on met à jour n avec  le quotient.

L'analyse continue avec le même diviseur (i) tant que le quotient (n) est divisible: détection des facteurs multiples. 

Après épuisement le diviseur (i) est incrémenté (boucle de gauche) et on recommence les tests de divisibilité.

 

Exemple (trace des variables)

n =  50 / 25                 5 / 1  / Fin

 i  =   2 /  3  / 4  /  5  /  5

 

 

Programme

 

Préparation d'une liste avec le facteur 1.

Boucle d'analyse en i (diviseur), incrémenté en fin de boucle

 

Boucle interne qui cherche si n est divisible par i et combien de fois. En cas de divisibilité, le diviseur (i) est un facteur; il est ajouté (append) à a liste L.

 

Le programme affiche tous les facteurs, même les multiplicités, dans l'ordre croissant

Avec 211 = 2 048, on a bien la liste des onze facteurs 2.

 

 

Factorisation des nombres au format standard

Programme dans l'éditeur

 

Affichage dans l'interpréteur

 

But

Lister tous les facteurs d'un nombre: chaque facteur étant associé à sa multiplicité, comme:
50 = [[1, 1],  [2, 1],  [5, 2]]

 

Programme

 

Le même que ci-dessus.

 

À chaque passage dans la boucle interne (de détermination de multiplicité), on incrémente un compteur (kt).

En sortie de boucle, si le compteur n'est pas nul, on ajoute le couple facteur /quantité (i et kt) dans la liste.

 

 

Format de sortie

Cette fois, on traduit le fait que:

1 765 400 = 1 x 23 x 52 x 7 x 13 x 97

ou   2 048 = 1 x 211

 

 

Diviseurs d'un nombre

Programme dans l'éditeur

 

Affichage dans l'interpréteur

 

Note

Avec Maple, divisors(100) produit directement la liste des diviseurs. Python ne dispose pas de ces fonctions arithmétiques (sauf adjonction de packages spéciaux).

 

But

Trouver tous les diviseurs d'un nombre n.

 

Diviseurs

Les diviseurs vont par paire: 100 = 2 x 50  = 4 x 25 = 5 x 20 = 10 x 10

Moralité: à chaque division, on trouve deux diviseurs et, on peut arrêter l'exploration à racine de n (10 pour 100)

 

Commentaires

On définit d'abord la recherche de diviseurs. Ceux-ci seront placés dans la liste D.

Boucle d'exploration de 1 à racine de n (puissance 0,5 avec ** pour puissance).

Divisibilité testée avec: modulo (symbole %) nul.

Le diviseur i et le quotient entier (n // i) sont ajoutés (apposés, append) à la liste déjà constituée

Retour demandé en supprimant les doublons (set) et en triant les nombres (sorted)

 

Solution rapide avec ensemble des diviseurs

Exemple pour la concision d'écriture, mais pas pour la rapidité de calcul

Définition d'une fonction Ediv (ensemble des diviseurs).

Renvoyer k pour tous les k de 1 à n tel que k divise n.

Les accolades {…} caractérisent un ensemble: valeurs non répétées. Attention: Python renvoie les valeurs dans un ordre quelconque.

Une manière raccourcie pour créer une liste (en rouge)

Limitation de la recherche à la racine carrée de n  + 1, prise en nombre entier (int).

Si n est divisible par k (vaut 0 mod k), compléter l'ensemble E (c'est ce que veut dire la barre verticale suivie de =; la barre verticale est obtenue avec Alt Gr 6) par k et son complémentaire n//k. Le double // donne le quotient, un nombre entier.

Vous noterez que les diviseurs vont par paires: 3 x 4115 = 5 x 2469 = 15 x 823 = 12345, d'où  k et n/k

Voir Éditeur et interpréteur

 

 

Commande compactée – Boucle et condition

Programme dans l'éditeur

Note: l'antislash \ permet d'aller à la ligne suivante

 

Affichage dans l'interpréteur

 

 

But

Mettre la formation d'une liste conditionnelle en une seule ligne.

Exemple avec liste des carrés des nombres pairs

 

Commentaires

Les couple à placer dans la liste S sont n et son carré n**2;

Et, cela de n = 1 à 10, non compris;

À condition que n soit un nombre pair: vaut 0 modulo 2 (le reste de la division par 2 est nul).

Impression de cette liste triée (sorted).

 

 

Diviseurs – Programme compacté

 

 

 

But

Reprise du programme diviseurs, en utilisant la forme compactée vue ci-dessus.

 

Commentaires

Apple du module math pour calculer la racine carrée (sqrt) plutôt que la puissance ½.

D, la liste (présence des crochets [ ]) des diviseurs est calculée en une seule ligne (imprimée sur trois avec les \ de retour à la ligne).

 

 

 

 

 

But

Convertir la liste imbriquée de paires de nombres en une liste unique.

 

Commentaires

Le programme précédent est complété par celui-ci.

Définition de liste unique (ListUn)

Tant que le programme rencontre une liste interne, il recommence (récursivité).

Sinon, il ajouté (append) le nombre à la liste en cours de formation (DD).

Impression de la liste triée (sorted).

 

 

Autre version pour les diviseurs et recherche des nombres premiers

 

Particularités:

Déclaration d'un ensemble avec set

Utilisation de la barre verticale qui réunit les listes; ici, on ajoute k et le quotient de n divisé par k (//) à la liste existante LD.

 

La fonction Premier retourne True ou False (Vrai ou Faux) selon que la quantité de diviseurs est égale à 2 ou non, caractérisation d'un nombre premier.

 

Le programme principal demande les diviseurs de 100 triés (sorted) puis, la liste des nombres premiers dans l'intervalle demandé.

 

 

Bilan

À l'occasion de l'apprentissage du langage Python, nous avons revu comment faire la recherche des nombres premiers et, d'une manière générale, comment établir la liste des facteurs et des diviseurs d'un nombre.

Il existe des modules de traitement mathématique qui offre ces fonctions et d'autres (Sympy, logiciel libre,  semble le meilleur actuellement – Je n'ai pas encore testé; j'utilise Maple ou Maxima)

 

 

 

 

Retour

*         Python – Ce qu'il faut absolument comprendre avant de se lancer

*         Autres programmes sur les Facteurs

Suite

*         Tour d'horizon avec l'exemple des palindromes

*         Les classiques – Factorielle, Fibonacci …

*         Comment obtenir plus de chiffres significatifs

*         Mes premiers dessins

Voir

*         Scratch – Apprendre à programmer simplement

*         Maple – Apprendre à programmer (maths)

*         Historique de l’aventure informatique

Sites

*         List of computer algebra systems – Wikipédia – Liste et comparaison de tous les logiciels mathématiques, libres ou payants

*         Sympy – Wikipédia

*         Cours python • modulo • écrire un programme pour trouver les diviseurs d'un entier • lycée tutoriel – jaicompris Maths

Cette page

http://villemin.gerard.free.fr/aInforma/PYTHON/Arithmet.htm