Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 05-07-2020 21:55:07

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 988

[Python] Méthode de multiplication dite "multiplication arabe"

Bonsoir,


#!/usr/bin/env python
# -*- coding: utf-8 -*-

while True:
#######################
    x,y=39854,684729
####################
    x,y=min(x,y),max(x,y)
# préparation puis unversion des listes d'entiers
    xx=str(x)
    if len(xx) >11:
        print ("Le plus petit des 2 nombres ne doit pas dépasser 12 chiffres, afin de conserver un")
        print ("affichage cohérent. Veuillez modifier votre choix s'il vous plaît...")
        print ("\n")
    else:
        break
print ("\n                 MULTIPLICATION ARABE\n\n")

print ("Multiplication de",x,"par",y)        
X,Y,Prod=[int(i) for i in str(x)][::-1],[int(i) for i in str(y)][::-1],[]
print("\nLes chiffres de", y,"sont écrits de bas en haut, ceux de", xx,"de gauche à droite.")
print("Tracer les diagonales de chaque case carrée.")
lgx,lgy=len(X),len(Y)
nbc,tot=lgx+lgy,lgx*2
Res=[[0]*nbc for i in range(tot)]

#Je remplis mon tableau
for  ligne,nbp in enumerate(X):
    lgn_p,lgn_i=ligne*2,ligne*2+1
    for col,nbq in enumerate(Y):
        c=col+ligne
        Res[lgn_i][c+1],Res[lgn_p][c]=divmod(nbq*nbp,10)

# Je somme les colonnes et reporte les retenues
ret,s=0,0
for i in zip(*Res):
    s=ret+sum(i)
    ret,u=divmod(s,10)
    Prod.append(u)
Prod.reverse()
Prd=[str(chf) for chf in Prod]
lg_prod=len(Prod)
#print(Prod,x*y)

U,U_u,D,D_d, pr=[],[],[],[],len(Prod)-1
H0=[" "+str(i) for i in xx]
H=[int(i)for i in xx]
V=[int(i)for i in Y]
for i in V:
    for j in H:
        q,r=divmod(i*j, 10)
        U_u.append(r)
        D_d.append(q)
    U.append(U_u)
    D.append(D_d)
    U_u,D_d=[],[]


print(("  |"), end=" ")
for c in H0:
    print (str(c),end="  | ")
print()
IL='--|'+'-----|'*lgx
print(IL+"--")
for i in range(lgy):
    print('  |', end="")
    for elem in U[i]:
        print(' \\ '+str(elem)+' |',end="")
    print()
    print(str(Y[i])+' |', end="")
    for elem in D[i]:
        print(str(elem)+' \\  |',end="")
    print(Prod[pr])
    print(IL+"--")
    pr-=1
print("  |  ", end="")
for i in range(lgx):
    print(str(Prod[i])+"  |  ",end="")
print("\n")
print ("Effectuer les",lgx,"x",lgy,"=", lgx*lgy,"multiplications.")
print ("Inscrire dans le coin")
print ("* inférieur gauche de chaque case, le chiffre des dizaines (0 si dizaines absentes),")
print ("* supérieur droit de chaque case, le chiffre des unités.")
print ("\nLes multiplications une fois effectuées, vient le temps des additions...")
print ("De droite à gauche, addditionner tous les chiffres de chaque diagonale.")
print ("N'inscrire que le chiffre des unités, reporter celui des dizaines en retenue dans la")
print ("diagonale suivante.")
print ("Le résultat se lit de G à D en partant de la dernière ligne, puis de bas en haut...")
print ("            ",x,"x",y,"=","".join(Prd))        
 

Sortie :

MULTIPLICATION ARABE


Multiplication de 39854 par 684729

Les chiffres de 684729 sont écrits de bas en haut, ceux de 39854 de gauche à droite.
Tracer les diagonales de chaque case carrée.



  |  3  |  9  |  8  |  5  |  4  |
--|-----|-----|-----|-----|-----|--
  | \ 7 | \ 1 | \ 2 | \ 5 | \ 6 |
9 |2 \  |8 \  |7 \  |4 \  |3 \  |6
--|-----|-----|-----|-----|-----|--
  | \ 6 | \ 8 | \ 6 | \ 0 | \ 8 |
2 |0 \  |1 \  |1 \  |1 \  |0 \  |6
--|-----|-----|-----|-----|-----|--
  | \ 1 | \ 3 | \ 6 | \ 5 | \ 8 |
7 |2 \  |6 \  |5 \  |3 \  |2 \  |5
--|-----|-----|-----|-----|-----|--
  | \ 2 | \ 6 | \ 2 | \ 0 | \ 6 |
4 |1 \  |3 \  |3 \  |2 \  |1 \  |9
--|-----|-----|-----|-----|-----|--
  | \ 4 | \ 2 | \ 4 | \ 0 | \ 2 |
8 |2 \  |7 \  |6 \  |4 \  |3 \  |8
--|-----|-----|-----|-----|-----|--
  | \ 8 | \ 4 | \ 8 | \ 0 | \ 4 |
6 |1 \  |5 \  |4 \  |3 \  |2 \  |1
--|-----|-----|-----|-----|-----|--
  |  2  |  7  |  2  |  8  |  9  |

Effectuer les 5 x 6 = 30 multiplications.
Inscrire dans le coin
* inférieur gauche de chaque case, le chiffre des dizaines (0 si dizaines absentes),
* supérieur droit de chaque case, le chiffre des unités.

Les multiplications une fois effectuées, vient le temps des additions...
De droite à gauche, additionner tous les chiffres de chaque diagonale.
N'inscrire que le chiffre des unités, reporter celui des dizaines en retenue dans la
diagonale suivante.
Le résultat se lit de G à D en partant de la dernière ligne, puis de bas en haut...
             39854 x 684729 = 27289189566

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

Pied de page des forums