2. Les structures II#

from random import randint
from math import ceil

2.1. Exercice 1#

L’objectif de cet exercice est d’utiliser un dictionnaire pour stocker les notes d’étudiants obtenues aux examens et de calculer la note finale ainsi que des moyennes.

Question

  1. Créez un dictionnaire appelé data dont les clés sont des chaines de caractères (les noms des étudiants) et dont les valeurs associées sont vides (un dictionaire vide). Vous pourrez récupérer la liste des étudiants inscrits dans l’UE écrite dans le fichier donnes/noms.csv.

Indication

Les commandes suivantes permettent de lire et de stocker dans une liste les lignes du fichier noms.csv :

filename = 'nom.csv'
with open(filename, "r") as f:
    liste_noms = f.readlines()
    print(liste_noms)

download the csv file

Hide code cell source
with open("donnees/noms.csv", "r") as f:  # ouverture du fichier en lecture
    liste_noms = f.readlines()
data = {lk[:-1]: {} for lk in liste_noms}
print(data)
{'Abou Hamad': {}, 'Adelis': {}, 'Ait Belkacem': {}, 'Aktouf': {}, 'Amadi': {}, 'Auber--Joignant': {}, 'Auge': {}, 'Auxerre': {}, 'Ayadi': {}, 'Barbarand': {}, 'Baudat': {}, 'Bayssiere': {}, 'Belanger': {}, 'Belessort': {}, 'Benaid': {}, 'Benhamadouche': {}, 'Benramdane': {}, 'Bousson': {}, 'Bouzelmat': {}, 'Brasero Pardow': {}, 'Campaniello': {}, 'Cassedanne': {}, 'Challe': {}, 'Chennoufi': {}, 'Chidiac': {}, 'Chupin': {}, 'Collin--Tikes': {}, 'Cordone': {}, 'De Almeida': {}, 'De Rette': {}, 'Delarue': {}, 'Den Dryver': {}, 'Dufour': {}, 'Elbahi': {}, 'Fallavier': {}, 'Fillaud': {}, 'Gamamou': {}, 'Gillet': {}, 'Goui': {}, 'Graziani': {}, 'Guillore': {}, 'Hage Chehade': {}, 'Hamadouche': {}, 'Hatanbaatar Van Atartugs': {}, 'Henry': {}, 'Kasmi': {}, 'Labouret': {}, 'Laveus': {}, 'Lemattre': {}, 'Li': {}, 'Lilliu': {}, 'Logeais': {}, 'Mack': {}, 'Maistre--Matus': {}, 'Messin': {}, 'Michel': {}, 'Mirochnikov': {}, 'Molano Quintana': {}, 'Moncomble': {}, 'Muhlmeyer': {}, 'Oleas': {}, 'Pelosi': {}, 'Pezennec': {}, 'Pezout': {}, 'Planes': {}, 'Pollak': {}, 'Proietti': {}, 'Ribeiro': {}, 'Rohic--Vandevelde': {}, 'Sassus-Bourda': {}, 'Savary': {}, 'Senovilla Herrero': {}, 'Setiano': {}, 'Shi': {}, 'Smets': {}, 'Solan--De Renty': {}, 'Tamain-Gloz': {}, 'Tayari': {}, 'Thieffry': {}, 'Toffa': {}, 'Tournois': {}, 'Tran--Guery': {}, 'Uthayakumar': {}, 'Vancauwenberghe': {}, 'Vigny': {}, 'Wang': {}, 'Wendels': {}, 'Widmayer': {}, 'Yakub': {}, 'Zabour': {}, 'Zegiestowski': {}}

Question

  1. Remplissez à présent le dictionnaire (actuellement vide) pour chaque étudiant avec une note de partiel et une note d’examen (la clé sera le nom de l’examen et la valeur, la note obtenue). Vous pourrez utiliser la commande randint(0, 20) qui retourne un entier aléatoire entre 0 et 20.

Hide code cell source
nom_examen = 'partiel'
for nom in data.keys():
    data[nom][nom_examen] = randint(0, 20)
nom_examen = 'examen'
for nom in data.keys():
    data[nom][nom_examen] = randint(0, 20)
print(data)
{'Abou Hamad': {'partiel': 17, 'examen': 16}, 'Adelis': {'partiel': 5, 'examen': 6}, 'Ait Belkacem': {'partiel': 12, 'examen': 20}, 'Aktouf': {'partiel': 4, 'examen': 15}, 'Amadi': {'partiel': 6, 'examen': 5}, 'Auber--Joignant': {'partiel': 8, 'examen': 15}, 'Auge': {'partiel': 8, 'examen': 19}, 'Auxerre': {'partiel': 11, 'examen': 20}, 'Ayadi': {'partiel': 3, 'examen': 18}, 'Barbarand': {'partiel': 16, 'examen': 10}, 'Baudat': {'partiel': 9, 'examen': 11}, 'Bayssiere': {'partiel': 5, 'examen': 19}, 'Belanger': {'partiel': 19, 'examen': 14}, 'Belessort': {'partiel': 8, 'examen': 17}, 'Benaid': {'partiel': 19, 'examen': 3}, 'Benhamadouche': {'partiel': 10, 'examen': 11}, 'Benramdane': {'partiel': 19, 'examen': 9}, 'Bousson': {'partiel': 8, 'examen': 14}, 'Bouzelmat': {'partiel': 17, 'examen': 15}, 'Brasero Pardow': {'partiel': 3, 'examen': 20}, 'Campaniello': {'partiel': 13, 'examen': 6}, 'Cassedanne': {'partiel': 9, 'examen': 9}, 'Challe': {'partiel': 2, 'examen': 10}, 'Chennoufi': {'partiel': 2, 'examen': 16}, 'Chidiac': {'partiel': 15, 'examen': 5}, 'Chupin': {'partiel': 10, 'examen': 2}, 'Collin--Tikes': {'partiel': 12, 'examen': 2}, 'Cordone': {'partiel': 9, 'examen': 18}, 'De Almeida': {'partiel': 16, 'examen': 1}, 'De Rette': {'partiel': 9, 'examen': 13}, 'Delarue': {'partiel': 19, 'examen': 3}, 'Den Dryver': {'partiel': 14, 'examen': 19}, 'Dufour': {'partiel': 10, 'examen': 6}, 'Elbahi': {'partiel': 8, 'examen': 6}, 'Fallavier': {'partiel': 7, 'examen': 7}, 'Fillaud': {'partiel': 3, 'examen': 1}, 'Gamamou': {'partiel': 9, 'examen': 4}, 'Gillet': {'partiel': 19, 'examen': 9}, 'Goui': {'partiel': 2, 'examen': 0}, 'Graziani': {'partiel': 1, 'examen': 7}, 'Guillore': {'partiel': 17, 'examen': 2}, 'Hage Chehade': {'partiel': 4, 'examen': 3}, 'Hamadouche': {'partiel': 19, 'examen': 4}, 'Hatanbaatar Van Atartugs': {'partiel': 5, 'examen': 1}, 'Henry': {'partiel': 14, 'examen': 10}, 'Kasmi': {'partiel': 5, 'examen': 0}, 'Labouret': {'partiel': 8, 'examen': 15}, 'Laveus': {'partiel': 6, 'examen': 15}, 'Lemattre': {'partiel': 4, 'examen': 11}, 'Li': {'partiel': 4, 'examen': 13}, 'Lilliu': {'partiel': 2, 'examen': 14}, 'Logeais': {'partiel': 4, 'examen': 7}, 'Mack': {'partiel': 17, 'examen': 7}, 'Maistre--Matus': {'partiel': 20, 'examen': 18}, 'Messin': {'partiel': 14, 'examen': 4}, 'Michel': {'partiel': 2, 'examen': 17}, 'Mirochnikov': {'partiel': 18, 'examen': 3}, 'Molano Quintana': {'partiel': 2, 'examen': 7}, 'Moncomble': {'partiel': 20, 'examen': 3}, 'Muhlmeyer': {'partiel': 13, 'examen': 2}, 'Oleas': {'partiel': 15, 'examen': 19}, 'Pelosi': {'partiel': 18, 'examen': 20}, 'Pezennec': {'partiel': 14, 'examen': 9}, 'Pezout': {'partiel': 19, 'examen': 12}, 'Planes': {'partiel': 12, 'examen': 1}, 'Pollak': {'partiel': 14, 'examen': 19}, 'Proietti': {'partiel': 0, 'examen': 3}, 'Ribeiro': {'partiel': 8, 'examen': 5}, 'Rohic--Vandevelde': {'partiel': 15, 'examen': 5}, 'Sassus-Bourda': {'partiel': 14, 'examen': 10}, 'Savary': {'partiel': 19, 'examen': 1}, 'Senovilla Herrero': {'partiel': 11, 'examen': 8}, 'Setiano': {'partiel': 10, 'examen': 11}, 'Shi': {'partiel': 18, 'examen': 16}, 'Smets': {'partiel': 6, 'examen': 0}, 'Solan--De Renty': {'partiel': 9, 'examen': 2}, 'Tamain-Gloz': {'partiel': 3, 'examen': 20}, 'Tayari': {'partiel': 7, 'examen': 9}, 'Thieffry': {'partiel': 7, 'examen': 11}, 'Toffa': {'partiel': 13, 'examen': 3}, 'Tournois': {'partiel': 15, 'examen': 18}, 'Tran--Guery': {'partiel': 11, 'examen': 3}, 'Uthayakumar': {'partiel': 0, 'examen': 4}, 'Vancauwenberghe': {'partiel': 17, 'examen': 1}, 'Vigny': {'partiel': 10, 'examen': 1}, 'Wang': {'partiel': 20, 'examen': 4}, 'Wendels': {'partiel': 11, 'examen': 5}, 'Widmayer': {'partiel': 18, 'examen': 16}, 'Yakub': {'partiel': 4, 'examen': 20}, 'Zabour': {'partiel': 13, 'examen': 20}, 'Zegiestowski': {'partiel': 11, 'examen': 19}}

Questions

  1. Calculez pour chaque étudiant la moyenne obtenue avec un poids de \(1/3\) pour le partiel et \(2/3\) pour l’examen. Affichez les résultats de tous les étudiants en précisant s’ils sont reçus avec une moyenne supérieure à \(10\). Vous arrondirez les notes à 0.25 points supérieures.

  2. Affichez également la moyenne du partiel, celle de l’examen et la moyenne des notes finales.

Indication

Pour calculer un arrondi par valeur supérieure, vous pourrez penser à utiliser la fonction ceil du package math.

Hide code cell source
poids = {'partiel': 1/3, 'examen': 2/3}
moy_partiel, moy_examen, moy_finale = 0, 0, 0
print("*"*80)
print("Liste des notes")
print("-"*80)
for nom, notes in data.items():
    m = poids['partiel']*notes['partiel'] + poids['examen']*notes['examen']
    m = ceil(4*m)/4
    print(f"{nom:30s} P: {notes['partiel']:05.2f} E: {notes['examen']:05.2f} F: {m:05.2f}", end='')
    if m >= 10:
        print(" (R)")
    else:
        print(" (A)")
    moy_partiel += notes['partiel']
    moy_examen += notes['examen']
    moy_finale += m
print("-"*80)
moy_partiel /= len(data)
moy_examen /= len(data)
moy_finale /= len(data)
print(f"{'MOYENNES':30s} P: {moy_partiel:05.2f} E: {moy_examen:05.2f} F: {moy_finale:05.2f}")
print("*"*80)
********************************************************************************
Liste des notes
--------------------------------------------------------------------------------
Abou Hamad                     P: 17.00 E: 16.00 F: 16.50 (R)
Adelis                         P: 05.00 E: 06.00 F: 05.75 (A)
Ait Belkacem                   P: 12.00 E: 20.00 F: 17.50 (R)
Aktouf                         P: 04.00 E: 15.00 F: 11.50 (R)
Amadi                          P: 06.00 E: 05.00 F: 05.50 (A)
Auber--Joignant                P: 08.00 E: 15.00 F: 12.75 (R)
Auge                           P: 08.00 E: 19.00 F: 15.50 (R)
Auxerre                        P: 11.00 E: 20.00 F: 17.00 (R)
Ayadi                          P: 03.00 E: 18.00 F: 13.00 (R)
Barbarand                      P: 16.00 E: 10.00 F: 12.00 (R)
Baudat                         P: 09.00 E: 11.00 F: 10.50 (R)
Bayssiere                      P: 05.00 E: 19.00 F: 14.50 (R)
Belanger                       P: 19.00 E: 14.00 F: 15.75 (R)
Belessort                      P: 08.00 E: 17.00 F: 14.00 (R)
Benaid                         P: 19.00 E: 03.00 F: 08.50 (A)
Benhamadouche                  P: 10.00 E: 11.00 F: 10.75 (R)
Benramdane                     P: 19.00 E: 09.00 F: 12.50 (R)
Bousson                        P: 08.00 E: 14.00 F: 12.00 (R)
Bouzelmat                      P: 17.00 E: 15.00 F: 15.75 (R)
Brasero Pardow                 P: 03.00 E: 20.00 F: 14.50 (R)
Campaniello                    P: 13.00 E: 06.00 F: 08.50 (A)
Cassedanne                     P: 09.00 E: 09.00 F: 09.00 (A)
Challe                         P: 02.00 E: 10.00 F: 07.50 (A)
Chennoufi                      P: 02.00 E: 16.00 F: 11.50 (R)
Chidiac                        P: 15.00 E: 05.00 F: 08.50 (A)
Chupin                         P: 10.00 E: 02.00 F: 04.75 (A)
Collin--Tikes                  P: 12.00 E: 02.00 F: 05.50 (A)
Cordone                        P: 09.00 E: 18.00 F: 15.00 (R)
De Almeida                     P: 16.00 E: 01.00 F: 06.00 (A)
De Rette                       P: 09.00 E: 13.00 F: 11.75 (R)
Delarue                        P: 19.00 E: 03.00 F: 08.50 (A)
Den Dryver                     P: 14.00 E: 19.00 F: 17.50 (R)
Dufour                         P: 10.00 E: 06.00 F: 07.50 (A)
Elbahi                         P: 08.00 E: 06.00 F: 06.75 (A)
Fallavier                      P: 07.00 E: 07.00 F: 07.00 (A)
Fillaud                        P: 03.00 E: 01.00 F: 01.75 (A)
Gamamou                        P: 09.00 E: 04.00 F: 05.75 (A)
Gillet                         P: 19.00 E: 09.00 F: 12.50 (R)
Goui                           P: 02.00 E: 00.00 F: 00.75 (A)
Graziani                       P: 01.00 E: 07.00 F: 05.00 (A)
Guillore                       P: 17.00 E: 02.00 F: 07.00 (A)
Hage Chehade                   P: 04.00 E: 03.00 F: 03.50 (A)
Hamadouche                     P: 19.00 E: 04.00 F: 09.00 (A)
Hatanbaatar Van Atartugs       P: 05.00 E: 01.00 F: 02.50 (A)
Henry                          P: 14.00 E: 10.00 F: 11.50 (R)
Kasmi                          P: 05.00 E: 00.00 F: 01.75 (A)
Labouret                       P: 08.00 E: 15.00 F: 12.75 (R)
Laveus                         P: 06.00 E: 15.00 F: 12.00 (R)
Lemattre                       P: 04.00 E: 11.00 F: 08.75 (A)
Li                             P: 04.00 E: 13.00 F: 10.00 (R)
Lilliu                         P: 02.00 E: 14.00 F: 10.00 (R)
Logeais                        P: 04.00 E: 07.00 F: 06.00 (A)
Mack                           P: 17.00 E: 07.00 F: 10.50 (R)
Maistre--Matus                 P: 20.00 E: 18.00 F: 18.75 (R)
Messin                         P: 14.00 E: 04.00 F: 07.50 (A)
Michel                         P: 02.00 E: 17.00 F: 12.00 (R)
Mirochnikov                    P: 18.00 E: 03.00 F: 08.00 (A)
Molano Quintana                P: 02.00 E: 07.00 F: 05.50 (A)
Moncomble                      P: 20.00 E: 03.00 F: 08.75 (A)
Muhlmeyer                      P: 13.00 E: 02.00 F: 05.75 (A)
Oleas                          P: 15.00 E: 19.00 F: 17.75 (R)
Pelosi                         P: 18.00 E: 20.00 F: 19.50 (R)
Pezennec                       P: 14.00 E: 09.00 F: 10.75 (R)
Pezout                         P: 19.00 E: 12.00 F: 14.50 (R)
Planes                         P: 12.00 E: 01.00 F: 04.75 (A)
Pollak                         P: 14.00 E: 19.00 F: 17.50 (R)
Proietti                       P: 00.00 E: 03.00 F: 02.00 (A)
Ribeiro                        P: 08.00 E: 05.00 F: 06.00 (A)
Rohic--Vandevelde              P: 15.00 E: 05.00 F: 08.50 (A)
Sassus-Bourda                  P: 14.00 E: 10.00 F: 11.50 (R)
Savary                         P: 19.00 E: 01.00 F: 07.00 (A)
Senovilla Herrero              P: 11.00 E: 08.00 F: 09.00 (A)
Setiano                        P: 10.00 E: 11.00 F: 10.75 (R)
Shi                            P: 18.00 E: 16.00 F: 16.75 (R)
Smets                          P: 06.00 E: 00.00 F: 02.00 (A)
Solan--De Renty                P: 09.00 E: 02.00 F: 04.50 (A)
Tamain-Gloz                    P: 03.00 E: 20.00 F: 14.50 (R)
Tayari                         P: 07.00 E: 09.00 F: 08.50 (A)
Thieffry                       P: 07.00 E: 11.00 F: 09.75 (A)
Toffa                          P: 13.00 E: 03.00 F: 06.50 (A)
Tournois                       P: 15.00 E: 18.00 F: 17.00 (R)
Tran--Guery                    P: 11.00 E: 03.00 F: 05.75 (A)
Uthayakumar                    P: 00.00 E: 04.00 F: 02.75 (A)
Vancauwenberghe                P: 17.00 E: 01.00 F: 06.50 (A)
Vigny                          P: 10.00 E: 01.00 F: 04.00 (A)
Wang                           P: 20.00 E: 04.00 F: 09.50 (A)
Wendels                        P: 11.00 E: 05.00 F: 07.00 (A)
Widmayer                       P: 18.00 E: 16.00 F: 16.75 (R)
Yakub                          P: 04.00 E: 20.00 F: 14.75 (R)
Zabour                         P: 13.00 E: 20.00 F: 17.75 (R)
Zegiestowski                   P: 11.00 E: 19.00 F: 16.50 (R)
--------------------------------------------------------------------------------
MOYENNES                       P: 10.51 E: 09.58 F: 09.98
********************************************************************************

2.2. Exercice 2#

Cet exercice permet de trouver une fraction approchant \(\pi\).

Questions

  1. Déterminez le meilleur encadrement de \(\pi\) par deux fractions rationnelles dont les formes réduites \(p/q\) sont telles que \(p\) et \(q\) s’écrivent avec au plus 3 chiffres.

  2. Essayez d’affiner votre recherche afin de calculer rapidement le meilleur encadrement avec des fractions à 4 ou 5 chiffres…

Hide code cell source
pi = 3.141592653589793238462643383279

borne_inf, borne_sup = [3, 1, 3.], [4, 1, 4.]
for Nb in range(1, 8):
    for q in range(1, int(10**Nb/3)):
        for p in range(int(borne_inf[2]*q), int(borne_sup[2]*q)+1):
            f = p/q
            if f > pi and f < borne_sup[0]/borne_sup[1]:
                borne_sup = [p, q, f]
            if f < pi and f > borne_inf[0]/borne_inf[1]:
                borne_inf = [p, q, f]
    print("-"*80)
    print(f"N = {Nb}")
    print(f"{borne_inf[0]}/{borne_inf[1]} < pi < {borne_sup[0]}/{borne_sup[1]}")
    print(f"{borne_inf[2]:18.16f} < pi < {borne_sup[2]:18.16f}")
    print(f"erreur : {pi-borne_inf[2]:10.3e} - {borne_sup[2]-pi:10.3e}")
--------------------------------------------------------------------------------
N = 1
3/1 < pi < 7/2
3.0000000000000000 < pi < 3.5000000000000000
erreur :  1.416e-01 -  3.584e-01
--------------------------------------------------------------------------------
N = 2
91/29 < pi < 22/7
3.1379310344827585 < pi < 3.1428571428571428
erreur :  3.662e-03 -  1.264e-03
--------------------------------------------------------------------------------
N = 3
1043/332 < pi < 355/113
3.1415662650602409 < pi < 3.1415929203539825
erreur :  2.639e-05 -  2.668e-07
--------------------------------------------------------------------------------
N = 4
10273/3270 < pi < 355/113
3.1415902140672785 < pi < 3.1415929203539825
erreur :  2.440e-06 -  2.668e-07
--------------------------------------------------------------------------------
N = 5
103993/33102 < pi < 104348/33215
3.1415926530119025 < pi < 3.1415926539214212
erreur :  5.779e-10 -  3.316e-10
--------------------------------------------------------------------------------
N = 6
833719/265381 < pi < 312689/99532
3.1415926535810779 < pi < 3.1415926536189365
erreur :  8.715e-12 -  2.914e-11
--------------------------------------------------------------------------------
N = 7
9692294/3085153 < pi < 5419351/1725033
3.1415926535896275 < pi < 3.1415926535898153
erreur :  1.656e-13 -  2.220e-14

2.3. Exercice 3#

Une méthode de parcours de \(\mathbb{N}^N\).

Question

Parcourez et affichez tous les \(N\)-tuples dont les éléments sont des entiers compris entre \(0\) et \(x\) dans l’ordre lexicographique : c’est-à-dire \((0,0,0)\), \((1,0,0)\), \((2, 0, 0)\), \(\ldots\), \((x,0,0)\), \((0, 1, 0)\), \((1, 1, 0)\), \(\ldots\).

Hide code cell source
N = 3
x = 3
terme = [0]*N
lst = [tuple(terme)]
while min(terme) < x:
    for k in range(N):
        if terme[k] < x:
            terme[k] += 1
            terme[:k] = [0]*k
            break
    lst.append(tuple(terme))
print(lst)
[(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (0, 1, 0), (1, 1, 0), (2, 1, 0), (3, 1, 0), (0, 2, 0), (1, 2, 0), (2, 2, 0), (3, 2, 0), (0, 3, 0), (1, 3, 0), (2, 3, 0), (3, 3, 0), (0, 0, 1), (1, 0, 1), (2, 0, 1), (3, 0, 1), (0, 1, 1), (1, 1, 1), (2, 1, 1), (3, 1, 1), (0, 2, 1), (1, 2, 1), (2, 2, 1), (3, 2, 1), (0, 3, 1), (1, 3, 1), (2, 3, 1), (3, 3, 1), (0, 0, 2), (1, 0, 2), (2, 0, 2), (3, 0, 2), (0, 1, 2), (1, 1, 2), (2, 1, 2), (3, 1, 2), (0, 2, 2), (1, 2, 2), (2, 2, 2), (3, 2, 2), (0, 3, 2), (1, 3, 2), (2, 3, 2), (3, 3, 2), (0, 0, 3), (1, 0, 3), (2, 0, 3), (3, 0, 3), (0, 1, 3), (1, 1, 3), (2, 1, 3), (3, 1, 3), (0, 2, 3), (1, 2, 3), (2, 2, 3), (3, 2, 3), (0, 3, 3), (1, 3, 3), (2, 3, 3), (3, 3, 3)]

2.4. Exercice 4#

Vérification qu’une suite est composée d’entiers tous différents

Question

La cellule suivante permet de générer un fichier contenant 10000 entiers assez grands. Proposez un code permettant de répondre rapidement à la question : est-ce que deux de ces entiers sont égaux ?

download the txt file

Nnb = 10000
Nmax = 10000000
filename = 'donnees/tbl1.txt'
print(f"ECRITURE DU FICHIER {filename}")
with open(filename, "w") as f:
    for k in range(Nnb):
        f.write(f"{randint(0, Nmax):d}\n")
ECRITURE DU FICHIER donnees/tbl1.txt
Hide code cell source
# Vérification unicité
dico = {}
filename = 'donnees/tbl1.txt'
with open(filename, 'r') as f:
    for count, line in enumerate(f):
        dico[line] = True
count += 1   # attention, le compteur commence à 0
if count == len(dico):
    print("Les nombres sont tous différents")
else:
    print(f"Il y a quelques répétitions !!! {count - len(dico)}")
Il y a quelques répétitions !!! 3
Hide code cell source
# une autre manière qui utilise les ensembles !
filename = 'donnees/tbl1.txt'
with open(filename, 'r') as f:
    l = f.readlines()
s = set(l)
if len(l) == len(s):
    print("Les nombres sont tous différents")
else:
    print(f"Il y a quelques répétitions !!! {len(l) - len(s)}")
Il y a quelques répétitions !!! 3

2.5. Exercice 5#

Suite de Conway.

La suite de Conway est une suite de nombres (entiers) construite d’une manière non mathématique, en lisant le nombre précédent. Le premier terme est \(u_0=1\). Le second \(u_1=11\) est obtenu en lisant \(u_0\), nombre qui s’écrit un \(1\). Puis \(u_2=21\) car \(u_1\) s’écrit avec deux \(1\).

Voici les premiers termes de la suite, que l’on écrit habituellement sous la forme d’une pyramide :

\[\begin{split}\begin{gathered} 1\\ 11\\ 21\\ 1211\\ 111221\\ 312211\\ 13112221 \end{gathered}\end{split}\]

On peut démontrer facilement que seuls les chiffres \(1\), \(2\) et \(3\) apparaissent dans cette suite.

Questions

  1. Programmez le calcul et l’affichage des 20 premiers termes de la suite.

  2. Pour chacun des termes de la suite, comptez la fréquence d’apparition des chiffres \(1\), \(2\) et \(3\). Affichez ces fréquences pour les 50 premiers termes de la suite. Est-ce conforme avec la théorie qui dit que asymptotiquement ces fréquences doivent converger vers \(50\%\) pour le \(1\), \(31\%\) pour le \(2\) et \(19\%\) pour le \(3\) ?

Hide code cell source
N = 20
u = "1"
print(u)
for _ in range(N):
    v = ""
    chiffre = u[0]
    nb = 1
    for k in range(1, len(u)):
        if u[k] == chiffre:
            nb += 1
        else:
            v += f"{nb}{chiffre}"
            nb = 1
            chiffre = u[k]
    v += f"{nb}{chiffre}"
    u = v
    print(u)
1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211
11131221133112132113212221
3113112221232112111312211312113211
1321132132111213122112311311222113111221131221
11131221131211131231121113112221121321132132211331222113112211
311311222113111231131112132112311321322112111312211312111322212311322113212221
132113213221133112132113311211131221121321131211132221123113112221131112311332111213211322211312113211
11131221131211132221232112111312212321123113112221121113122113111231133221121321132132211331121321231231121113122113322113111221131221
31131122211311123113321112131221123113112211121312211213211321322112311311222113311213212322211211131221131211132221232112111312111213111213211231131122212322211331222113112211
1321132132211331121321231231121113112221121321132122311211131122211211131221131211132221121321132132212321121113121112133221123113112221131112311332111213122112311311123112111331121113122112132113213211121332212311322113212221
11131221131211132221232112111312111213111213211231132132211211131221131211221321123113213221123113112221131112311332211211131221131211132211121312211231131112311211232221121321132132211331121321231231121113112221121321133112132112312321123113112221121113122113121113123112112322111213211322211312113211
311311222113111231133211121312211231131112311211133112111312211213211312111322211231131122211311122122111312211213211312111322211213211321322113311213212322211231131122211311123113223112111311222112132113311213211221121332211211131221131211132221232112111312111213111213211231132132211211131221232112111312211213111213122112132113213221123113112221131112311311121321122112132231121113122113322113111221131221
Hide code cell source
N = 50
u = "1"
for _ in range(N):
    v = ""
    chiffre = u[0]
    nb = 1
    for k in range(1, len(u)):
        if u[k] == chiffre:
            nb += 1
        else:
            v += f"{nb}{chiffre}"
            nb = 1
            chiffre = u[k]
    v += f"{nb}{chiffre}"
    u = v
for k in range(1, 4):
    frequence = 100*u.count(f'{k:d}')/len(u)
    print(f"Fréquence de {k:d} : {frequence}%")
Fréquence de 1 : 49.50173232234053%
Fréquence de 2 : 32.05319198177333%
Fréquence de 3 : 18.445075695886143%

2.6. Exercice 6#

(Tiré du projet Euler)

Le nombre 3797 a une propriété intéressante : il est premier et il est possible de supprimer un à un chacun de ses chiffres en gardant un nombre premier, et cela de la droite vers la gauche ou de la gauche vers la droite. En effet, 3797, 797, 97 et 7 sont premiers, 3797, 379, 37 et 7 sont premiers.

Question

Calculez la somme des 11 nombres qui vérifient cette propriété.

Indication

La réponse est 748317 et vous aurez certainement intérêt à utiliser un crible

Hide code cell source
borne = 10**6
T = [False, False] + [True]*(borne-1)
for p in range(2,borne//2+1):
    if T[p]: # p is a prime number
        T[2*p::p] = [False]*(borne//p-1)

n, compt = 9, 0
S = 0
while compt < 11:
    n += 1
    if T[n]:
        strn = str(n)
        ln = len(strn)
        test = True
        for k in range(1, ln):
            test = test and T[int(strn[k:])] and T[int(strn[:-k])]
        if test:
            compt += 1
            S += n
            print(n, end=' ')
print()
print(S)
23 37 53 73 313 317 373 797 3137 3797 739397 
748317

2.7. Exercice 7#

(Spirale de nombres)

Pour \(N\) un nombre impair, nous pouvons construire un carré de \(N\times N\) cases en plaçant le nombre 1 au centre et en plaçant les nombres suivants en spirales comme dans la représentation suivante (avec \(N=11\)) :

111 112 113 114 115 116 117 118 119 120 121 
110  73  74  75  76  77  78  79  80  81  82 
109  72  43  44  45  46  47  48  49  50  83 
108  71  42  21  22  23  24  25  26  51  84 
107  70  41  20   7   8   9  10  27  52  85 
106  69  40  19   6   1   2  11  28  53  86 
105  68  39  18   5   4   3  12  29  54  87 
104  67  38  17  16  15  14  13  30  55  88 
103  66  37  36  35  34  33  32  31  56  89 
102  65  64  63  62  61  60  59  58  57  90 
101 100  99  98  97  96  95  94  93  92  91

Questions

  1. Proposez un script permettant d’afficher le carré de taille \(N\) impair quelconque. Prenez soin en particulier à fixer une taille de case permettant de mettre tous les nombres (sans décalage).

  2. Pour \(N\) un entier impair donné, calculez la somme de tous les termes des deux diagonales du carré. Que vaut cette somme pour \(N=1001\), puis \(N=10001\) (Attention à la taille du carré…).

Hide code cell source
N = 21  # Un nombre entier impair !!!
T = [[0 for _ in range(N)] for _ in range(N)]
n = N//2
compt, i, j = 1, n, n
T[i][j] = compt
for level in range(1, n+1):  # distance au centre
    j += 1
    i -= 1
    for _ in range(2*level):  # droit vers le bas
        i += 1
        compt += 1
        T[i][j] = compt
    for _ in range(2*level):  # bas vers la gauche
        j -= 1
        compt += 1
        T[i][j] = compt
    for _ in range(2*level):  # gauche vers le haut
        i -= 1
        compt += 1
        T[i][j] = compt
    for _ in range(2*level):  # haut vers la droite
        j += 1
        compt += 1
        T[i][j] = compt
Hide code cell source
size = len(f"{compt}")
for Tk in T:
    for Tkl in Tk:
        print(f"{Tkl:{size}d} ", end='')
    print()
421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 
420 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 
419 342 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 363 
418 341 272 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 291 364 
417 340 271 210 157 158 159 160 161 162 163 164 165 166 167 168 169 170 227 292 365 
416 339 270 209 156 111 112 113 114 115 116 117 118 119 120 121 122 171 228 293 366 
415 338 269 208 155 110  73  74  75  76  77  78  79  80  81  82 123 172 229 294 367 
414 337 268 207 154 109  72  43  44  45  46  47  48  49  50  83 124 173 230 295 368 
413 336 267 206 153 108  71  42  21  22  23  24  25  26  51  84 125 174 231 296 369 
412 335 266 205 152 107  70  41  20   7   8   9  10  27  52  85 126 175 232 297 370 
411 334 265 204 151 106  69  40  19   6   1   2  11  28  53  86 127 176 233 298 371 
410 333 264 203 150 105  68  39  18   5   4   3  12  29  54  87 128 177 234 299 372 
409 332 263 202 149 104  67  38  17  16  15  14  13  30  55  88 129 178 235 300 373 
408 331 262 201 148 103  66  37  36  35  34  33  32  31  56  89 130 179 236 301 374 
407 330 261 200 147 102  65  64  63  62  61  60  59  58  57  90 131 180 237 302 375 
406 329 260 199 146 101 100  99  98  97  96  95  94  93  92  91 132 181 238 303 376 
405 328 259 198 145 144 143 142 141 140 139 138 137 136 135 134 133 182 239 304 377 
404 327 258 197 196 195 194 193 192 191 190 189 188 187 186 185 184 183 240 305 378 
403 326 257 256 255 254 253 252 251 250 249 248 247 246 245 244 243 242 241 306 379 
402 325 324 323 322 321 320 319 318 317 316 315 314 313 312 311 310 309 308 307 380 
401 400 399 398 397 396 395 394 393 392 391 390 389 388 387 386 385 384 383 382 381 
Hide code cell source
S = 0
for k in range(N):
    S += T[k][k]
    S += T[k][N-k-1]
S -= T[N//2][N//2]
print(S)
6421

Calcul de la somme S

Nous noterons \(N=2n+1\) puisque \(N\) est impair et supérieur à \(1\). Les nombres vont de \(1\) à \(N^2=(2n+1)^2\).

Au niveau 0, il y a seulement le terme 1.

A partir du 1er niveau, nous ajoutons 4 termes. Si on note \(k\) le niveau, il y a \((2k-1)^2+2k\), \((2k-1)^2+4k\), \((2k-1)^2+6k\) et \((2k-1)^2+8k=(2k+1)^2\). La somme vaut donc

\[\begin{split} \begin{aligned} S &= 1 + \sum_{k=1}^n \Bigl( (2k-1)^2 + 2k + (2k-1)^2 + 4k + (2k-1)^2 + 6k + (2k-1)^2 + 8k \Bigr) \\ &= 1 + 4 \sum_{k=1}^n ( (2k-1)^2 + 5k) = 1 + 4\sum_{k=1}^n (4k^2 + k + 1)\\ &= 1 + \frac{16}{6}n(n+1)(2n+1) + 2 n(n+1) + 4n. \end{aligned} \end{split}\]
Hide code cell source
for N in [11, 101, 1001, 10001, 100001]:
    n = N // 2
    S = 1+4*n+2*n*(n+1)+16*n*(n+1)*(2*n+1)//6
    print(f"Pour N = {N:6d}, S = {S}")
Pour N =     11, S = 961
Pour N =    101, S = 692101
Pour N =   1001, S = 669171001
Pour N =  10001, S = 666916710001
Pour N = 100001, S = 666691667100001