Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#26 17-09-2008 12:24:58
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 992
Re : compression du calcul binaire
Bonjour,
Et bien en base seize, tu ajoutes les "chiffres" A, B, C, D, E, F..
Et comme le langage de programmation ne peut importer les lettres comme des chiffres directement, il faut commencer par extraire chaque "chiffre" des nombres les ranger dans deux tableaux (ou des listes avec Python)...
Ensuite il faut les additionner un par un et il y a 128 possibilités à chaque fois.
On peut raccourcir un peu en testant si la somme est inférieure à 10 auquel, on la fait telle quelle...
Sinon il faut tester chaque cas un par un via une boucle et, une fois l'occurence trouvée, extraire la bonne somme, tester s'il y a une retenue et la reporter sur la somme suivante, stocker le résultat dans une 3e liste...
Travail de Romains... A mon avis : le temps de fonctionnement sera prohibitif...
Si j'ai pu le faire en base dix, c'est que je me limitais à l'addition, la soustraction, la multiplication de nombres à 1 chiffre dont les résultats étaient obtenus instantanément...
J'ai plusieurs fers au feu, lorsque j'aurai épongé ce que j'ai à faire, je tenterai la programmation (en attendant je vais y réfléchir à mes moments perdus).
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#27 17-09-2008 12:27:47
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 992
Re : compression du calcul binaire
Bonjour,
Et bien en base seize, tu ajoutes les "chiffres" A, B, C, D, E, F..
Et comme le langage de programmation ne peut importer les lettres comme des chiffres directement, il faut commencer par extraire chaque "chiffre" des nombres les ranger dans deux tableaux (ou des listes avec Python)...
Ensuite il faut les additionner un par un et il y a 128 possibilités à chaque fois.
On peut raccourcir un peu en testant si la somme est inférieure à 10 auquel, on la fait telle quelle...
Sinon il faut tester chaque cas un par un via une boucle et, une fois l'occurence trouvée, extraire la bonne somme, tester s'il y a une retenue et la reporter sur la somme suivante...
Travail de Romains... A mon avis : le temps de fonctionnement sera prohibitif, trop de tests...
Si j'ai pu le faire en base dix, c'est que je me limitais à l'addition, la soustraction, la multiplication de nombres à 1 chiffre dont les résultats étaient obtenus instantanément...
J'ai plusieurs fers au feu, lorsque j'aurai épongé ce que j'ai à faire, je tenterai la programmation (en attendant je vais y réfléchir à mes moments perdus).
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#28 18-09-2008 14:08:13
- sinuspax
- Membre
- Inscription : 19-08-2008
- Messages : 47
Re : compression du calcul binaire
Un travail de romain, certes, mais combien gratifiant. 128 opérations basiques à mémoriser par type d'opération, ce n'est pas la mer à boire, d'autant plus que la grandeur des nombres n'influe pas sur la table. Un processeur pourrait peut-être enfin calculer à notre image.
Pour l'opération 17 x 18 en base 16, on aurait :
00010001 x 00010010 =
1) 0010 x 0001 = 0010 (table)
2) 0010 x 0001 = 0010 (table)
3) 0001 x 0001 = 0001 (table)
4) 0001 x 0001 = 0001 (table)
000000100010
00010001
000100110010 = 132 (306).
Evidemment, pas de retenue ici. En base 16, voire en base 256, la vitesse de calcul des processeurs serait bien supérieure (en dépit des retenues). Reste à résoudre le problème du stockage des grands nombres. Mais là aussi des solutions seront trouvées (je suis un optimiste).
Hors ligne
#29 18-09-2008 14:15:06
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 992
Re : compression du calcul binaire
Re,
Encore une fois, ce que tu fais c'est de la base deux....
Voilà des calculs en base seize :
Ton exemple Autre exemple
11 3AF (943)
x 12 X E5D (3677)
--------- ---------------
22 2FE3
11 126B
-------- 3392
132 -------------
34E893 (3467411)
Quant à "ça n'est pas la mer à boire", tu ne dois avoir aucune idée du temps pris par les tests avant de tomber sur le bon produit, puis de la bonne somme dans l'exécution d'un programme...
Si tu en doutes, vas-y, lance-toi !
@+
Dernière modification par yoshi (18-09-2008 15:56:04)
Arx Tarpeia Capitoli proxima...
Hors ligne
#30 19-09-2008 09:17:38
- sinuspax
- Membre
- Inscription : 19-08-2008
- Messages : 47
Re : compression du calcul binaire
Salut,
Je crois qu'il y a un quiproquo. Il me semble qu'on parle de langage machine (écriture binaire). Je parle de base 16 en langage machine, non en langage alphanumérique.
Dans l'opération :
00000001 x 00010010 (11 x 12)
J'ai multiplié entre eux les quartets, non les bits, c'est donc bien de base 16 dont il s'agit (j'ai pris exprès un exemple simple). En base 2, j'aurais multiplié entre eux seulement les bits. L'opération aurait été beaucoup plus longue.
Base 16 en binaire :
0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = A
1011 = B
1100 = C
1101 = D
1110 = E
1111 = F
00010000 = 10
...
Donc, ton opération s'écrit (en langage machine) :
001110101111 x 111001011101
Là aussi, je multiplierai entre eux les quartets, non les bits. D'où la nécessité de mémoriser toutes les opérations de quartet à quartet. Mais peut-être que c'est impossible.
Désolé pour "la mer à boire".
Dernière modification par sinuspax (19-09-2008 18:07:27)
Hors ligne
#31 19-09-2008 12:01:57
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 992
Re : compression du calcul binaire
Bonjour,
Et moi je parle de calculs en base seize pure, sans autre recours à une base quelconque, d'où la nécessité de stocker la table de X et celle de +...
Encore une fois lorsqu'on programme en assembleur, tout est écrit en base seize, nombres comme instructions, le processeur n'effectue aucun calcul autre qu'en base deux, la base seize est juste une "commodité" d'écriture pour le programmeur.
Le processeur dispose d'un jeu d'instructions (ce que j'appelle routine) stockées dans une ou plusieurs zones (regitres) accessibles en lecture seule et d'autres zones dévolues au stockage temporaire.
Un exemple de langage machine (pour le processeur Z80 qui équipait notamment l'Amstrad CPC 6128) :
Adresse Code Mnémonique (en Assembleur) Commentaire
43000 3E,53 LD A,83 d Charge le code ASCII (décimal) de S
43002 CD,5A,BB CALL BB5A Appelle la routine d'affichage
43005 3E,41 LD A,65 d Charge le code ASCII de A
43007 CD,5A,BB CALL BB5A Appelle la routine d'affichage
43010 3E,4C LD A,76 d Charge le code ASCII (hexa) de L
43012 CD,5A,BB CALL BB5A Appelle la routine d'affichage
43015 3E,55 LD A,85 d Charge le code ASCII de U
43017 CD,5A,BB CALL BB5A Appelle la routine d'affichage
43020 3E,54 LD A,84 d Charge le code ASCII (hexa) de T
43022 CD,5A,BB CALL BB5A Appelle la routine d'affichage
43005 C9 RET Retour au programme appelantortie
En utilisant un éditeur Hexadécimal pour explorer les octets du n° 43000 au 43005, on voyait à l'écran :
3E 53 CD 5A BB 3E 41 CD 5A BB 3E 4C CD 5A BB 3E 55 CD 5A BB 3E 54 CD 5A BB C9
On réservait les adresses à partir de 43000, puis à l'aide d'une instruction du BASIC (Poke) on allait déposer ces valeurs aux adresses indiquées, puis en BASIC, on "appelait" l'adresse 43000 avec CALL 43000
Et on avait l'affichage de SALUT, en haut et à gauche de l'écran...
Le programmeur sur papier, utilise les mnémoniques, puis code le tout en Hexa
Ce que je me propose de faire (j'ai déjà mis au point une présentation des tables de X et de + ainsi qu'un moyen d'y accéder, tout se traite en "chaînes de caractères". Reste à mettre au point la technique de la multiplication et celle de l'addition.
Remarque : tout ceci est illusoire, parce que pour fonctionner, Python, fait appel au processeur et tout ce que je demande de faire est interprété...
Voudrais-tu dire que tu proposes d'implanter les tables de x et de + en base seize, en Assembleur, directement dans les zones ad hoc, puis de récrire les différentes opérations moyennant manipulation des instructions adéquates ?
Si oui, alors je n'avais pas compris ce que tu voulais dire et là, ça dépasse et de loin mes capacités...
Un commentaire toutefois ce que tu proposes ci-dessus c'est quand même du recours au binaire... D'autre part, si cela présentait un intérêt de rapidité accrue (et crois-moi, les concepteurs de processeurs y pensent sans arrêt), cela serait déjà fait...
Concernant les tests
Pour les mutiplications de caractères hexadécimaux, j'ai 136 cas (doubles : je stocke par exemple, 5*A et A*5 avec le résultat 32). De même pour l'addition.
Ce que je fais en Python pourrait certainement être fait directement en Assembleur : qui programme de nos jours en Assembleur ? Je crois que Windows est écrit en C, Firefox en XUL... etc
Je dois ensuite à partir d'un produit par exemple 5A * E
1. retrouver d'abord dans ma table E * A (136 tests maximum)
2. tester s'il y a une retenue au résultat, la stocker ou stocker 0
3. passer à 5*E, tester si j'ai deux chiffres au résultat
a) si oui stocker, celui le + à gauche
b) reprendre les le chiffre de droite, ajouter la retenue :
- identification de la bonne somme, l'effectuer stocker le chiffre de gauche ou 0
- effectuer la somme.
Ca en fait des tests !
Si je travaille directement avec des quartets, il faudra comparer quand même ces quartets, et pas d'autre solution que... bit à bit !
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#32 19-09-2008 13:30:42
- sinuspax
- Membre
- Inscription : 19-08-2008
- Messages : 47
Re : compression du calcul binaire
Merci pour tes précisions. Je vais potasser là-dessus. Pour comparer d'éventuels quartets de bits 2 à 2, je m'étais dit qu'on pouvait mémoriser à chaque fois leur somme et leur produit. C'est dommage qu'une super programmation telle que la tienne ne puisse être adaptée au langage machine. Mais probablement mes connaissances en informatique sont insuffisantes pour avoir une idée nette de la chose.
@+
Dernière modification par sinuspax (19-09-2008 13:43:32)
Hors ligne
#33 19-09-2008 18:46:23
- sinuspax
- Membre
- Inscription : 19-08-2008
- Messages : 47
Re : compression du calcul binaire
L'idée est de faire calculer le processeur non plus bit par bit, mais 2 ^ n par 2 ^ n bits.
Par exemple, en base 16, le processeur calculera 4 bits par 4 bits (avec des zéros et des uns, bien sûr, mais ce n'est pas vraiment du binaire).
Reprenons ton opération (X) en binaire, bit par bit :
001110101111
111001011101
001110101111
000000000000
001110101111
001110101111
001110101111
000000000000
001110101111
000000000000
000000000000
001110101111
001110101111
001110101111
001101000101100010010011
Même opération en binaire 4 bits par 4 bits (base 16) :
0011 1010 1111
1110 0101 1101
0010 1111 1110 0011
0001 0010 0110 1011
0011 0011 1001 0010
0011 0100 0101 1000 1001 0011
La deuxième opération me semble quand même plus rapide. Evidemment, il nous faut mémoriser (comme tu le fais en hexa) tous les couples (+ et X) de quartets de bits avec leur résultat.
Est-ce idiot ?
Hors ligne
#34 20-09-2008 08:39:24
- sinuspax
- Membre
- Inscription : 19-08-2008
- Messages : 47
Re : compression du calcul binaire
On pourrait avoir un processeur à plusieurs vitesses. Enfin bon ...
En attendant, pourquoi s'embarrasser de retenues ? Cela fait du stockage, surtout quand la base augmente.
Soit l'opération (+) :
3721
+ 2995
Il suffit d'additionner tel quel en superposant et en décalant de droite à gauche. Si n => 10 on intègre le chiffre qui suit :
6
11
16
5
Ensuite on pose : 5 + 1 / 6 + 1 / 1 / 6 = 6716. Pas de stockage, seulement des opérations simples.
Soit la multiplication :
476
x 35
On multiplie tel quel :
30
35
20
2380
18
21
12
1428
2380
+14280
0
16
5
6
1
16660
On peut effacer les chaînes intermédiaires au fur et à mesure.
Hors ligne
#35 20-09-2008 12:23:51
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 992
Re : compression du calcul binaire
Bonjour,
Ta proposition d'absence de retenue dans la multiplication est connue depuis assez longtemps sous le non de "multiplication arabe". Soit à multiplier 732 par 435 (en base 10) :
x | 4 | 3 | 5 |
---|-------|--------|-------|---------
| \ 8 | \ 6 | \ 0 | \
2 | \ | \ | \ | \
| 0 \ | 0 \ | 1 \ | 0 \
---|-------\-------\--------|-----
| \ 2| \ 9 | \ 5 |\
3 | \ | \ | \ | \
| 1 \ | 0 \ | 1 \ | 2 \
---|------\|-------\-------|-------
| \ 8 | \ 1 |\ 5 | \
7 | \ | \ | \ | \
| 2 \ | 2 \ | 3 \ | 4 \
---|------\------\-------- |--------
= | 3 |\ 1 \| 8 | \
Additions (avec retenues en diagonales)
Résultat : 318420
Arx Tarpeia Capitoli proxima...
Hors ligne
#36 20-09-2008 14:30:06
- sinuspax
- Membre
- Inscription : 19-08-2008
- Messages : 47
Re : compression du calcul binaire
Merci pour l'info (on n'invente que ce qui existe).
Pour la soustraction, c'est un tout petit peu moins simple, mais simple aussi.
3721
- 2995
Si a > b, on fait comme pour l'addition (si n => 10 on intègre le chiffre suivant). Si a > b, pas de problème.
2x10 - (5-1) = 16
2x10 - (9-2) = 13
2x10 - (9-7) = 18
3 - 2 = 1
16
13
18
1
1-1 = 0
8-1 = 7
3-1 = 2
6-0 = 6
726
Est-ce arabe ou chinois ?
Amicalement
Hors ligne
#37 21-09-2008 19:47:56
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 992
Re : compression du calcul binaire
Bonsoir,
Ca s'appellera "Méthode sinus pax"... ;-)
Bon, j'ai écrit ma multiplication en base seize via le langage Python, en faisant appel auxtables de X et de + en base seize : aucun appel à la base dix ou la base deux...
Pour l'instant, c'est assez mal écrit, et ça fonctionne tant que dans la somme des produits partiels (technique classique) je n'ai pas de retenue à deux chiffres, ce qui laisse une marge...
Je vais maintenant me pencher sur le gain de temps et l'optimisation du code...
Intéressé ?
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#38 22-09-2008 13:07:38
- sinuspax
- Membre
- Inscription : 19-08-2008
- Messages : 47
Re : compression du calcul binaire
Intéressé ? Et comment !! (préviens-moi quand ça tournera).
@+
Dernière modification par sinuspax (22-09-2008 13:10:14)
Hors ligne
#39 22-09-2008 14:17:23
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 992
Re : compression du calcul binaire
Bonjour,
Pas de problème, ça tourne proprement...
J'ai ajouté une petite interface avec vérification de la validité des entrées.
On entre multiplicande (1er nombre) et multiplicateur (2e nombre)...
J'ai commenté mon programme pour faciliter sa compréhension.
J'ai testé une multiplication 8 chiffres x 8 chiffres : le résultat vérifié à la calculette windows est bon.
Le programme doit être sans faille, pour autant que dans la somme des produits partiels on n'ait pas une retenue à 2 chiffres...
Ce programme fonctionne via le langage de programmation libre et gratuit : Python, à installer sur sa machine...
Il ne fonctionne pas en assembleur, en binaire, ou autre, mais tout en "chaînes de caractères".
Il commence par créer les tables d'addition et d'addition dans un format exploitable par la suite...
Puis on rentre les nombres...
Il construit alors les produits partiels en commençant par le plus à gauche, et ajoute le nombre de zéros ad hoc à leur droite.
Je cherche en même temps la longueur maximale de ces produits partiels et j'ajoute à gauche le nombre de zéros, pour régler toutes les longueurs sur le maxi.
Ces produits sont concaténés de gauche à droite dans une seule chaîne.
Pour illustrer mon propos, voilà la chaîne finale dans le cas de l'opération présentée en #29 : 392000126B0002FE3
Avec la chaîne finale donnée en exemple :
longueur maxi : 6
nombre de produits : 3
Je pars du caractère n° 6 (de gauche à droite) et je lui ajoute le 12e et le 18e...
Puis je recule d'un cran, j'ajoute le 5e, le 11e et le 17e et la retenue précédente qui si elle n'existe pas vaut 0 par défaut.
En fait, c'est cette addition qui ma fait le plus transpirer...
Bon, si t'en veux, il te faut te procurer Python et l'installer :
http://www.python.org/download/
et cliquer sur cette ligne : Python 2.5.2 (February 22, 2008)
Cela fait, un icône du nom de : IDLE(Python GUI) est créé sur ton bureau...
Déposer le programme Mult_base16.py dans le dossier C:\Python25.
Là deux options :
- soit double-cliquer sur Mult_Base16.py (via l'explorateur)
- soit double-cliquer sur l'icône IDLE, ouvrir File, Cliquer sur Open, double-cliquer sur Mult_base16.py, puis soit clic Run, puis Run Module, soit F5 direct.
Avec IDLE, tu vois la source sans autre forme de procès...
J'ai donc réinventé la roue, puisque la calculette Windows fait ça aussi très bien, mais elle, elle fait du vrai calcul...
J'attends ton feu vert pour te le faire parvenir (pas lourd 2 ko).
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#40 27-09-2008 19:21:53
- sinuspax
- Membre
- Inscription : 19-08-2008
- Messages : 47
Re : compression du calcul binaire
Désolé pour le retard (contretemps bien involontaire). Mais c'est OK pour le programme.
@ +
Hors ligne
#41 27-09-2008 20:42:16
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 992
Re : compression du calcul binaire
Re,
C'est parti...
(Il a légèrement grossi depuis : 5,6 ko)
@+
[EDIT]
Je viens de terminer de passer ce programme de multiplication en mode graphique...
Fais-moi signe si tu ne reçois rien... n'attends pas !
Dernière modification par yoshi (28-09-2008 19:24:14)
Arx Tarpeia Capitoli proxima...
Hors ligne