Cliquez sur cette invitation pour récupérer le repository du TP.
Combien de fois une feuille de papier d’épaisseur $e=0,1$ mm doit-elle être pliée pour atteindre la Lune ?
Écrivez dans la cellule suivante un code permettant d’obtenir la réponse. Le plus simple est d’utiliser une boucle
while
.
Wolfram alpha vous donne avec précision la distance Terre-Lune.
### VOTRE CODE
e = 0.1e-3 D_TL = 385e6 ep_tot = e nb_plis = 0 while ep_tot < D_TL: nb_plis += 1 ep_tot *= 2 print(nb_plis)
Dans la cellule suivante, affectez à la variable
nb_plis
la valeur entière trouvée.
nb_plis = 0
42
Complétez le code de la fonction
palindrome
pour qu’il retourne un booléen valantTrue
si la chaîne de caractères passée en argument est bien un palindrome etFalse
sinon.
def palindrome(chaine):
"""
palindrome(chaine: string) -> test: bool
précondition: chaine est une chaine de caractères
postcondition: si chaine est un palindrome, test vaut True, et False sinon.
"""
### VOTRE CODE
return test
def palindrome(chaine): test = chaine == chaine[::-1] return test
Une liste peut être utilisée comme une représentation simple d’un polynôme, $P(x)$, où les éléments sont les coefficients des puissances de $x$ successives et les indices sont les puissances elles-mêmes. Ainsi le polynôme
$P(x)=3+6x+2x^3$ sera représenté par la liste [3,6,0,2]
.
L’exécution du code de la cellule suivante ne donne pas le résultat attendu. Il est sensé donné la liste représentant le polynôme dérivé $P’(x)$.
Corrigez-le afin de rendre le retour affiché correct.
P = [3, 6, 0, 2]
dPdx = []
i = 0
for c in P:
i += 1
dPdx.append(i*c)
dPdx
[3, 12, 0, 8]
Il suffit de parcourir les éléments de $P$ en sautant le premier.
Pour cela, on peut remplacerfor c in P:
parfor c in P[1:]:
.
On obtient bien alors[6,0,6]
.
L’algorithme de Luhn est une formule de somme de contrôle permettant de valider un numéro de carte bancaire. On considère le numéro de carte comme une suite de nombres à 1 chiffre.
Compléter la fonction suivante permettant de vérifier un numéro de carte.
def verifcarte(numero):
"""
verifcarte(numero: string) -> bool
précondition: numéro est une chaîne de caractères (par exemple '1205 1205 1205 1205')
postcondition: la fonction retourne vrai si le numéro est valide et faux sinon
"""
num = ''
for c in numero:
if c in '0123456789':
num += c # permet de sauter les espaces ou tirets
assert len(num)==16, 'Le numéro ne contient pas 16 chiffres'
### VOTRE CODE
def verifcarte(numero): num = '' for c in numero: if c in '0123456789': num += c assert len(num)==16, 'Le numéro ne contient pas 16 chiffres' num_1 = num[::-1] num_2 = '' for i in range(1,len(num_1),2): p = int(num_1[i])*2 if p < 10: num_2 += str(p) else: s = int(str(p)[0])+int(str(p)[1]) # cela revient à faire p-9 num_2 += str(s) S = 0 for c in num_2: S += int(c) if S%10 == 0: return True else: return False
# Pour tester votre fonction
num = '0000 0000 0000 9258'
verifcarte(num)
La suite de Syracuse est une suite d’entiers naturels définie de la manière suivante :
on part d’un nombre entier plus grand que zéro ;
En répétant l’opération, on obtient une suite d’entiers positifs dont chacun ne dépend que de son prédécesseur.
Lorsque 1 est atteint, un cycle de longueur 3 se répète sans fin : 1, 4, 2, 1, 4, 2, 1,…
On ajoute donc une nouvelle règle :
Appelons temps de vol le nombre de termes de la suite.
Construisez une fonction qui renvoie le temps de vol correspondant à une entrée donnée.
def tpsdevol(nombre):
"""
tpsdevol(nombre: int) -> T: int
précondition: nombre est un entier positif
"""
### VOTRE CODE
return T
def tpsdevol(nombre): tps = 0 while nombre != 1: tps += 1 if nombre%2 == 0: nombre //= 2 else: nombre = 3*nombre+1 return tps
La conjecture de Syracuse (ou Collatz) dit que toutes les suites de Syracuse ont une fin.
Confirmons la conjecture pour tous les entiers inférieurs à 100 grâce à votre fonction.
import matplotlib.pyplot as plt
plt.style.use('seaborn')
plt.figure(figsize=(15,8),dpi=150)
X = [i for i in range(1,100)]
T = []
for x in X:
T.append(tpsdevol(x))
plt.plot(X,T)
plt.xlabel('nombre de départ')
plt.ylabel('temps de vol')
Malgré son allure enfantine, la conjecture de syracuse a résisté (et résiste encore aujourd'hui) aux plus brillants mathématiciens ayant essayé de la démontrer.