

## Exercice 1

def additionner(A,B):
    S=''
    m=len(A)
    n=len(B)
    r=0
    if m<n:
        A,B,m,n=B,A,n,m
    for k in range(n):
        s=int(A[m-1-k])+int(B[n-1-k])+r
        r=0
        if s>1:
            s=s-2
            r=1
        S=str(s)+S
    for k in range(m-n):
        s=int(A[m-n-1-k])+r
        r=0
        if s==2:
            s=0
            r=1
        S=str(s)+S
    if r==1:
        S='1'+S
    return S

# additionner('1101','1001')


## Exercice 2

def multiplier(A,B):
    m=len(A)
    n=len(B)
    if m<n:
        A,B,m,n=B,A,n,m
    P='0'
    for k in range(n):
        if B[n-1-k]=='1':
            P=additionner(P,A+k*'0')
    return P

# multiplier('1101','1011')


## Exercice 3

def comp_deux(k):
    if k>=0:
        return bin(k)
    else:
        return bin(2**16+k)


## Exercice 4

def knuth(a,b,n):
    if n==1:
        return a**b
    elif b==0:
        return 1
    else:
        return(knuth(a,knuth(a,b-1,n),n-1))

# for n in range(2):
#     print(knuth(3,2,n))


## Exercice 5

2.**1023
# 2.**1024

2.**-1074
# 2.**-1075

eps=1
while 1.+0.5*eps!=1:
    eps=0.5*eps
print(eps)

import numpy as np
print(np.log(eps)/np.log(2))


## Exercice 6

import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(-1,1,100)

y=np.linspace(-2,2,100)

plt.plot(x,x+y-x-y)

plt.show()


## Exercice 7

x=[]
y=[]
for k in range(30):
    x.append(k)
    n=10**k
    y.append(abs((1+1/n)**n-np.e))

import matplotlib.pyplot as plt
plt.plot(x,y)
plt.show()


## Exercice 8

import random as rd

rd.seed(1)
for k in range(10):
    print(rd.random())

rd.seed(1)
for k in range(10):
    print(rd.random())

rd.seed(2)
for k in range(10):
    print(rd.random())

rd.seed(0)
for k in range(10):
    print(rd.random())

## Exercice 9

def kara(m,n):
    if m<10 or n<10:
        return(m*n)
    else:
        sm,sn=str(m),str(n)
        k=max(len(sm),len(sn))//2
        a,b,c,d=int(sm[:k]),int(sm[k:]),int(sn[:k]),int(sn[k:])
        A,B,C=kara(a,c),kara(b,d),kara(a-b,c-d)
        return(A*10**(2*k)+(A+B-C)*10**k+B)

from time import time

x=10**10**5-1
t1=time()
kara(x,x)
t2=time()
print(t2-t1)

t1=time()
x*x
t2=time()
print(t2-t1)







