Représentation des entiers naturels

Système de numération à position dans une base

Exercice 1

Ecriture décimale de l'entier dont l'écriture en base 5 est \(4021_{5}\) puis celle de l'entier dont l'écriture en base 2 est \(101_{2}\)

In [1]:
print(1+2*5**1+4*5**3)
print(1+1*2**2)
    
511
5

In [2]:
def convert(n,b,verbose=False):
    """retourne sous forme de tableau l'écriture en base b de  l'entier n écrit en base 10"""
    t = []
    if n==0:
        return [0]
    while n>0:
        quotient, reste = n//b,n%b
        if verbose:
            print("%s=%s*%s+%s"%(n,quotient,b,reste))
        t.append(reste)
        n = quotient
    #on renverse le tableau des restes successifs
    t.reverse()
    return t

#conversion en base 2
b = 2
for i in [0,7,34,128]:
    print("L'écriture en base %s de %s est %s"%(b,i,convert(i,b)))

#conversion en base 5
b = 5
for i in [0,7,34,128]:
    print("L'écriture en base %s de %s est %s"%(b,i,convert(i,b))) 

print() 
print("Détail de l'algorithme des divisions successives pour la conversion de 34 en base 2")
print() 
print(convert(34,2,verbose=True))

print()
print("Détail de l'algorithme des divisions successives pour la conversion de 34 en base 5")
print() 
print(convert(34,5,verbose=True))


          
L'écriture en base 2 de 0 est [0]
L'écriture en base 2 de 7 est [1, 1, 1]
L'écriture en base 2 de 34 est [1, 0, 0, 0, 1, 0]
L'écriture en base 2 de 128 est [1, 0, 0, 0, 0, 0, 0, 0]
L'écriture en base 5 de 0 est [0]
L'écriture en base 5 de 7 est [1, 2]
L'écriture en base 5 de 34 est [1, 1, 4]
L'écriture en base 5 de 128 est [1, 0, 0, 3]

Détail de l'algorithme des divisions successives pour la conversion de 34 en base 2

34=17*2+0
17=8*2+1
8=4*2+0
4=2*2+0
2=1*2+0
1=0*2+1
[1, 0, 0, 0, 1, 0]

Détail de l'algorithme des divisions successives pour la conversion de 34 en base 5

34=6*5+4
6=1*5+1
1=0*5+1
[1, 1, 4]

Exercice 2

In [3]:
def nbchiffres(n):
    """Retourne le nombre de chiffres dans l'écriture en base 10 d'un entier"""
    c = 1
    n = n//10
    while n>=1:
        n = n//10
        c += 1
    return c

for i in [0,9,22,99,100,999,1001]:
    print('Nombre de chiffres en base 10 de %s : %s'%(i,nbchiffres(i)))
    
Nombre de chiffres en base 10 de 0 : 1
Nombre de chiffres en base 10 de 9 : 1
Nombre de chiffres en base 10 de 22 : 2
Nombre de chiffres en base 10 de 99 : 2
Nombre de chiffres en base 10 de 100 : 3
Nombre de chiffres en base 10 de 999 : 3
Nombre de chiffres en base 10 de 1001 : 4

In [4]:
def base5to10(n):
    """Retourne l'écriture en base 10 d’un entier entré par l’utilisateur en base 5"""
    #on récupère les chiffres sous forme de chaine
    chiffres = str(n)
    L = len(chiffres)
    decimal = 0
    for i in range(L):
        decimal += int(chiffres[L-1-i])*5**i
    return decimal

for i in [0,1,12,21,10,11,100,102]:
    print("%s en base 5 s'écrit %s en base 10"%(i,base5to10(i)))
    
        
0 en base 5 s'écrit 0 en base 10
1 en base 5 s'écrit 1 en base 10
12 en base 5 s'écrit 7 en base 10
21 en base 5 s'écrit 11 en base 10
10 en base 5 s'écrit 5 en base 10
11 en base 5 s'écrit 6 en base 10
100 en base 5 s'écrit 25 en base 10
102 en base 5 s'écrit 27 en base 10

In [7]:
def base5to10horner(n):
    """prend en argument un entier naturel n écrit en base 5
    et qui retourne son écriture en base 5.
    Meme principe que la fonction base5to10 mais moins de multiplications (algorith d'Horner)"""
    chiffres = str(n)  
    decimal = 0
    for c in chiffres:
        decimal = int(c) + decimal*5
    return decimal
    

for i in [0,1,12,21,10,11,100,102]:
    print("%s en base 5 s'écrit %s en base 10"%(i,base5to10horner(i)))
0 en base 5 s'écrit 0 en base 10
1 en base 5 s'écrit 1 en base 10
12 en base 5 s'écrit 7 en base 10
21 en base 5 s'écrit 11 en base 10
10 en base 5 s'écrit 5 en base 10
11 en base 5 s'écrit 6 en base 10
100 en base 5 s'écrit 25 en base 10
102 en base 5 s'écrit 27 en base 10

Numération en base 2

Exercice 3

1)Si on code les entiers successifs sur un octet à partir de \(0\), quel est le plus grand entier qu'on peut représenter ?

réponse : \(2^8-1=255\)

2)Calculer le nombre d'états possibles pour un mot de 32 bits, puis pour un mot de 64 bits.

réponses : \(2^{32}-1=4294967295\) et \(2^{64}-1=18446744073709551615\)

3)Si on considère qu'une adresse mémoire permet d'adresser un bloc de \(4\) Kio. Quel volume maximal (en Tio) permet d'adresser un mot de 32 bits ? de 64 bits ?

réponses : \(2^{32}\times 4\times 2^{10}=2^{44}\) octets soit \(2^4\) Tio et \(2^{64}\times 4\times 2^{10}=2^{76}\) octets soit \(2^{36}\) Tio (soit \(2^{32}\) fois plus)

  1. Un disque dur a une capacité de 500 Go. Exprimer cette capacité en Gio.

réponse : 1 Go correspond à \(10^{9}\) octets et 1 Gio correspond à \(2^{10}\) octets donc 1 Go \(\approx\) 0.9313 Gio donc 500 Go \(\approx 500 \times 0,9313 \approx 466\) Gio

  1. Sachant qu'une minute de musique au format mp3 occupe un espace de 1 Mo, combien d'heures de musique peut-on stocker sur un baladeur de 18 Go.

réponse : 1 heure = 60 minutes \(\approx\) 60 Mo et le baladeur a une capacité de 18 Go soit 18000 Mo.

Le baladeur peut donc stocker \(\frac{18000}{60}=300\) heures de musique.

  1. Avec un débit de 80 Mbits/s, combien de temps faut-il pour télécharger un fichier de 1,8 Go ?

réponse : 8 Mbits = 1 Mo donc 80 Mbits/s = 10 Mo/s donc =180$ secondes soit 3 minutes.

d)En mode Truecolor la couleur d'un pixel est donnée par un triplet (R,V,B) donnant les nuances de rouge, vert et bleu, chacune codée sur un octet. Calculer le nombre de couleurs possibles en Truecolor.

réponse : \(\left(2^{8}\right)^{3}=2^{24}=16777216\) de couleurs soit environ 17 millions de couleurs.

In [37]:
2**24
Out[37]:
16777216

Exercice 6

In [5]:
def convert(n,b,verbose=False):
    """retourne sous forme de tableau l'écriture en base b de  l'entier n écrit en base 10"""
    t = []
    if n==0:
        return [0]
    while n!=0:
        quotient, reste = n//b,n%b
        if verbose:
            print("%s=%s*%s+%s"%(n,quotient,b,reste))
        t.append(reste)
        n = quotient
    #on renverse le tableau des restes successifs
    t.reverse()
    return t

b=2
for i in [0,7,9,35,255,512,1025]:
    print("L'écriture en base %s de %s est %s"%(b,i,convert(i,b)))
    
L'écriture en base 2 de 0 est [0]
L'écriture en base 2 de 7 est [1, 1, 1]
L'écriture en base 2 de 9 est [1, 0, 0, 1]
L'écriture en base 2 de 35 est [1, 0, 0, 0, 1, 1]
L'écriture en base 2 de 255 est [1, 1, 1, 1, 1, 1, 1, 1]
L'écriture en base 2 de 512 est [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
L'écriture en base 2 de 1025 est [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

In [6]:
#bin convertit un entier en base 2 (retourne une chaine)
help(bin)
a = bin(9)
print(a)
#int convertit une chaine en entier dans la base souhaitée
b = int(a,2)
print(b)
Help on built-in function bin in module builtins:

bin(...)
    bin(number) -> string
    
    Return the binary representation of an integer.
    
       >>> bin(2796202)
       '0b1010101010101010101010'

0b1001
9

In [7]:
def len2b(n):
    """prend en argument un entier naturel n écrit en base 10
    et retourne la longueur de son écriture en  base 2
    Meme code que la fonction nbchiffres de l'exo 1 qui retournait le nombre de chiffres en base 10"""
    c = 1
    n = n//2
    while n>=1:
        n = n//2
        c += 1
    return c

for i in [0,7,8,31,32,255,256]:
    print("Nombre de chiffres en base 2 de %s : %s \n\
Vérification : bin(%s)=%s \n"%(i,len2b(i),i,bin(i)))
           
Nombre de chiffres en base 2 de 0 : 1 
Vérification : bin(0)=0b0 

Nombre de chiffres en base 2 de 7 : 3 
Vérification : bin(7)=0b111 

Nombre de chiffres en base 2 de 8 : 4 
Vérification : bin(8)=0b1000 

Nombre de chiffres en base 2 de 31 : 5 
Vérification : bin(31)=0b11111 

Nombre de chiffres en base 2 de 32 : 6 
Vérification : bin(32)=0b100000 

Nombre de chiffres en base 2 de 255 : 8 
Vérification : bin(255)=0b11111111 

Nombre de chiffres en base 2 de 256 : 9 
Vérification : bin(256)=0b100000000 


In [1]:
def len2bis(n):
    """Le nombre de chiffres de n en base 2 est l'exposant de la plus petite puissance de 2
    qui lui est strictement supérieure"""
    if n == 0: #cas particulier de 0 qui est le seul nombre commençant par 0
        return 1
    puissance = 1
    exposant = 0
    while puissance <= n:
        puissance *= 2
        exposant += 1
    return exposant

for i in [0,7,8,31,32,255,256]:
    print("Nombre de chiffres en base 2 de %s : %s \n\
Vérification : bin(%s)=%s \n"%(i,len2bis(i),i,bin(i)))
Nombre de chiffres en base 2 de 0 : 1 
Vérification : bin(0)=0b0 

Nombre de chiffres en base 2 de 7 : 3 
Vérification : bin(7)=0b111 

Nombre de chiffres en base 2 de 8 : 4 
Vérification : bin(8)=0b1000 

Nombre de chiffres en base 2 de 31 : 5 
Vérification : bin(31)=0b11111 

Nombre de chiffres en base 2 de 32 : 6 
Vérification : bin(32)=0b100000 

Nombre de chiffres en base 2 de 255 : 8 
Vérification : bin(255)=0b11111111 

Nombre de chiffres en base 2 de 256 : 9 
Vérification : bin(256)=0b100000000 


In [3]:
def base10to2(n):
    """prend en argument un entier naturel n écrit en base 10
    et qui retourne son écriture en base 2
    Même principe que la fonction convert présentée dans l'exo 1 sauf qu'on retourne
    un entier et non une liste"""
    k,a = 0,0
    while n>0:
        a = a+(n%2)*10**k
        k = k+1
        n = n//2
    return a

#conversion en base 2 avec bas10to2, vérification avec les exemples de l'exo 1
for i in [0,7,34,128]:
    print("L'écriture en base 2 de %s est %s"%(i,base10to2(i)))
L'écriture en base 2 de 0 est 0
L'écriture en base 2 de 7 est 111
L'écriture en base 2 de 34 est 100010
L'écriture en base 2 de 128 est 10000000

In [5]:
def base10to2bis(n):
    '''Retourne le tableau des bits en base 2 du décimal n
    A connaitre par coeur pour le prochain DS'''
    t = [n%2]
    n = n//2
    while n > 0:
        t.append(n%2)
        n = n//2
    t.reverse()
    return t

#conversion en base 2 avec bas10to2, vérification avec les exemples de l'exo 1
for i in [0,7,34,128]:
    print("L'écriture en base 2 de %s est : "%i,base10to2bis(i))
L'écriture en base 2 de 0 est :  [0]
L'écriture en base 2 de 7 est :  [1, 1, 1]
L'écriture en base 2 de 34 est :  [1, 0, 0, 0, 1, 0]
L'écriture en base 2 de 128 est :  [1, 0, 0, 0, 0, 0, 0, 0]

In [58]:
def base10to2rec(n):
    if n <= 1:
        return str(n%2)
    return base10to2rec(n//2) + str(n%2)

#conversion en base 2 avec bas10to2, vérification avec les exemples de l'exo 1
for i in [0,7,34,128]:
    print("L'écriture en base 2 de %s est %s"%(i,base10to2rec(i)))
L'écriture en base 2 de 0 est 0
L'écriture en base 2 de 7 est 111
L'écriture en base 2 de 34 est 100010
L'écriture en base 2 de 128 est 10000000

In [4]:
def base2to10(n):
    """prend en argument un entier naturel n écrit en base 2
    et qui retourne son écriture en base 2.
    Meme principe que la fonction base5to10 de l'exo 2"""
    chiffres = str(n)
    L = len(chiffres)
    decimal = 0
    for i in range(L):
        decimal += int(chiffres[L-1-i])*2**i
    return decimal
    

#conversion en base 2 avec bas10to2, vérification avec les exemples de l'exo 1
for i in [7,34,128]:
    print("L'écriture en base 2 de %s est %s"%(base10to2(i),base2to10(base10to2(i))))
L'écriture en base 2 de 111 est 7
L'écriture en base 2 de 100010 est 34
L'écriture en base 2 de 10000000 est 128

In [6]:
def base2to10horner(n):
    """prend en argument un entier naturel n écrit en base 2
    et qui retourne son écriture en base 2.
    Meme principe que la fonction base2to10 mais moins de multiplications (algorith d'Horner)"""
    chiffres = str(n)  
    decimal = 0
    for c in chiffres:
        decimal = int(c) + decimal*2
    return decimal
    

#conversion en base 2 avec bas10to2, vérification avec les exemples de l'exo 1
for i in [7,34,128]:
    print("L'écriture en base 2 de %s est %s"%(base10to2(i),base2to10horner(base10to2(i))))
L'écriture en base 2 de 111 est 7
L'écriture en base 2 de 100010 est 34
L'écriture en base 2 de 10000000 est 128

In [70]:
def puissance2dans(n):
    """Retourne la plus grande puissance de 2 inférieure ou égale à n"""
    p = 1
    while p <= n:
        p *= 2
    return p//2

def b10to2(n):
    """Retourne sous forme de chaine de caractères la représentation en binaire de 
    l'entier n en retranchant   successivement les plus grandes puissances de 2 que
    peut contenir l'entier variable"""
    p = puissance2dans(n)
    if n == 0:
        return '0'
    rep = ''
    while p > 0:
        if p <= n:
            rep = rep + '1'
            n = n - p
        else:
            rep = rep + '0'
        p //= 2
    return rep

#conversion en base 2 avec b10to2, vérification avec les exemples de l'exo 1
print('Algorithme 2, version itérative')
for i in [0,7,34,128]:
    print("L'écriture en base 2 de %s est %s"%(i,b10to2(i)))
    
def b10to2rec(n):
    """Conversion de base dix en base deux. Fonction récursive avec enveloppe"""
    
    def b10to2rec2(n, p):
        if p == 0:
            return ''#terminaison de la récursion
        elif p <= n:
            return '1' + b10to2rec2(n-p, p//2)
        else:
            return '0' + b10to2rec2(n, p//2)
    
    p2 = puissance2dans(n)
    return b10to2rec2(n, p2)
        
#conversion en base 2 avec b10to2rec, vérification avec les exemples de l'exo 1
print('Algorithme 2, version récursive')
for i in [0,7,34,128]:
    print("L'écriture en base 2 de %s est %s"%(i,b10to2rec(i)))
Algorithme 2, version itérative
L'écriture en base 2 de 0 est 0
L'écriture en base 2 de 7 est 111
L'écriture en base 2 de 34 est 100010
L'écriture en base 2 de 128 est 10000000
Algorithme 2, version récursive
L'écriture en base 2 de 0 est 
L'écriture en base 2 de 7 est 111
L'écriture en base 2 de 34 est 100010
L'écriture en base 2 de 128 est 10000000

Exercice 9

In [12]:
for i in [67,188]:
    print("L'écriture en base %s de %s est %s"%(b,i,base10to2(i)))
#on remarque que les écritures binaires de 67 et 188 sont complémentaires sur 8 bits
#c'est lié à 67+188=255
L'écriture en base 9 de 67 est 1000011
L'écriture en base 9 de 188 est 10111100

In [11]:
def base10to2V2(n):
    """prend en argument un entier naturel n écrit en base 10 et compris entre 0 et 255
    et  retourne son écriture en base 2 sous forme de chaine 
    en complétant par des 0 à gauche pour avoir huit bits exactement"""
    k,a = 0,0
    while n>0:
        a = a+(n%2)*10**k
        k = k+1
        n = n//2
    L = len(str(a))
    if L<8:
        return (8-L)*'0'+str(a)
    return str(a)

def complement(n):
    assert 0<=n<=255,'n doit être un entier entre 0 et 255'
    return base10to2V2(255-n)

for i in [7,34,127,128,256]:
    print("L'écriture en base 2 de %s est %s \n\
et celle de son complément binaire est %s"%(i,base10to2(i),complement(i)))
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-11-f704a474b39d> in <module>()
     18 
     19 for i in [7,34,127,128,256]:
---> 20     print("L'écriture en base 2 de %s est %s \net celle de son complément binaire est %s"%(i,base10to2(i),complement(i)))

<ipython-input-11-f704a474b39d> in complement(n)
     14 
     15 def complement(n):
---> 16     assert 0<=n<=255,'n doit être un entier entre 0 et 255'
     17     return base10to2V2(255-n)
     18 

AssertionError: n doit être un entier entre 0 et 255
L'écriture en base 2 de 7 est 111 
et celle de son complément binaire est 11111000
L'écriture en base 2 de 34 est 100010 
et celle de son complément binaire est 11011101
L'écriture en base 2 de 127 est 1111111 
et celle de son complément binaire est 10000000
L'écriture en base 2 de 128 est 10000000 
et celle de son complément binaire est 01111111

Exercice 10

In [14]:
#exo 10 Chapitre codage des nombres
#exponentiation rapide

import time

def timetest(fonction):
    """Décorateur pour le calcul du temps d'exécution"""
    def fonction_modifiee(*args,**kargs):
        tps_avant = time.time()
        ret = fonction(*args,**kargs)
        tps_apres = time.time()
        print("Le temps d'exécution de la fonction est de {:10.3e} s"
              .format(tps_apres-tps_avant))
        return ret
    return fonction_modifiee

@timetest
def expo_naive(a,n):
    """exponentiation naive version itérative"""
    p = 1
    for i in range(n):
        p = p*a
    return p
    
@timetest
def expo_rapide_rec(a,n):
    """exponentiation rapide version récursive"""
    if n==0:
        return 1
    elif n%2==0:
        return expo_rapide_rec(a**2,n//2)
    return a*expo_rapide_rec(a**2,n//2)

@timetest
def expo_rapide_iter(a,n):
    """exponentiation rapide version itérative"""
    m,p,r = n,a,1
    while m>0:
        if m%2==1:
            r = p*r
        p = p*p
        m = m//2
    return r

print(expo_naive(2,1000))
print(expo_rapide_iter(2,1000))
print(expo_rapide_rec(2,1000))
Le temps d'exécution de la fonction est de  1.647e-04 s
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
Le temps d'exécution de la fonction est de  1.144e-05 s
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
Le temps d'exécution de la fonction est de  7.153e-07 s
Le temps d'exécution de la fonction est de  1.550e-05 s
Le temps d'exécution de la fonction est de  2.718e-05 s
Le temps d'exécution de la fonction est de  3.743e-05 s
Le temps d'exécution de la fonction est de  4.721e-05 s
Le temps d'exécution de la fonction est de  5.770e-05 s
Le temps d'exécution de la fonction est de  6.747e-05 s
Le temps d'exécution de la fonction est de  7.677e-05 s
Le temps d'exécution de la fonction est de  8.583e-05 s
Le temps d'exécution de la fonction est de  9.513e-05 s
Le temps d'exécution de la fonction est de  1.061e-04 s
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

Numération en base quelconque

Exercice 11

In [15]:
def base10tob(n,b):
    """prend en argument un entier naturel n écrit en base 10
    et qui retourne son écriture en base b sous forme de liste.
    Même principe que la fonction base10to2 mais ici on retourne une liste
    pour ne plus etre géné par la représentation en base >10"""
    t = []
    if n==0:
        return [0]
    while n>0:
        t.append(n%b)
        n = n//b
    #on renverse la liste des chiffres puisqu'on a d'abord obtenu les chiffres de poids faible
    t.reverse()
    return t

#conversion en base 5, on reprend l'exemple de l'exo 1
b = 5
for i in [0,7,34,128]:
    print("L'écriture en base %s de %s est : "%(b,i),base10tob(i,b))

#conversion en base 16
b = 16
for i in [0,7,34,128]:
    print("L'écriture en base %s de %s est : "%(b,i),base10tob(i,b))
L'écriture en base 5 de 0 est :  [0]
L'écriture en base 5 de 7 est :  [1, 2]
L'écriture en base 5 de 34 est :  [1, 1, 4]
L'écriture en base 5 de 128 est :  [1, 0, 0, 3]
L'écriture en base 16 de 0 est :  [0]
L'écriture en base 16 de 7 est :  [7]
L'écriture en base 16 de 34 est :  [2, 2]
L'écriture en base 16 de 128 est :  [8, 0]

Exercice 12

In [16]:
for i in [17,35,171,255,865]:
    print("L'écriture hexadécimale de %s est %s"%(i,hex(i)))
L'écriture hexadécimale de 17 est 0x11
L'écriture hexadécimale de 35 est 0x23
L'écriture hexadécimale de 171 est 0xab
L'écriture hexadécimale de 255 est 0xff
L'écriture hexadécimale de 865 est 0x361

In [17]:
def base16to10(chaine):
    """Retourne l'écriture en base 10 sous forme d'entier d'un entier dont on passe
    en paramètre la chaine de représentation en base 16 sous la forme '0x2A'"""
    #on transforme la chaine en majuscules
    chaine = chaine.upper()
    #on élimine les deux premiers caractères '0X' à gauche s'ils existent
    if chaine[:2]=='0X':
        chaine = chaine[2:]
    L = len(chaine)
    decimal = 0
    #dictionnaire des chiffres en base 16
    dico = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}
    for i in range(L):
        decimal += dico[chaine[L-1-i]]*16**i
    return decimal

for i in ['0x0','0x3ae','0xFFF','0x6aF']:
    r= base16to10(i)
    print("L'écriture décimale de %s est %s"%(i,r),'\nVérification : %s'%hex(r))
    
    
L'écriture décimale de 0x0 est 0 
Vérification : 0x0
L'écriture décimale de 0x3ae est 942 
Vérification : 0x3ae
L'écriture décimale de 0xFFF est 4095 
Vérification : 0xfff
L'écriture décimale de 0x6aF est 1711 
Vérification : 0x6af

In [18]:
def base10to16(n):
    """retourne la liste des chiffres de l'écriture en base 16 
    (ou une cha\^ine de caractères) d'un entier n en respectant la nomenclature ci-dessus.
    On pourra utiliser un dictionnaire pour la traduction des chiffres"""
    #liste des chiffres en base 16
    t = []
    #on peut se passer d'un dictionnaire
    chiffre = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
    if n==0:
        return ['0']
    while n>0:
        t.append(chiffre[n%16])
        n = n//16
    #on renverse la liste des chiffres puisqu'on a d'abord obtenu les chiffres de poids faible
    t.reverse()
    return t

def base10to16V2(n):
    """quitte à retourner une liste de caractères autant retourner une chaine
    de représentation hexadécimale à la manière de la fonction hex de  Python"""
    chaine = ''
    chiffre = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
    if n==0:
        return '0x0'
    while n>0:
        chaine = chiffre[n%16]+chaine
        n = n//16
    return '0x'+chaine

for i in [0,17,35,171,255,865]:
    print("L'écriture hexadécimale de %s est %s"%(i,base10to16V2(i)),'ou :\n',base10to16(i),'\n')


    
L'écriture hexadécimale de 0 est 0x0 ou :
 ['0'] 

L'écriture hexadécimale de 17 est 0x11 ou :
 ['1', '1'] 

L'écriture hexadécimale de 35 est 0x23 ou :
 ['2', '3'] 

L'écriture hexadécimale de 171 est 0xAB ou :
 ['A', 'B'] 

L'écriture hexadécimale de 255 est 0xFF ou :
 ['F', 'F'] 

L'écriture hexadécimale de 865 est 0x361 ou :
 ['3', '6', '1'] 


In [19]:
def mac_from_hexa_2_bin(m):
    """Traduit une MAC adresse en hexadécimal de type A1-FB-64-3B-AB-FF
    sous la forme d'une représentation binaire"""
    #tableau qui contiendra les écritures binaires successives
    t=[]
    for c in m.split('-'):
        #expliquer la ligne suivante
        t.append(str(base10to2(base16to10(c))))
    return '-'.join(t)

mac= 'A1-FB-64-3B-AB-FF'
print("L'écriture en binaire de la MAC adresse %s est :\n"%mac,mac_from_hexa_2_bin('A1-FB-64-3B-AB-FF'))
L'écriture en binaire de la MAC adresse A1-FB-64-3B-AB-FF est :
 10100001-11111011-1100100-111011-10101011-11111111

In [20]:
def base10to16V3(n):
    """redéfinition de base10to16V2, prend en en entrée un entier entre 0 et 255
    et retourne sa représentation hexadécimale sous la forme d'une chaine de 2 caractères"""
    v = base10to16V2(n)[2:]
    if len(v)==1:
        return '0'+v
    return v
    

def rgb2html(r,g,b):
    """prend en entrée 3 entiers R,G et B entre 0 et 255 
    et retourne une chaine de caractères correspondant à la notation HTML de la couleur (R,G,B)"""
    chaine = '#'
    for i in [r,g,b]:
        chaine += base10to16V3(i)
    return chaine

def html2rgb(chaine):
    """réciproque de la précédente"""
    rgb = []
    for i in range(1,len(chaine)-1,2):
        rgb.append(base16to10(chaine[i:i+2]))
    return rgb

r,g,b = 255,0,0
html=rgb2html(r,g,b)
print("La notation HTML de la couleur (%s,%s,%s) est %s"%(r,g,b,html))
print("La représentation (R,G,B) de la couleur de notation HTML %s est : \n"%html,html2rgb(html))
La notation HTML de la couleur (255,0,0) est #FF0000
La représentation (R,G,B) de la couleur de notation HTML #FF0000 est : 
 [255, 0, 0]

Exercice 13

Convertir \(3\) et \(2\) en base 4 puis \(32_{4}\) en base 2. Convertir \(11\) puis \(10\) en base \(4\) puis en base \(2\) puis \(BA_{16}\) en base 4 puis en base 2.

Comment passer rapidement de la base 4 à la base 2 ? de la base 16 à la base 4 puis à la base 2 ?

Réponse :

\(3\) se décompose en base 2 sous la forme \(3=1\times2^{1}+1\)

\(2\) se décompose en base 2 sous la forme \(2=1\times2^{1}+0\)

on utilise ensuite que \(4=2^{2}\) c'est-à-dire que la base \(4\) est une puissance de la base \(2\)

\(32_{4}=3\times4^{1}+2\times 4^{0}=(1\times2^{1}+1)\times 2^{2}+(1\times2^{1}+0)\times 2^{0}=1\times2^{3}+1\times 2^{2}+1\times2^{1}+0\times 2^{0}\)

donc \(32_{4}=1110_{2}\)

Pour convertir en base 2 l'entier écrit \(32_{4}\) en base 4 il suffit de convertir en base \(2\) chacun des chiffres et de juxtaposer les écritures obtenues de gauche à droite.

On obtient une représentation deux fois plus longue en base 2 puisque \(4=2^{2}\).

Puisque \(16=4^{2}\) on procède de même pour passer de la base 16 à la base 4 :

\(11=2\times 4 + 3\) donc \(11=23_{4}\)

\(10=2\times 4 + 2\) donc \(11=22_{4}\)

or \(11\) se note \(B\) en base 16 et \(10\) se note \(A\) en base 16

donc \(BA_{16}=11 \times 16^{1}+10\times 16^{0}=(2\times 4 + 3)\times 4^{2}+(2\times 4 + 2)\times 4^{0}=2\times 4^{3}+3\times 4^{2}+2\times 4 + 2 = 2322_{4}\)

On réitère le procédé pour obtenir la décomposition en base 2 à partir de celle en base 4

\(2=10_{2}\) et \(3=11_{2}\)

donc \(BA_{16}=2322_{4}=10111010_{2}\)

On est parti d'une décomposition de longueur 2 en base 16 pour obtenir une décomposition de longueur \(2\times2=4\) en base 4 (car \(16=4^{2}\)) puis \(4\times2=8\) en base 2 (car \(4=2^2\)).

In [21]:
#vérification avec Python
print(bin(3*4+2))
print(bin(11*16+10))
0b1110
0b10111010

Représentation des entiers relatifs

Exemple 1

In [22]:
for i in range(64):
    print(i,'->',repr(2**i-1))
#Une version 32 bits de Python est installée sur ma machine
#2**31-1 est alors le plus grand entier représentable sur un mot de 32 bits
#au-delà les entiers sont réprésentés par Python2 sur plus d'un mot, ce sont des entiers longs (suffixe L)
#2**31-1 apparait ci-dessous comme un entier long car Python calcule d'abord 2**31 qui est un entier long
#Python3 n'a plus de type entier long
0 -> 0
1 -> 1
2 -> 3
3 -> 7
4 -> 15
5 -> 31
6 -> 63
7 -> 127
8 -> 255
9 -> 511
10 -> 1023
11 -> 2047
12 -> 4095
13 -> 8191
14 -> 16383
15 -> 32767
16 -> 65535
17 -> 131071
18 -> 262143
19 -> 524287
20 -> 1048575
21 -> 2097151
22 -> 4194303
23 -> 8388607
24 -> 16777215
25 -> 33554431
26 -> 67108863
27 -> 134217727
28 -> 268435455
29 -> 536870911
30 -> 1073741823
31 -> 2147483647
32 -> 4294967295
33 -> 8589934591
34 -> 17179869183
35 -> 34359738367
36 -> 68719476735
37 -> 137438953471
38 -> 274877906943
39 -> 549755813887
40 -> 1099511627775
41 -> 2199023255551
42 -> 4398046511103
43 -> 8796093022207
44 -> 17592186044415
45 -> 35184372088831
46 -> 70368744177663
47 -> 140737488355327
48 -> 281474976710655
49 -> 562949953421311
50 -> 1125899906842623
51 -> 2251799813685247
52 -> 4503599627370495
53 -> 9007199254740991
54 -> 18014398509481983
55 -> 36028797018963967
56 -> 72057594037927935
57 -> 144115188075855871
58 -> 288230376151711743
59 -> 576460752303423487
60 -> 1152921504606846975
61 -> 2305843009213693951
62 -> 4611686018427387903
63 -> 9223372036854775807

In [160]:
import sys
#plus grand entier signé représenté sur un mot machine
sys.maxsize,2**31-1
Out[160]:
(2147483647, 2147483647L)

Exercice 15

In [24]:
#on utilise les fonctions  complement et base10to2V2 de l'exercice 9

def base10to2V3(n):
    """prend en argument un entier naturel n écrit en base 10 et compris entre -128 et 127
    et  retourne son écriture en base 2 en complément à deux sous forme de chaine 
    en complétant par des 0 à gauche pour avoir huit bits exactement"""
    assert -128<=n<=127,'Erreur de débordement, n doit être un entier compris entre -128 et 127'
    if 0<n<=127:
        return base10to2V2(n)
    elif -128<=n<0:
        return base10to2V2(n+256)
    return '0'*8



for i in [54,-1,-2,127,-127,-128,128]:
    print("La représentation binaire de %s en complément à deux\
 est %s \n"%(i,base10to2V3(i)))
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-24-84f989b850ee> in <module>()
     15 
     16 for i in [54,-1,-2,127,-127,-128,128]:
---> 17     print("La représentation binaire de %s en complément à deux est %s \n"%(i,base10to2V3(i)))

<ipython-input-24-84f989b850ee> in base10to2V3(n)
      5     et  retourne son écriture en base 2 en complément à deux sous forme de chaine
      6     en complétant par des 0 à gauche pour avoir huit bits exactement"""
----> 7     assert -128<=n<=127,'Erreur de débordement, n doit être un entier compris entre -128 et 127'
      8     if 0<n<=127:
      9         return base10to2V2(n)

AssertionError: Erreur de débordement, n doit être un entier compris entre -128 et 127
La représentation binaire de 54 en complément à deux est 00110110 

La représentation binaire de -1 en complément à deux est 11111111 

La représentation binaire de -2 en complément à deux est 11111110 

La représentation binaire de 127 en complément à deux est 01111111 

La représentation binaire de -127 en complément à deux est 10000001 

La représentation binaire de -128 en complément à deux est 10000000 


Sur 8 bits on peut représenter en complément à deux les entiers de \(-2^{8-1}-1=-128\) à \(2^{8-1}-1=127\)

Sur 16 bits on peut représenter en complément à deux les entiers de \(-2^{16-1}=-32768\) à \(2^{16-1}-1=32767\)

Représentation de l'opposé d'un entier en complément à deux

Notons \(r\) la représentation binaire en complément à 2 d'un entier \(n\).

Si \(1 \leqslant n \leqslant 127\), on a \(r=n\) et la représentation en complément à 2 de \(-127 \leqslant -r \leqslant -1\) est celle de \(2^{8}-r=256-r=(255-r)+1\).

Si \(-127 \leqslant n \leqslant -1\),, on a \(r=256+n\) soit \(-n=256-r\). Comme \(1 \leqslant -n \leqslant 127\), il est égal à sa représentation binaire en complément à \(2\) et donc la représentation binaire en complément à 2 de \(-n\) est encore \(256-r=(255-r)+1\).

On a vu dans l'exercice 9 que si on change tous les bits de la représentation binaire d'un entier \(n\) compris entre \(0\) et \(255\) alors on obtient l'écriture binaire de \(n'=255-n\).

Pour tout entier \(-127 \leqslant n \leqslant 127\), privé de 0, on obtient donc la représentation binaire en complément à 2 de \(-n\) en inversant tous les bits de la représentation de \(n\) et en ajoutant \(1\).

Pour 0, son écriture binaire sur huit bits est \(00000000_{2}\), si on inverse tous les bits celà donne \(11111111_{2}\) et si on ajoute \(1\) celà donne \(1\overbrace{00000000}^{8 \text{ bits}}\) et comme on est limité à huit bits on tronque le neuvième bit dit de débordement et on retrouve bien \(00000000_{2}\). Ainsi on a bien \(-0=0\).

Pour le plus petit entier négatif sur huit bits qui est \(-128=10000000_{2}\), si on inverse tous les bits et qu'on ajoute 1 on obtient \(01111111_{2}+1_{2}=10000000_{2}\) la représentation en complément à 2 de \(-128\). C'est un débordement qui génère un résultat faux, ce qui est logique puisque sur huit bits seuls les entiers positifs de 0 à 127 sont représentés.

In [201]:
def oppose_complement2(n):
    """Retourne l'écriture binaire en complément à 2 de l'opposé d'un entier compris entre -127 et 127
    ou un message d'erreur s'il y a débordement"""
    assert -127<=n<=127,'Erreur de débordement, n doit être un entier compris entre -127 et 127'
    if 0<n<=127:
        return base10to2V2(int('0b'+complement(n),2)+1)
    elif -127<=n<0:
        return base10to2V2(int('0b'+complement(n+256),2)+1)
    return '0'*8

for i in [4,100,-8,1,127,-127,-128]:
    if i<0:
        j = i+256
    else:
        j = i
    print "La représentation binaire de %s est %s \n\
et la représentation de son opposé %s en complément à deux est\
: %s\n"%(i,base10to2V2(j),-i,oppose_complement2(i))
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-201-91a2f5857e83> in <module>()
     16     print "La reprsentation binaire de %s est %s \n\
     17 et la reprsentation de son oppos %s en complment  deux est\
---> 18 : %s\n"%(i,base10to2V2(j),-i,oppose_complement2(i))

<ipython-input-201-91a2f5857e83> in oppose_complement2(n)
      2     """Retourne l'écriture binaire en complément à 2 de l'opposé d'un entier compris entre -127 et 127
      3     ou un message d'erreur s'il y a débordement"""
----> 4     assert -127<=n<=127,'Erreur de débordement, n doit être un entier compris entre -127 et 127'
      5     if 0<n<=127:
      6         return base10to2V2(int('0b'+complement(n),2)+1)

AssertionError: Erreur de débordement, n doit être un entier compris entre -127 et 127
La représentation binaire de 4 est 00000100 
et la représentation de son opposé -4 en complément à deux est: 11111100

La représentation binaire de 100 est 01100100 
et la représentation de son opposé -100 en complément à deux est: 10011100

La représentation binaire de -8 est 11111000 
et la représentation de son opposé 8 en complément à deux est: 00001000

La représentation binaire de 1 est 00000001 
et la représentation de son opposé -1 en complément à deux est: 11111111

La représentation binaire de 127 est 01111111 
et la représentation de son opposé -127 en complément à deux est: 10000001

La représentation binaire de -127 est 10000001 
et la représentation de son opposé 127 en complément à deux est: 01111111


Représentation des nombres réels : les flottants ou nombres pseudo-réels

Exercice 16

In [25]:
a = 1.
b = 2.
i = 1
while i<11:
    a = b
    b = b*a
    c = 2**(2**i)
    print(type(b),b,' ; ',type(c),c)
    i += 1
<class 'float'> 4.0  ;  <class 'int'> 4
<class 'float'> 16.0  ;  <class 'int'> 16
<class 'float'> 256.0  ;  <class 'int'> 256
<class 'float'> 65536.0  ;  <class 'int'> 65536
<class 'float'> 4294967296.0  ;  <class 'int'> 4294967296
<class 'float'> 1.8446744073709552e+19  ;  <class 'int'> 18446744073709551616
<class 'float'> 3.402823669209385e+38  ;  <class 'int'> 340282366920938463463374607431768211456
<class 'float'> 1.157920892373162e+77  ;  <class 'int'> 115792089237316195423570985008687907853269984665640564039457584007913129639936
<class 'float'> 1.3407807929942597e+154  ;  <class 'int'> 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
<class 'float'> inf  ;  <class 'int'> 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216

On peut voir ci-dessus et ci-dessous que Python2 ne peut représenter \(2^{2^{10}}\) sous forme de flottant (c'est l'infini) alors qu'il peut le représenter sous forme d'entier long

In [204]:
2.**(2**10)
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-204-f4c427c5d830> in <module>()
----> 1 2.**(2**10)

OverflowError: (34, 'Numerical result out of range')
In [205]:
2**(2**10)
Out[205]:
179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216L

Exemple 5 : Représentation selon la norme la norme IEEE754 (Voir Poly de Cours)

In [26]:
def base10to2(n,digit):
    """Ecrit un développement en base 2 d'un flottant n.
    On calcule d'abord le développement en binaire de  la partie entière
    puis celui de la partie fractionnaire.
    Retourne un flottant qu'il faut bien interpréter comme une représentation en binaire"""
    i = 0
    #partie entière de n
    quotient = int(n)
    #partie entière en binaire
    partentbin = 0
    while quotient>0:
        bit = quotient%2
        quotient = quotient//2
        partentbin = partentbin+bit*10**i
        i = i+1
    #partie fractionnaire en écriture décimale
    partfracdec = n-int(n)
    partfracbin = 0
    i = 0
    lbitspartfracbin = []
    while partfracdec!=0 and i<digit:
        partfracbin = partfracbin*10
        bit = int(partfracdec*2)
        partfracbin += bit
        lbitspartfracbin.append(bit)
        #print(partfracdec)
        partfracdec = 2*partfracdec-bit
        i+=1
    print('Nombre de bits de la partie fractionnaire  en binaire réellement calculés ; ',i)
    print('Liste des bits de la partie fractionnaire  en binaire réellement calculés : \n',lbitspartfracbin)
    print('La liste des bits affichés est réduite à 20 bits après la virgule au maximum : \n')
    return(partentbin+partfracbin/10.**i)
        
        
        

n = 0.2
d = 56
print('Développement en base 2 de %s : %s'%(n,base10to2(n,d)))
Nombre de bits de la partie fractionnaire  en binaire réellement calculés ;  54
Liste des bits de la partie fractionnaire  en binaire réellement calculés : 
 [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1]
La liste des bits affichés est réduite à 20 bits après la virgule au maximum : 

Développement en base 2 de 0.2 : 0.0011001100110011

Exercice 17

In [27]:
"""On considère un codage des flottants sur $6$ bits avec $1$ bit de signe $s$,  l'exposant $e$ codé sur $3$ bits et la mantisse  $m$ codée sur $2$ bits."""

def flottants(e,m):
    """affiche tous les flottants positifs dont l'exposant est codé sur e bits et 
    la mantisse sur m bits"""
    decalage = 2**(e-1)-1
    for i in range(2**(e)):
        for j in range(2**(m)):
            if i==7 and j>0:
                print('e = %s et m=%s : NAN'%(i,j))
            elif i==7 and j==0:
                print('e = %s et m=%s : infini'%(i,j))
            elif i==0 and j>0:
                print('e = %s et m=%s, flottant dénormalisé : %s'%(i,j,2**(1-decalage)*(j/2**m)))
            elif i==0 and j==0:
                print('e = %s et m=%s : 0'%(i,j))
            elif i==7 and j==0:
                print('e = %s et m=%s : infini'%(i,j))
            else:
                print('e = %s et m=%s : %s'%(i,j,2**(i-decalage)*(1+j/2**m)))

e = 3
m = 2
flottants(e,m)
e = 0 et m=0 : 0
e = 0 et m=1, flottant dénormalisé : 0.0625
e = 0 et m=2, flottant dénormalisé : 0.125
e = 0 et m=3, flottant dénormalisé : 0.1875
e = 1 et m=0 : 0.25
e = 1 et m=1 : 0.3125
e = 1 et m=2 : 0.375
e = 1 et m=3 : 0.4375
e = 2 et m=0 : 0.5
e = 2 et m=1 : 0.625
e = 2 et m=2 : 0.75
e = 2 et m=3 : 0.875
e = 3 et m=0 : 1.0
e = 3 et m=1 : 1.25
e = 3 et m=2 : 1.5
e = 3 et m=3 : 1.75
e = 4 et m=0 : 2.0
e = 4 et m=1 : 2.5
e = 4 et m=2 : 3.0
e = 4 et m=3 : 3.5
e = 5 et m=0 : 4.0
e = 5 et m=1 : 5.0
e = 5 et m=2 : 6.0
e = 5 et m=3 : 7.0
e = 6 et m=0 : 8.0
e = 6 et m=1 : 10.0
e = 6 et m=2 : 12.0
e = 6 et m=3 : 14.0
e = 7 et m=0 : infini
e = 7 et m=1 : NAN
e = 7 et m=2 : NAN
e = 7 et m=3 : NAN

Exercice 18 : Bornes des flottants

In [28]:
import sys
#calcul du plus grand flottant au format double
a = 2.**1023
b = a/2
for i in range(1,53):
    a,b = a+b,b/2
print('le plus grand flottant au format double est %s'%a)
#affichage du plus petit flottant normalisé au format double
print( 'le plus petit flottant normalisé au format double est :',2**(-1022))
print( 'le plus petit flottant dénormalisé au format double est 2**(-1074) : ',2**(-1074))
print( ' 2**(-1075) : ',2**(-1075) )
print( 'Vérification : \n',sys.float_info)
le plus grand flottant au format double est 1.7976931348623157e+308
le plus petit flottant normalisé au format double est : 2.2250738585072014e-308
le plus petit flottant dénormalisé au format double est 2**(-1074) :  5e-324
 2**(-1075) :  0.0
Vérification : 
 sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

Exercice 19 : Fonction mystère

In [30]:
def mystere():
    x = 1.
    y = x+1.
    i = 0
    while (y-x == 1.):
        i += 1
        x = x*2.
        y = x+1.
    print(i,x,y)

mystere()
53 9007199254740992.0 9007199254740992.0

Que fait la fonction mystere ?

Reponse : elle détermine le plus petit exposant n tel que les représentations sous forme de flottants de \(2^{n}\) et \(2^{n+1}\) sont les mêmes. Pour les flottants dont la mantisse est représentée sur 52 bits la réponse est 53 car le plus petit écart entre deux flottants successifs est alors de \(\frac{2^{53}}{2^{52}}=2\)

In [231]:
2.**53-1==2.**53,2.**53 == 2.**53+1,2.**53 == 2.**53+2
Out[231]:
(False, True, False)
In [236]:
2.**53
Out[236]:
9007199254740992.0
In [234]:
2.**53+1
Out[234]:
9007199254740992.0
In [235]:
2.**53+2
Out[235]:
9007199254740994.0

Exercice 20 : Problèmes d'approximation avec les flottants

Perte de précision par somme, avec absorption (ou cancellation)

In [54]:
def somme1(n):
    s = 0.
    for i in range(1,n+1):
        s += 1./i**4
    return s


def somme2(n):
    s = 0.
    for i in range(n+1,0,-1):
        s += 1./i**4
    return s


print(somme1(100000))
print(somme2(100000))
1.0823232337108615
1.082323233711138

In [55]:
%%python
#Python2 ne retourne pas les memes resultats
def somme1(n):
    s = 0.
    for i in range(1,n+1):
        s += 1./i**4
    return s


def somme2(n):
    s = 0.
    for i in range(n+1,0,-1):
        s += 1./i**4
    return s


print(somme1(100000))
print(somme2(100000))
1.08232323371
1.08232323371

Exercice 21 : Attention aux boucles avec les flottants

Exemple de mauvaise programmation d'une boucle avec un test d'égalité sur des flottants qui n'est jamais vérifié. Ne pas tester, Boucle infinie !!!

def f(x):
    return x**2

a, pas, s = 1.1 , 0.1, 0
while a!=2:
    print(' a =',a)
    s = s+f(a)
    a += pas
print('somme = ',s)

Un exemple spectaculaire de divergence d'une suite qui devrait être constante

In [41]:
#fonction
def recurrence(n):
    u0 = 1./3
    u1 = 0
    for i in range(n) :
        u1 = 4*u0 - 1.
        u0 = u1
    return u1

#programme principal
print('4/3 - 1 == 1/3 est',4./3 - 1 == 1./3)
for i in range(1,50):
    res = recurrence(i)
    print('recurrence(%s)=%.8f'%(i,res))
4/3 - 1 == 1/3 est False
recurrence(1)=0.33333333
recurrence(2)=0.33333333
recurrence(3)=0.33333333
recurrence(4)=0.33333333
recurrence(5)=0.33333333
recurrence(6)=0.33333333
recurrence(7)=0.33333333
recurrence(8)=0.33333333
recurrence(9)=0.33333333
recurrence(10)=0.33333333
recurrence(11)=0.33333333
recurrence(12)=0.33333333
recurrence(13)=0.33333333
recurrence(14)=0.33333333
recurrence(15)=0.33333331
recurrence(16)=0.33333325
recurrence(17)=0.33333302
recurrence(18)=0.33333206
recurrence(19)=0.33332825
recurrence(20)=0.33331299
recurrence(21)=0.33325195
recurrence(22)=0.33300781
recurrence(23)=0.33203125
recurrence(24)=0.32812500
recurrence(25)=0.31250000
recurrence(26)=0.25000000
recurrence(27)=0.00000000
recurrence(28)=-1.00000000
recurrence(29)=-5.00000000
recurrence(30)=-21.00000000
recurrence(31)=-85.00000000
recurrence(32)=-341.00000000
recurrence(33)=-1365.00000000
recurrence(34)=-5461.00000000
recurrence(35)=-21845.00000000
recurrence(36)=-87381.00000000
recurrence(37)=-349525.00000000
recurrence(38)=-1398101.00000000
recurrence(39)=-5592405.00000000
recurrence(40)=-22369621.00000000
recurrence(41)=-89478485.00000000
recurrence(42)=-357913941.00000000
recurrence(43)=-1431655765.00000000
recurrence(44)=-5726623061.00000000
recurrence(45)=-22906492245.00000000
recurrence(46)=-91625968981.00000000
recurrence(47)=-366503875925.00000000
recurrence(48)=-1466015503701.00000000
recurrence(49)=-5864062014805.00000000

Fonctions booléennes

Exercice 22

In [248]:
"""Fonctions booléennes"""
#l'opérateur a%2 retourne le reste de la division euclidienne de a par 2
#x et y sont des entiers entre 0 et 1 

def ou(x,y):
    """ou inclusif """
    return (x+y+x*y)%2
def et(x,y):
    """et"""
    return x*y

def xou(x,y):
    """ou exclusif"""
    return (x+y)%2
def non(x):
    """non"""
    return 1-x