NOMBRES - Curiosités, théorie et usages

 

Accueil                           DicoNombre            Rubriques           Nouveautés      Édition du: 24/07/2016

Orientation générale        DicoMot Math          Atlas                   Références                     M'écrire

Barre de recherche          DicoCulture              Index alphabétique                               

     

Informatique

 

Débutants

Programmation

Programmation

 

Glossaire

Général

 

 

INDEX

 

Programmation

 

Informatique

 

Procédure

Palindrome

Récursivité

 

Sommaire de cette page

>>> Propriété des palindromes

>>> Palindrome ?

>>> Procédure palindrome

>>> Recherche de carrés palindromes

>>> Bilan

>>> Recherche de strictement non palindromes

 

 

 

 

 

 

 

Palindromes

  

*    Comment tester si un nombre est un palindrome: un nombre qui peut se lire aussi bien de gauche à droite que de droite à gauche?

*    Une application de la procédure d'extraction des chiffres vue à la page précédente.

 

 

 

Propriété des palindromes

 

*      Soit un nombre palindrome de q de chiffres

 

Prenons  q pair

*      Par définition du palindrome, on trouve des couples de chiffres identiques symétriques par rapport au milieu du nombre.

                   Exemple: 4 5 6 6 5 4

 

*      Formalisons cela sur un graphique:

 

 

*      Pour atteindre chaque chiffre par son rang, un pointeur est mis en place

*       de gauche à droite: i progresse de 1 à q/2 et atteint tous les chiffres de gauche, et

*       de droite à gauche, pour atteindre le même chiffre symétrique, le pointeur progresse de q+1 à q/2 +1 en passant par  tous les q + 1 – i.

 

Si  q est impair

*      Dans ce cas le chiffre central est seul

Exemple: 4 5 6 7 6 5 4

 

*      Il nous faut toujours explorer q/2 nombres avec une petite nuance.

*       Prenons q = 7; alors q/2 vaut 3,5.

*       Or, il faut explorer 3 chiffres (et non 3,5).

*        Vous l'avez compris, il suffit de prendre la partie entière de la division; autrement dit le quotient (iquo).

 

 

 

 

 

Palindrome ?

 

*      On se donne un nombre N.

*      On extrait ses chiffres au moyen de la procédure Chiffre. Évidemment, cette procédure doit être présente et avoir été exécutée préalablement.

*      Calcul de q et du quotient de q par 2.

*      Initialisation d'un indicateur palindrome en position "Vrai".

*      Boucle de q/2 itérations

*      Test si les deux nombres symétriques sont les mêmes; en fait, s'ils sont différents, on fait "tomber" l'indicateur Palindrome à "Faux". Il suffit qu'il tombe une fois pour qu'il reste toujours en position Faux.

 

 

> # Test si un nombre

 # est palindrome

 

  N:=12321:

  NC:=Chiffre(N):

  q:=nops(NC): q2:=iquo(q,2):

  Palin:= Vrai:

 

    for i from 1 to q2 do

      if NC[i]<>NC[q+1-i]

        then Palin:= Faux:

      fi:

    od:

 

  Palin;

 

 

 

 

Procédure Palindrome

 

*      Nous reprenons le programme précédent est l'englobons dans une procédure.

 

*      Nous pouvons à loisir utiliser la "nouvelle instruction": Palin(n).

*      Si nous souhaitons utiliser le retour de la procédure, nous remplacerons lprint (n,Palin) par return (n,Palin). Voir ci-dessous.

 

> # Procédure Test si un nombre est palindrome

 

Palin:= proc (n)

local NC, q,q2,Palin,i;

  NC:=Chiffre(n):

  q:=nops(NC): q2:=iquo(q,2):

  Palin:= Vrai:

 

    for i from 1 to q2 do

      if NC[i]<>NC[q+1-i]

        then Palin:= Faux

      fi:

    od:

  lprint(n,Palin):

end:

 

> Palin(12321);

 Palin(123421);

12321, Vrai

123421, Faux

 

 

 

 

 

Recherche de carrés palindromes

 

*      Nous nous proposons de rechercher les nombres dont le carré est un palindrome.

 

*      La procédure Palin(n) est légèrement adaptée:

*       L'indicateur palindrome vaut 1 si le nombre est un palindrome et 0 sinon.

*       la procédure retourne la valeur 0 ou 1 de cet indicateur Palin.

 

*      Le programme de recherche des carrés palindromes est construit comme suit:

*       boucle de 1 à 10000

*       calcul du carré mis dans n

*       T est l'indicateur local recevant la valeur Palin de la procédure Palin(n)

*       Si l'indicateur vaut 1, alors nous imprimons le nombre et son carré, lequel est palindrome, bien entendu.

 

 

Non seulement, il y a 19 carrés palindromes jusqu'à n = 10 000, mais dix d'entre eux sont doublement palindrome comme, par exemple, 11² = 121 ou encore 121² = 14641.

 

> # Procédure Test si un nombre est palindrome

Palin:= proc (n)

local NC, q,q2,Palin,i;

   NC:=Chiffre(n):

   q:=nops(NC): q2:=iquo(q,2):

   Palin:= 1:

 

 for i from 1 to q2 do

   if NC[i]<>NC[q+1-i]

      then Palin:= 0

   fi:

 od:

 return(Palin):

end:

> #recherche de carrés palindromes

 for i from 1 to 10000 do

   n:=i*i:

   T:=Palin(n):

     if T=1 then

         lprint(i,n):

     fi:

 od:

 

 

1, 1

2, 4

3, 9

11, 121

22, 484

26, 676

101, 10201

111, 12321

121, 14641

202, 40804

212, 44944

264, 69696

307, 94249

836, 698896

1001, 1002001

1111, 1234321

2002, 4008004

2285, 5221225

2636, 6948496

 

 

*      Voici pour huit cubes palindromes pour les nombres de 1 à 10 000.

> #recherche de cubes palindromes

for i from 1 to 10000 do

   n:=i*i*i:

   T:=Palin(n):

     if T=1 then

        lprint(i,n):

     fi:

od:

 

1, 1

2, 8

7, 343

11, 1331

101, 1030301

111, 1367631

1001, 1003003001

2201, 10662526601

 

 

 

 

Ce que nous avons appris

  

*    En nous divertissant avec les palindromes nous avons appris à traiter un index qui, en l'occurrence ici, donne le rang des chiffres dans un nombre.

*    Nous avons exploité un indicateur logique qui témoigne d'un état; ici, si le nombre est palindrome ou non.

*    Nous avons, mine de rien, mis au point une procédure (Palin) qui exploite une autre procédure (Chiffre); soit deux procédures emboîtées.

*    Ci-dessous, le listing complet de ces programmes.

 

Bonus

Recherche des strictement non-palindromes

 

Un nombre strictement non palindrome n est non palindrome dans toutes les bases de 2 à n – 2.

 

 

Initialisation (remise à zéro de toutes les mémoires).

Recherche pour les nombres n de 4 à 10 000.

L'indicateur palinT à zéro indique qu'il n'y a pas de palindrome pour n. Mis à 0 au départ.

 

Boucle sur toutes les bases i de 2 à n – 2.

L'indicateur palin est à 1, supposant que le nombre n dans la base i est un palindrome.

C reçoit le nombre n convertit dans la base i et qC compte la quantité de chiffres.

 

Boucle de vérification si ce nombre converti est un palindrome. S'il existe deux chiffres symétriques non égaux, alors le nombre n'est pas palindrome et palin  est descendu à 0.

Si le nombre converti résiste, c'est qu'il est bien palindrome (palin = 1), alors on incrémente le compteur de palindrome palinT.

Si aucun palindrome n'a été rencontré durant l'exploration des nombres convertis (palinT = 0), alors imprimer le nombre n qui est bien un strictement non palindrome.

 

En bleu, le début de l'impression lors de l'exécution du programme.

 

 

 

 

 

 

 

 

Retour

*       ProgrammationIndex

Suite

*    Récursivité

Voir

*    Menu en en-tête

*    Palindromes – Nombres

*    Palindromes – Mots et phrases

*    Programmation – En savoir un peu plus

Cette page

http://villemin.gerard.free.fr/aInforma/10Palind.htm

 

 

 

Programmes complets: les procédures CHIFFRES et PALINDROME;

et le programme de recherche des carrés palindromes

 

# Tous les programmes nécessaires pour tester les carrés palindromes

 

# Procédure CHIFFRE

 

Chiffre:=proc(n)

local C,nn, q, i,R:

  nn:=n:

  C:=[]:

  while nn>0 do

      C:=[op(C),irem(nn,10)];

      nn:= iquo(nn,10):

  od:

 

      q:=nops(C):R:=[]:

  for i from 1 to q do

      R:=[op(R),C[q-i+1]]

  od:

 

return (R):

 

end:

 

# Procédure PALINDROME

Palin:= proc (n)

local NC, q,q2,Palin,i;

  NC:=Chiffre(n):

  q:=nops(NC): q2:=iquo(q,2):

  Palin:= 1:

 

    for i from 1 to q2 do

      if NC[i]<>NC[q+1-i]

         then Palin:= 0

      fi:

    od:

return(Palin):

end:

 

#recherche de carrés palindromes

for i from 1 to 100000 do

   n:=i*i:

   T:=Palin(n):

     if T=1 then

        lprint(i,n):

     fi:

od:

 

1, 1

2, 4

3, 9

11, 121

22, 484

26, 676

101, 10201

111, 12321

121, 14641

202, 40804

212, 44944

264, 69696

307, 94249

836, 698896

1001, 1002001

1111, 1234321

2002, 4008004

2285, 5221225

2636, 6948496

10001, 100020001

10101, 102030201

10201, 104060401

11011, 121242121

11111, 123454321

11211, 125686521

20002, 400080004

20102, 404090404

22865, 522808225

24846, 617323716

30693, 942060249

 

Pour copier ce programme dans Mapple:

Sélectionner ce texte. Faites Ctrl C pour coller le texte dans le presse-papier.

Pointez l'endroit où vous voulez placer ce texte. Faites Ctrl V pour verser le contenu du presse-papier.