learning python and exerccies, Exercises of Information Systems

some files about exercices in python

Typology: Exercises

2019/2020

Uploaded on 06/25/2020

Saij
Saij 🇲🇦

1 document

1 / 6

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
Chapitre 2 informatique commune
Corrigé des exercices
Exercice 1 Montrons que la fonction fretourne un résultat pour tout nN.
Ceci est clair pour n>101.
Si
n~
90
,
100
,
f
(
n
+11) =
n
+1 car
n
+11
>
101, donc
f
(
n
) =
f
(
n
+1). On en déduit que
f
(
n
) =
f
(101) = 91,
et fest donc bien définie et constante égale à 91 sur ~90,100.
Si
n~
0
,
89
, il existe
pN
tel que 90
6n
+11
p6
100. Alors
f
(
n
) =
f··· f
| {z }
pfois
(
n
+11
p
) =
f··· f
| {z }
p1 fois
(91) = 91.
fest donc définie sur ~0,89et constante égale à 91 sur cet intervalle.
Cette fonction est connue sous le nom de fonction 91 de McCarthy.
Exercice 2 Montrons par récurrence sur nque g(n) est calculable et que g(n)~0,n.
C’est clair si n= 0.
Si
n >
0, supposons le résultat acquis jusqu’au rang
n
1. Pour tout
k~
0
, n
1
,
g
(
k
) est donc calculable
et g(k)~0, n 1.
En particulier,
g
(
g
(
n
1)) est calculable et
g
(
g
(
n
1))
~
0
, n
1
. On en déduit que
g
(
n
) est calculable, et
que g(n)~1,n~0,n.
Montrons maintenant par récurrence sur nNque g(n) = n+ 1
α, avec α=1 + 5
2.
C’est clair si n= 0 car α>1 donc b1/αc= 0.
Si
n >
0, supposons le résultat acquis jusqu’au rang
n
1. En posant
p
=
g
(
n
1), on a donc par hypothèse
de récurrence :
p=n
αet g(n) = np+ 1
α=np+ 1
α
Sachant que p6n
α< p + 1 et que α1
α= 1, on obtient l’encadrement : p1
α
6np+ 1
α< p + 1.
Sachant que 0 <1
α<1, on a donc : p1< n p+ 1
α< p + 1 et p < n+1
α< p + 2.
Traitons alors deux cas.
Si n+ 1
α< p + 1, alors n+ 1
α=pet np+ 1
α<α1
α(p+ 1) 1 = pdonc np+ 1
α=p.
Si n+ 1
α> p + 1, alors n+ 1
α=p+ 1 et np+ 1
α>α1
α(p+ 1) 1 = pdonc np+ 1
α=p+ 1.
(On ne peut avoir l’égalité n+ 1
α=p+ 1 car αest irrationnel.)
Dans les deux cas, on a bien np+ 1
α=n+ 1
α, soit g(n) = n+ 1
α.
Exercice 3
Si
n
= 0 ou
n
= 1 il n’y a rien à calculer; si
n>
2 on a
bn/
2
c< n
et
dn/
2
e< n
, ce qui assure la
terminaison de la fonction. D’où :
def power(a, n):
if n == 0:
return 1
elif n == 1:
return a
return power(a, n//2) *power(a, nn//2)
Notons C(n) le nombre de multiplications effectuées pour calculer an. On dispose des relations :
C(0) = C(1) = 0 et C(n) = C(bn/2c) + C(dn/2e) + 1.
Montrons par récurrence sur n>1 que C(n) = n1 :
Jean-Pierre Becirspahic
pf3
pf4
pf5

Partial preview of the text

Download learning python and exerccies and more Exercises Information Systems in PDF only on Docsity!

Chapitre 2

informatique commune

Corrigé des exercices

Exercice 1 (^)  Montrons que la fonction f retourne un résultat pour tout n ∈ N.

  • Ceci est clair pour n > 101.
  • Si n ∈ ~ 90 , 100 , f ( n +11) = n +1 car n +11 > 101, donc f ( n ) = f ( n +1). On en déduit que f ( n ) = f (101) = 91, et f est donc bien définie et constante égale à 91 sur ~ 90 , 100 .
  • Si n ∈ ~ 0 , 89 , il existe p ∈ N∗^ tel que 90 6 n +11 p 6 100. Alors f ( n ) = f ◦ · · · ◦ f ︸ ︷︷ ︸ p fois

( n +11 p ) = f ◦ · · · ◦ f ︸ ︷︷ ︸ p − 1 fois

f est donc définie sur ~ 0 , 89  et constante égale à 91 sur cet intervalle. Cette fonction est connue sous le nom de fonction 91 de McCarthy.  

Exercice 2 (^)  Montrons par récurrence sur n que g ( n ) est calculable et que g ( n ) ∈ ~ 0 , n .

  • C’est clair si n = 0.
  • Si n > 0, supposons le résultat acquis jusqu’au rang n − 1. Pour tout k ∈ ~ 0 , n − 1 , g ( k ) est donc calculable et g ( k ) ∈ ~ 0 , n − 1 . En particulier, g ( g ( n − 1)) est calculable et g ( g ( n − 1)) ∈ ~ 0 , n − 1 . On en déduit que g ( n ) est calculable, et que g ( n ) ∈ ~ 1 , n  ⊂ ~ 0 , n .

Montrons maintenant par récurrence sur n ∈ N que g ( n ) =

⌊ (^) n + 1 α

, avec α =

  • C’est clair si n = 0 car α > 1 donc b 1 / αc = 0.
  • Si n > 0, supposons le résultat acquis jusqu’au rang n − 1. En posant p = g ( n − 1), on a donc par hypothèse de récurrence : p =

⌊ (^) n α

et g ( n ) = n

⌊ (^) p + 1 α

np + 1 α

Sachant que p 6 n α < p + 1 et que α −

α = 1, on obtient l’encadrement : p

α 6 np + 1 α < p + 1.

Sachant que 0 <^1 α < 1, on a donc : p − 1 < np^ + 1 α < p + 1 et p < n^ + 1 α < p + 2. Traitons alors deux cas.

  • Si n + 1 α < p^ + 1, alors

⌊ (^) n + 1 α

= p et np + 1 α <^

α −

α

( p + 1) − 1 = p donc

np + 1 α

= p.

  • Si n + 1 α > p + 1, alors

⌊ (^) n + 1 α

= p + 1 et np + 1 α

α −

α

( p + 1) − 1 = p donc

np + 1 α

= p + 1.

(On ne peut avoir l’égalité n + 1 α = p + 1 car α est irrationnel.)

Dans les deux cas, on a bien

np + 1 α

⌊ (^) n + 1 α

, soit g ( n ) =

⌊ (^) n + 1 α

Exercice 3 (^)  Si n = 0 ou n = 1 il n’y a rien à calculer ; si n > 2 on a b n/ 2 c < n et d n/ 2 e < n , ce qui assure la terminaison de la fonction. D’où :

def power(a, n): if n == 0: return 1 elif n == 1: return a return power(a, n//2) * power(a, n−n//2)

Notons C( n ) le nombre de multiplications effectuées pour calculer an. On dispose des relations :

C(0) = C(1) = 0 et C( n ) = C(b n/ 2 c) + C(d n/ 2 e) + 1_._

Montrons par récurrence sur n > 1 que C( n ) = n − 1 :

Jean-Pierre Becirspahic

2.2 informatique commune

  • c’est clair si n = 1 ou n = 2 ;
  • si n > 3, supposons l’hypothèse de récurrence vérifiée jusqu’au rang n − 1. Alors :

C( n ) = b n/ 2 c − 1 + d n/ 2 e − 1 + 1 = n − 1

ce qui prouve le résultat au rang n.

Autrement dit, cette version n’apporte rien comparé à un algorithme qui exploiterait la relation : an^ = a × an −^1. Cependant, la remarque de l’énoncé permet de modifier la fonction initiale pour écrire : def power(a, n): if n == 0: return 1 elif n == 1: return a x = power(a, n//2) if n % 2 == 0: return x * x else : return x * x * a

On dispose cette fois des relations : C(0) = C(1) = 0 et C(b n/ 2 c) + 1 6 C( n ) 6 C(b n/ 2 c) + 2. Montrons par récurrence sur n > 1 que C( n ) 6 2 log n :

  • c’est clair si n 6 2 car C(2) = 1 ;
  • si n > 3, supposons le résultat acquis jusqu’au rang n − 1. Alors :

C( n ) 6 2 logb n/ 2 c + 2 6 2 log( n/ 2) + 2 = 2 log n

ce qui prouve le résultat au rang n.

Ainsi, cet algorithme est de coût logarithmique ; il porte le nom d’algorithme d’ exponentiation rapide.

 

Exercice 4

def numerote(x, y): if x == 0 and y == 0: return 0 if y > 0: return 1 + numerote(x+1, y−1) return 1 + numerote(0, x−1)

def reciproque(n): if n == 0: return (0, 0) (x, y) = reciproque(n−1) if x > 0: return (x−1, y+1) return (y+1, 0)

Exercice 5 a) Considérons la valeur minimale tk du tableau. Si k = 0 alors t 1 = t 0 donc t 1 est un minimum local ; si k = n − 1 alors tn − 2 = tn − 1 donc tn − 2 est un minimum local. Dans les autres cas tk est un minimum local. b) On procède à une recherche dichotomique en considérant tk avec k = b n/ 2 c :

  • si tk 6 tk − 1 et tk 6 tk +1, tk est un minimum local ;
  • si tk > tk − 1 , le tableau t [0 · · · k ] possède la même propriété que le tableau initial donc la recherche peut s’y poursuivre ;
  • de même, si tk > tk +1 la recherche se poursuit dans t [ k · · · n − 1].

2.4 informatique commune

Exercice 7 (^)  Une version simple (mais peu économique) de définir la fonction circle consiste à écrire :

import matplotlib.pyplot as plt import numpy as np def circle(coords, r): X, Y = [], [] for t in range (101): X.append(coords[0]+rnp.cos(tnp.pi/50)) Y.append(coords[1]+rnp.sin(tnp.pi/50)) plt.plot(X, Y, 'b')

On peut alors définir récursivement la fonction bubble1 de la façon suivante :

def bubble1(n, x=0, y=0, r=8): circle([x, y], r) if n > 1: bubble1(n−1, x+3*r/2, y, r/2) bubble1(n−1, x, y− 3 *r/2, r/2)

Pour définir la fonction bubble2, on ajoute un paramètre supplémentaire qui indique la direction (nord, ouest, sud, est) de l’expansion.

def bubble2(n, x=0, y=0, r=8, d=''): circle([x, y], r) if n > 1: if d != 's': bubble2(n−1, x, y+3r/2, r/2, 'n') if d != 'w': bubble2(n−1, x+3r/2, y, r/2, 'e') if d != 'n': bubble2(n−1, x, y− 3 *r/2, r/2, 's') if d != 'e': bubble2(n−1, x− 3 *r/2, y, r/2, 'w')

Exercice 8 (^)  On peut définir la fonction polygon à l’aide de la fonction fill qui colorie l’intérieur d’une ligne polygonale :

def polygon(*args): X, Y = [], [] for arg in args: X.append(arg[0]) Y.append(arg[1]) plt.fill(X, Y, 'b')

Pour obtenir les approximations souhaitées du triangle de Sierpiński on définit alors la fonction suivante :

Corrigé des exercices 2.

from numpy import sqrt

def sierpinski(n, a=[0, 0], b=[1, 0], c=[.5, sqrt(3)/2]): if n == 1: polygon(a, b, c) else : u = [(b[0]+c[0])/2, (b[1]+c[1])/2] v = [(c[0]+a[0])/2, (c[1]+a[1])/2] w = [(a[0]+b[0])/2, (a[1]+b[1])/2] sierpinski(n−1, a, w, v) sierpinski(n−1, w, b, u) sierpinski(n−1, v, u, c)

a (^) b

c

v u

w

Figure 1 – La position relative des points u, v, w en fonction de a, b, c.

Figure 2 – Le résultat de bubble2(7).

Jean-Pierre Becirspahic