Vous êtes sur la page 1sur 5

MPSI Devoir Surveillé N° 1 – Deuxième Trimestre

Vendredi 22 Janvier 2021


Durée : 1h30 heures

Problème I : Les nombres premiers (10 points)

Question 1 :

Un nombre premier est un nombre qui a exactement 2 diviseurs qui sont 1 et lui-même. Ainsi 2, 3 ,5
,7, 11 sont des nombres premiers mais 4, 6, 9 n'en sont pas.

Ecrire une fonction « premier(n) » qui renvoie True si l’entier n est premier.

Exemples :
premier(17) retourne True
premier(10) retourne False

def premier(n):
flag = True
for i in range(2, n):
if n%i==0 :
return False
return True

Question 2 :

Écris une fonction nombre_premier_apres(n) qui renvoie le premier nombre premier p supérieur ou
égal à n.
Par exemple, le premier nombre premier après n = 60 est p = 61

def nombre_premier_apres(n):
i=n
while not premier(i):
i=i+1
return i

Question 3 :

Deux nombres premiers p et p + 2 sont appelés nombres premiers jumeaux. Écris une fonction
nombres_jumeaux_apres(n) qui affiche le premier couple p, p+2 de nombres premiers jumeaux,
avec p > n.
Par exemple, le premier couple de nombres premiers jumeaux après n = 60 est p = 71 et p + 2 = 73

1
def nombres_jumeaux_apres(n):
i = n+1
while not premier(i) or not premier(i+2) :
i=i+1
print(i, i+2)

Question 4 :

Un entier p est un nombre premier de Germain si p et 2p + 1 sont des nombres premiers. Écris une
fonction nombre_germain_apres(n) qui affiche le couple p, 2p + 1 où p est le premier nombre
premier de Germain p > n.
Par exemple, le premier nombre premier de Germain après n = 60 est p = 83 avec 2p + 1 = 167

def nombre_germain_apres(n):
i = n+1
while not premier(i) or not premier(2*i+1) :
i=i+1
print(i, 2*i+1)

Question 5 :

Un nombre premier N est dit circulaire s’il vérifie la propriété suivante : chacune des rotations de ses
chiffres d’un élément vers la droite, forme à son tour un nombre premier

Exemples :
N=719 est un nombre premier circulaire car 719, 971 et 197 sont des nombres premiers.
N=23, N n’est pas un nombre premier circulaire car il est premier mais 32 ne l’est pas.
N=6102, N n’est pas un nombre premier circulaire car il n’est pas premier.

Ecrire une fonction est_circulaire( n ) qui vérifier si n est un nombre premier circulaire.

def nbre_chiffres(n):
if n==0 : return 1
c=0
while n!=0 :
n=n//10
c=c+1
return c

def rotation(n):
r = n%10
n = n//10
b = nbre_chiffres(n)
n = n + r*10**b
return n
2
def est_circulaire( n ):
if not premier(n) :
return False
a=n
a = rotation(a)
while a!=n :
if not premier(a) :
return False
a = rotation(a)
return True

Question 3 :

Ecrire une fonction liste_circulaires(a,b) qui retourne la liste des nombres circulaires dans un
intervalle [a, b].

def liste_circulaire(a,b):
for i in range(a, b+1):
if est_circulaire(i):
print(i)

Problème II : Primes (5 points)

C’est le mercato et un attaquant est convoité par deux clubs F et G qui lui proposent le même
salaire mensuel mais des systèmes différents pour les primes par but marqué :

Le club F lui propose une prime de 8 000 euros par but marqué pour les dix premiers buts
marqués puis de 11 300 euros par but marqué à partir du onzième but.

Le club G lui propose une prime de 10 000 euros par but marqué quel que soit le nombre de
buts inscrits.

1. Si l’attaquant inscrit 12 buts lors de la prochaine saison, dans quel club touchera-t-il la
prime la plus importante ? Justifier la réponse.

Pour 12 buts marqués, le club G est plus intéressant car : avec le club F il aura 102600, et
avec le club G il aura 120000

2. Écrire des fonctions F(n) et G(n) qui retournent respectivement les montants des
primes offertes par les clubs F et G en fonction du nombre n de buts marqués.

3
def F(n):
if n <= 10:
return 8000 * n
else:
return 80000 + 11300 *(n - 10)

def G(n):
return 10000 * n

3. Écrire une fonction seuil( ) qui détermine le nombre de buts que doit marquer
l’attaquant pour que le montant de la prime offerte par le club F soit la plus
intéressante.

def seuil():
n=0
while F(n) <= G(n):
n=n+1
return n

Problème III : Attente moyenne (5 points)

On lance un dé équilibré à six faces numérotées de 1 à 6.

Le code Python ci-dessous permet d'afficher la face supérieure du dé lors de dix lancers successifs
d'un dé à 6 faces. On commence par importer la fonction randint du module random. Cette fonction
prend deux paramètres : par exemple randint(1, 6) retourne un entier aléatoire compris entre 1 et 6,
les bornes sont incluses.

from random import randint


for k in range(10):
print(randint(1, 6))

1. Écrire une fonction moyenneDe(n) qui retourne la valeur moyenne des faces obtenues sur
un échantillon de n lancers.

def moyenneDe(n):
s=0
for k in range(n):
s = s + randint(1, 6)
return s / n

4
2. Écrire une fonction premier6() qui retourne le rang du premier 6 obtenu lorsqu'on lance
successivement le dé.

def premier6() :
de = randint(1,6)
compteur = 1
while de != 6 :
de = randint(1,6)
compteur = compteur + 1
return compteur

3. Écrire une fonction attente( ) qui utilise la fonction précédente 10000 fois et calcule et
retourne le temps d'attente moyen du 6 pour cet échantillon de taille 10000.

def attente( ):
s=0
for k in range(10000) :
s = s + premier6()
return s/10000

Vous aimerez peut-être aussi