Lycée Sainte Geneviève PC⋆1
Python
def difference(P,Q):
for idx,elmt in enumerate(Q):
P[idx]-=elmt
return P
Pour assurer un découpage au même degré, il faut s’assurer que les listes
P
et
Q
ont la même longueur (quitte à remplir avec des 0).
Python
def karatsuba(P,Q):
p,q=len(P),len(Q)
n=max(p,q)
n=n//2+n%2
if p==1 and q==1:
return [P[0]*Q[0]]
else:
#Remplissage des deux listes pour contenir
#le même nombre pair d'éléments
P+=[0]*(2*n-p)
Q+=[0]*(2*n-q)
#Division en 2 des listes P et Q:
P_bas,P_haut=P[:len(P)//2],P[len(P)//2:]
Q_bas,Q_haut=Q[:len(Q)//2],Q[len(Q)//2:]
#Calculs de A, B et C
A=karatsuba(P_bas,Q_bas)
B=karatsuba(P_haut,Q_haut)
C=karatsuba(somme(P_bas,P_haut),
somme(Q_bas,Q_haut))
C=difference(difference(C,A),B)
#Placement des coefficients à la bonne
#position dans B et C
B,C=[0]*2*(n)+B,[0]*(n)+C
return somme(somme(A,C),B)
5. Pour évaluer la complexité, la récurrence va porter sur 𝑝et non pas sur 𝑛:
{𝐶(1) = 1𝐶(𝑝) = 3𝐶(𝑝 − 1) + 𝛼
On obtient une suite arithmético-géométrique et donc une complexité en
𝑂(3𝑝)
.
Or 𝑝 = log2(𝑛), donc la complexité est en 𝑂(3log2(𝑛)).
La courbe ci-dessous compare le nombre de multiplications pour les deux mé-
thodes :
Ce document est sous licence Creative Commons BY-NC-SA
(attribution, usage non commercial, partage dans les mêmes conditions).
Plus de détails sur http ://creativecommons.org/licenses/by-nc-sa/3.0/fr/
cbna
4