L'algorithme de Doraki pour multiplier deux nombres de façon originale
Anthony Canu nous présente en vidéo l'algorithme très original de Doraki pour multiplier deux nombres. J'ai réussi à le faire tourner... donc vous n'aurez aucun problème à le faire.
J'ai commencé par 23x52 qui est très simple et j'ai ensuite testé avec 32x52. Le 32 se transforme en 4-8.
Cette vidéo vous présente une méthode particulière permettant de multiplier des grands nombres sans utiliser les tables de multiplication. Cette vidéo est un prolongement de la vidéo précédente
Elle permet de multiplier des entiers plus gros grâce à l'algorithme de Doraki.
Cet algorithme est une réponse simple à un problème mathématique compliqué :
Réécrire un entier N comme une somme de termes de la forme ϵ×k×10^j où ϵ∈{−1,1}, k∈{1,2,4,8} et j∈N et pour laquelle le nombre de tels termes est minimal.
Cet algorithme a été créé le 10.03.16 par Doraki à l'issue d'une discussion sur le forum Maths Forum :
http://www.maths-forum.com/superieur/...
L' algorithme peut se présenter ainsi :
***************************************
Prendre un par un les chiffres de la multiplicande de la droite vers la gauche en commençant par le chiffre situé le plus à droite :
Si le chiffre est un 0,un 1 ou un 4, il reste inchangé et vous passez au chiffre suivant.
Si le chiffre est un 2, vous regardez la parité du chiffre suivant : s'il est pair alors le chiffre 2 reste inchangé, si le chiffre suivant est impair alors le chiffre 2 devient (-8) et on ajoutera alors une retenue de 1 au chiffre suivant.
Si le chiffre est un 3, vous regardez la parité du chiffre suivant : s'il est pair alors le chiffre 3 reste inchangé, si le chiffre suivant est impair alors le chiffre 3 devient (-7) et on ajoutera alors une retenue de 1 au chiffre suivant.
Si le chiffre est un 5, vous regardez la parité du chiffre suivant : s'il est pair alors le chiffre 5 reste inchangé, si le chiffre suivant est impair alors le chiffre 5 devient (-5) et on ajoutera alors une retenue de 1 au chiffre suivant.
Si le chiffre est un 6 alors il deviendra (-4) et on ajoutera alors une retenue de 1 au chiffre suivant.
Si le chiffre est un 7, vous regardez la parité du chiffre suivant : s'il est pair alors le chiffre 7 reste inchangé, si le chiffre suivant est impair alors le chiffre 7 devient (-3) et on ajoutera alors une retenue de 1 au chiffre suivant.
Si le chiffre est un 8, vous regardez la parité du chiffre suivant : s'il est pair alors le chiffre 8 reste inchangé, si le chiffre suivant est impair alors le chiffre 8 devient (-2) et on ajoutera alors une retenue de 1 au chiffre suivant.
Si le chiffre est un 9 alors il deviendra (-1) et on ajoutera alors une retenue de 1 au chiffre suivant.
En résumé :
************
0,1 ou 4 restent inchangés
6 devient (-4) et 9 devient (-1) toujours
2 devient (-8) et 8 devient (-2) et 3 devient (-7) et 7 devient (-3) et 5 devient (-5) si le chiffre suivant est impair sinon restent inchangés
Quand on transforme un chiffre en négatif, on oublie pas d'ajouter une retenue de 1 au chiffre suivant !
Exemples :
---------------
139 = 100+20+10+8+1 (réécriture brute en cinq termes)
139 = 100+40-1 (réécriture optimale en trois termes)
157 = 100+40+10+4+2+1 (réécriture brute en six termes)
157 = 200-43 = 200-40-2-1 (réécriture optimale en quatre termes)
87 = 80+4+2+1 (réécriture brute en quatre termes)
87 = 80+8-1 (réécriture optimale en trois termes)
38 = 20+10+8 (réécriture brute en trois termes)
38 = 40-2 (réécriture optimale en deux termes)
donc j'encadre d'abord le nombre entre deux nombres de la forme 1*10^k, 2*10^k, 4*10^k ou 8*10^k et je prend la valeur la plus proche.
Par exemple, avec 497 537 :
on a 400 000 <= 497 537 <= 800 000
comme 497 537 est plus proche de 400 000 que de 800 000 je choisis 400 000 :
497 537 = 400 000 + 97 537.
ensuite 80 000 <= 97 537 <= 100 000
comme 97 537 est plus proche de 100 000 que de 80 000, je choisis 100 000 :
497 537 = 400 000 + 100 000 - 2463
2463 est plus proche de 2000 que de 4000 donc :
497 537= 400 000 + 100 000 - 2000 - 463.
463 est plus proche de 400 que de 800 donc :
497 537 = 400 000 + 100 000 - 2000 - 400 - 63.
63 est plus proche de 80 que de 40 donc :
497 537 = 400 000 + 100 000 - 2000 - 400 - 80 + 17.
17 est plus proche de 20 que de 10 :
497 537 = 400 000 + 100 000 - 2000 - 400 - 80 + 20 - 3.
La table :
0 mod 10 -> 0
1 mod 10 -> 1
02 mod 20 -> 2
12 mod 20 -> -8
03 mod 20 -> 3 (1+2)
13 mod 20 -> -7 (1-8)
4 mod 10 -> 4
05 mod 20 -> 5 (1+4)
15 mod 20 -> -5 (-1-4)
6 mod 10 -> -4
07 mod 20 -> 7 (8-1)
17 mod 20 -> -3 (-1-2)
08 mod 20 -> 8
18 mod 20 -> -2
9 mod 10 -> -1
Si je lis bien, ça revient à aller au multiple de 10 le plus proche, et si il y a égalité, aller à celui qui est un multiple de 20.
Donc le "coût moyen d'un chiffre" est de 56/55 = 1.0181818...
Yn : le nombre de cas où on laisse un 10^n inconditionnellement
Zn : le nombre de cas où on laisse un 10^n si le chiffre suivant est impair
X1 = 12 ; Y1 = 2 ; Z1 = 5
Pour calculer X (n+1), on a déjà besoin de 10*Xn pour retirer tous les trucs mod 10^n ; et on se retrouve avec un d*10^n où d a la distribution suivante :
0 * (10^n-Yn)
1,3,5,7,9 * (10^n-Zn)
2,4,6,8 * (10^n+Zn)
10 * (Yn+Zn)
Le coût est de 1 pour d=1,2,4,6,8,9 et de 2 pour d=3,5,7,
On a donc X (n+1) = 10*Xn + 12*10^n - 4 * Zn
On se retrouve automatiquement avec un 10^(n+1) lorsque d=6,9,10 donc Y(n+1) = Yn+Zn+2*10^n
et conditionnellement selon la parité du chiffre suivant lorsque d=2,3,5,7,8 donc Z(n+1) = -Zn + 5*10^n
Le coût total est de Xn + Yn
X0 = 0 ; Y0 = 0 ; Z0 = 0 --> 0
X1 = 12 ; Y1 = 2 ; Z1 = 5 --> 14
X2 = 220 ; Y2 = 27 ; Z2 = 45 --> 247
X3 = 3220 ; Y3 = 272 ; Z3 = 455 --> 3492
...
On prouve facilement que Zn = (5/11) * (10^n - (-1)^n) ,
puis que Yn = (-11 + 6* 10^n + 5* (-1)^n) /22
puis que Xn = (56/55) * n*10^n + (20/121) * (10^n - (-1)^n)
Donc finalement le cout total est Xn+Yn = (-1/2) + (56/55) * n*10^n + (53/121)*10^n + (15/242)*(-1)^n
Commentaires
Merci pour ce partage et bon courage à tous ceux qui souhaitent apprendre cette méthode. Je reste disponible si vous rencontrez quelques difficultés et/ou souhaitez obtenir des informations complémentaires.