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
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 fichierdonnes/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)
Show 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
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.
Show 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
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.
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
.
Show 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
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.
Essayez d’affiner votre recherche afin de calculer rapidement le meilleur encadrement avec des fractions à 4 ou 5 chiffres…
Show 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\).
Show 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 ?
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
Show 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
Show 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 :
On peut démontrer facilement que seuls les chiffres \(1\), \(2\) et \(3\) apparaissent dans cette suite.
Questions
Programmez le calcul et l’affichage des 20 premiers termes de la suite.
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\) ?
Show 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
Show 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
Show 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
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).
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é…).
Show 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
Show 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
Show 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
Show 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