""" -------------- L'algorithme -------------- """
def Karatsuba(P,Q):
""" P et Q deux polynômes, taille(P)=taille(Q) (pas nécessairement une puissance de 2). Les polynômes sont donnés par la liste de leurs coefficients, ordonnés de 1 à x^{n-1}. On retourne la liste des coefficients correspondant au produit P*Q"""
n=len(P)
if n==1:
return([P[0]*Q[0]])
m=n//2
P0=P[:m]
P1=P[m:] #P=P0+X^m P1
Q0=Q[:m]
Q1=Q[m:] #Q=Q0+X^m Q1
T0=Karatsuba(P0,Q0) #de taille 2*m-1
T1=Karatsuba(P1,Q1) # de taille 2*(n-m)-1 =2*m-1 si n pair, 2*m+1 si n impair.
for i in range(m): #on utilise P1 et Q1 pour ne pas allouer de la mémoire supplémentaire.
P1[i]+=P0[i]
Q1[i]+=Q0[i]
T2=Karatsuba(P1,Q1) #de taille 2*(n-m)-1 =2*m-1 si n pair, 2*m+1 si n impair.
for i in range(2*m-1):
T2[i]=T2[i]-T1[i]-T0[i]
if n%2==1: #si n pair, les tableaux T0,T1,T2 sont de la meme taille 2*m-1, sinon T1 et T2 sont de taille 2*m+1.
T2[-2]=T2[-2]-T1[-2]
T2[-1]=T2[-1]-T1[-1]
produit=[0]*(2*n-1) #polynome de longueur n * polynome de longueur n = polynome de longueur 2*n-1. PQ=P0*Q0+(P1*Q0+P0*Q1)*X^m+P1*Q1*X^2m
for i in range(2*m-1):
produit[i]+=T0[i]
produit[i+m]+=T2[i] #décalage correspondant à T2: X^m
produit[i+2*m]+=T1[i] #décalage correspondant à T1: X^(2*m)
if n%2==1:
produit[3*m-1]+=T2[2*m-1]
produit[3*m]+=T2[2*m]
produit[4*m-1]+=T1[2*m-1]
produit[4*m]+=T1[2*m]
return(produit)
" -------------- Exemples d'exécution -------------- "
from random import randint
N=10
P=[randint(-1000,1000) for _ in range(N)]
Q=[randint(-1000,1000) for _ in range(N)]
print(Karatsuba(P,Q))
mardi 21 juin 2016
Algorithme de karatsuba en python
Inscription à :
Publier les commentaires (Atom)
Aucun commentaire:
Enregistrer un commentaire