#########################################
######## TP informatique bio-sép ########
########        2025-2026        ########
#########################################


#########################################
######## Thème 3 : Négligeabilité #######
############ et équivalence #############
#########################################

import math as m

## Q1 : Définition de la partie entière

# Soit x un réel. La partie entière de x
# est l'unique entier n tel que :
#           n <= x < n+1

## Q2 : encadrement à l'aide de puissances de 10

#        ND(x) = n si et seulement si :
#            10**(n-1) <= x <= 10**n - 1

def log10(x) :
    return m.log(x) / m.log(10)

def ND(x) :
    return int(log10(x)) + 1

# problème d'arrondis lorsque x = 10**n

## Q3 : la fonction ndigit

def ndigit(x) :
    y = int(x)
    c = str(y)
    return len(c)

## Q4 : le logarithme est à croissance lente

for n in range(1,13) :
    x = 10**n
    print(ndigit(m.log(x))/ndigit(x))

## Q5 : définition de la négligeabilité

# f = o(g) en a (a réel ou +/- infini) si
# et seulement si : lim_{x->a} f(x)/g(x) = 0

# Échelle de croissance en +infini :
#     (a, b1 < b2, c réels strictement positifs)
#     log(x)**a << x**b1 << x**b2 << exp(c*x)

## Q6 : fonctions pour tester

def id(x) :
    return x

def ln(x) :
    return m.log(x)

def sq(x) :
    return x**2

## Q7 : script mystère

print("{0:5}|{1:5}|{2:5}|{3:5}|{4:22}".format("x","ln x","sqrt x","x**2","exp x"))

for x in range(1,50) :
    print("{0:5}|{1:5}|{2:5}|{3:5}|{4:22}".format(id(x),int(ln(x)),int(m.sqrt(x)),int(sq(x)),int(m.exp(x))))

## Q8 : définition de l'équivalence

# f ~ g en a (a réel ou +/- infini) si
# et seulement si : lim_{x->a} f(x)/g(x) = 1

## Q9 : premier chiffre

def first_digit(x) :
    c = str(x)
    return int(c[0])

## Q10 : fonction synthèse

def synthese(x) :
    return first_digit(x),ndigit(x)

## Q11 : fonction comparative

def equivalents(f,g,N=13) :
    for p in range(1,N) :
        x = 10**p
        print('x = ',x)
        print(synthese(f(x)))
        print(synthese(g(x)))
        print("diff")
        print(f(x)-g(x))
        print('\n')

def f1(x) :
    return x**3 + 2*x**2

def g1(x) :
    return x**3

# equivalents(f1,g1)

# Q12 : f ~ g n'implique pas f - g --> 0
# voir le contre-exemple avec f1 et g1

## Q13 : tests d'équivalences

def f2(x) :
    return x**3 + 2*x

def g2(x) :
    return x**3 + x

def g3(x) :
    return 2*x

def f4(x) :
    return m.exp(x+m.sqrt(x))

def f5(x) :
    return m.sqrt(x**4+x**3)

def f6(x) :
    return m.log(1+m.exp(x))

# equivalents(m.log,m.sqrt)
# equivalents(f2,g2)
# equivalents(id,g3)
# equivalents(f4,m.exp,3)
# equivalents(f5,sq)
# equivalents(f6,id,3)































