Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1775 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  multiplication, division, soustraction et modulo en base x

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

multiplication, division, soustraction et modulo en base x

n°373650
blackgodde​ss
vive le troll !
Posté le 28-04-2003 à 00:27:32  profilanswer
 

Bonjour, je cherche des algos (les plus optimisés possibles) pour les multiplication, division, soustraction et modulo en base x.
 
je n'espere pas un truc tout fait, mais n'importe quelle piste serait la bienvenue.
 
merci :)


---------------
-( BlackGoddess )-
mood
Publicité
Posté le 28-04-2003 à 00:27:32  profilanswer
 

n°374742
Deaddy
Posté le 28-04-2003 à 16:15:24  profilanswer
 

drole d'idée ! tu veux pas plutot convertir tes nombres de base x en entier, faire tes calculs, puis revenir en base x ?

n°374939
blackgodde​ss
vive le troll !
Posté le 28-04-2003 à 17:33:39  profilanswer
 

euh ... en fait je cherche a manipuler des gds nombres. j'ai donc pensé a mettre plusieurs nombres (de type unsigned long en c, donc codés sur 32bits et non signés) les 1 a la suite des autres. pour faire une opération, je dois donc calculer comme si c'etait en base 2^32 il me semble donc ?


---------------
-( BlackGoddess )-
n°374954
Taz
bisounours-codeur
Posté le 28-04-2003 à 17:46:11  profilanswer
 

oui. moi aussi, j'ai déjà pensé à ce genre d'implémentation, mais j'ai préféré l'implémentation à base de string
 
y a pas de recette miracle. addition et soustraction, à la main
 
mutliplication indienne
et division avec soustraction successive, j'ai pas trouvé d'autres moyens

n°375528
blackgodde​ss
vive le troll !
Posté le 29-04-2003 à 09:18:11  profilanswer
 

a base de strings ... chaque caractère représente un chiffre de 0 à 9 ou tu as utilisé un caractère comme un nombre de 0 à 255 ? (ou -128 à 127)
 
et sinon pourrais-tu m'expliquer la division par soustraction successive et la multiplication indienne stp ?


---------------
-( BlackGoddess )-
n°375552
LeGreg
Posté le 29-04-2003 à 09:31:15  profilanswer
 

tu te souviens comment tu faisais tes multiplications et divisions en primaire?
 
ben tu fais pareil sauf qu'a les faire en base 10 tu les fais
en base x
 
LeGreg

n°375625
Deaddy
Posté le 29-04-2003 à 10:17:48  profilanswer
 

c simple tu fais comme à la main (au cm2)  ;)  
 
voici un exemple d'implémentation en base 2^32, sur du 128 bits, pour l'addition, soustraction, multiplication (je t'ai pas fais la division quand meme!)
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. void zero(unsigned int *x)
  4. {
  5. __asm
  6. {
  7.  mov edi,x
  8.  xor eax,eax
  9.  mov ecx,4
  10.  rep stosd
  11. }
  12. }
  13. void mov(unsigned int *x,unsigned int *y)
  14. {
  15. __asm
  16. {
  17.  mov esi,y
  18.  mov edi,x
  19.  mov ecx,4
  20.  rep movsd
  21. }
  22. }
  23. void add(unsigned int *x,unsigned int *y)
  24. {
  25. __asm
  26. {
  27.  mov esi,y
  28.  mov edi,x
  29.  mov eax,[esi]
  30.  add [edi],eax
  31.  mov eax,[esi+4]
  32.  adc [edi+4],eax
  33.  mov eax,[esi+8]
  34.  adc [edi+8],eax
  35.  mov eax,[esi+12]
  36.  adc [edi+12],eax
  37. }
  38. }
  39. void sub(unsigned int *x,unsigned int *y)
  40. {
  41. __asm
  42. {
  43.  mov esi,y
  44.  mov edi,x
  45.  mov eax,[esi]
  46.  sub [edi],eax
  47.  mov eax,[esi+4]
  48.  sbb [edi+4],eax
  49.  mov eax,[esi+8]
  50.  sbb [edi+8],eax
  51.  mov eax,[esi+12]
  52.  sbb [edi+12],eax
  53. }
  54. }
  55. void main()
  56. {
  57. unsigned int a[4],b[4];
  58. int i;
  59. zero(a);
  60. zero(b);
  61. a[3]=0x01234567; a[2]=0x88889999; a[1]=0xaabbccdd; a[0]=0x87654321;
  62. b[0]=0x00010000;
  63. printf("    a = %08X %08X %08X %08X\n",a[3],a[2],a[1],a[0]);
  64. printf("    b = %08X %08X %08X %08X\n",b[3],b[2],b[1],b[0]);
  65. add(a,b);
  66. printf("  a+b = %08X %08X %08X %08X\n",a[3],a[2],a[1],a[0]);
  67. sub(a,b);
  68. printf("a+b-b = %08X %08X %08X %08X\n",a[3],a[2],a[1],a[0]);
  69. // multiplication
  70. unsigned int l00[4],l01[4],l02[4],l03[4];
  71. unsigned int l10[4],l11[4],l12[4],l13[4];
  72. unsigned int l20[4],l21[4],l22[4],l23[4];
  73. unsigned int l30[4],l31[4],l32[4],l33[4];
  74. for (i=0;i<4;i++)
  75. {
  76.  l00[i]=l01[i]=l02[i]=l03[i]=0;
  77.  l10[i]=l11[i]=l12[i]=l13[i]=0;
  78.  l20[i]=l21[i]=l22[i]=l23[i]=0;
  79.  l30[i]=l31[i]=l32[i]=l33[i]=0;
  80. }
  81. __asm
  82. {
  83.  // ligne 0
  84.  mov ebx,b[0]
  85.  mov eax,a[0]
  86.  mul ebx
  87.  mov l00[4],edx
  88.  mov l00[0],eax
  89.  mov eax,a[4]
  90.  mul ebx
  91.  mov l01[8],edx
  92.  mov l01[4],eax
  93.  mov eax,a[8]
  94.  mul ebx
  95.  mov l02[12],edx
  96.  mov l02[8],eax
  97.  mov eax,a[12]
  98.  mul ebx
  99.  mov l03[12],eax
  100.  //ligne 1
  101.  mov ebx,b[4]
  102.  mov eax,a[0]
  103.  mul ebx
  104.  mov l10[8],edx
  105.  mov l10[4],eax
  106.  mov eax,a[4]
  107.  mul ebx
  108.  mov l11[12],edx
  109.  mov l11[8],eax
  110.  mov eax,a[8]
  111.  mul ebx
  112.  mov l12[12],eax
  113.  // ligne 2
  114.  mov ebx,b[8]
  115.  mov eax,a[0]
  116.  mul ebx
  117.  mov l20[12],edx
  118.  mov l20[8],eax
  119.  mov eax,a[4]
  120.  mul ebx
  121.  mov l21[12],eax
  122.  //ligne 3
  123.  mov ebx,b[12]
  124.  mov eax,a[0]
  125.  mul ebx
  126.  mov l30[12],eax
  127. }
  128. mov(a,l00);
  129. add(a,l01);
  130. add(a,l02);
  131. add(a,l03);
  132. add(a,l10);
  133. add(a,l11);
  134. add(a,l12);
  135. add(a,l20);
  136. add(a,l21);
  137. add(a,l30);
  138. printf("  a*b = %08X %08X %08X %08X\n",a[3],a[2],a[1],a[0]);
  139. getch();
  140. }


Message édité par Deaddy le 29-04-2003 à 10:19:09
n°375862
Evadream -​jbd-
Posté le 29-04-2003 à 12:23:08  profilanswer
 

Pour la multiplication à l'indienne, fais une recherche sur google avec Multiplication et Karatsuba.
 
Dans un premier temps, il faut que tu choisisses le mode de réprésentation de tes nombre : Big Endian ou Little Endian.  
 
Le mode Little Endian est celui que nous utilisons tous les jours, par exemple mille deux cents cinquante deux sera érit comme ca : 1252.  
 
En Big Endian, ca donne 2521. Avec une représenation à base de string, ou liste, c'est moins cher en temps pour gérer le propagation de retenue (de proche en proche) plutot que d'aller au fond de ta liste. Tu peux aussi faire une liste doublement chainée avec un pointeur sur la tete et un sur la queue, mais ca fait un peu lourd je trouve :)
 
Je pense qu'en faisant un peu de recherche tu trouveras ton bonheur. Il faut juste s'habituer à faire des opérations dans n'importe quelle base, ca ne change rien :)
 
 
 
Par exemple, A et B sont deux nombres en base X composés des chiffres a4a3a2a1 et b4b3b2b1, on va les additions. Soit r0 la retenue "entrante", nulle.
 
Si b1+a1+r0 = RES >= X, alors on garde le reste de la division entiere entre RES et X, sinon, on garde RES. La retenue suivante est alors le résultat est celui de la division entiere de RES et X. Et ainsi de suite...
 
Un petit exemple, avec 2 nombres en base 10.
 
 


  15
+ 8
---
 
5 + 8 = 13 > 10,  On garde RES mod X = 3 et on génére une retenue de 13/10 = 1.
1 + 1 = 2
 
=> 23 :)


 
Voilà le principe !
 
@+


Message édité par Evadream -jbd- le 29-04-2003 à 12:24:23
n°376052
blackgodde​ss
vive le troll !
Posté le 29-04-2003 à 14:14:26  profilanswer
 

pour l'addition, j'y etais deja arriver avec du code (tres peu portable car que en BigEndian) : j'avais aussi un pricinpe de retenue : lorsque j'ajoute le nombre de gauche de chaque nombre, je stock le résultat dans une variable de 64bits, et les 32 bits 'bas' font le résultat, et les 32 'hauts' font la retenue.
 
legreg : je risque de faire un dépassement de capacité avec une multiplication comme en primaire : lorsque je multiplie 2 long, la valeur doit etre tenue ds un int64. le probleme est que si les 2 long ont déja la valeur max, l'int64 aussi. si il y a une retenue, bam ...


---------------
-( BlackGoddess )-
n°376054
blackgodde​ss
vive le troll !
Posté le 29-04-2003 à 14:15:01  profilanswer
 

(je me plonge de suite dans le décryptage du code asm ... :) )


---------------
-( BlackGoddess )-
mood
Publicité
Posté le 29-04-2003 à 14:15:01  profilanswer
 

n°376063
blackgodde​ss
vive le troll !
Posté le 29-04-2003 à 14:17:27  profilanswer
 

en tout cas merci beaucoup pour vos réponses :)


---------------
-( BlackGoddess )-
n°376999
Deaddy
Posté le 29-04-2003 à 19:12:40  profilanswer
 


un peu d'explication sur mon post précedent
// addition
add     dest,src        : dest=dest+src
                        s'il y a dépassement CF=1 (carry flag), 0 sinon
 
adc     dest,src        : dest=dest+src+CF
                        s'il y a dépassement CF=1 (carry flag), 0 sinon
 
CF(2)           CF(1)           CF(0)
 
a[3]            a[2]            a[1]            a[0]
b[3]            b[2]            b[1]            b[0]
---------------------------------------------------------
a[3]+b[3]+CF    a[2]+b[2]+CF    a[1]+b[1]+CF    a[0]+b[0]
 
 
CF(3) perdu (pourrait servir à detecter le depassement)
 
 
//soustraction
sub     dest,src        : dest=dest-src
                        s'il y a dépassement CF=1 (carry flag), 0 sinon
 
sbb     dest,src        : dest=dest-src-CF
                        s'il y a dépassement CF=1 (carry flag), 0 sinon
   
même principe que pour l'addition
 
 
 
// multiplication
 
mul     dest          : R = EDX:EAX = eax * dest
                        eax, edx, dest: 32 bits
                        R = EDX:EAX : 64 bits
                        EDX=HI(R) , EAX=LO(R)
   
   
        A3              A2              A1              A0
x      B3              B2              B1              B0
---------------------------------------------------------------
+        0               0            HI(X00)         LO(X00)     = l00
+        0            HI(X01)         LO(X01)            0         = l01  
+     HI(X02)         LO(X02)            0               0         = l02
+     LO(X03)            0               0               0         = l03
---------------------------------------------------------------
+        0            HI(X10)         LO(X10)            0         = l10
+     HI(X11)         LO(X11)            0               0         = l11
+     LO(X12)            0               0               0         = l12
---------------------------------------------------------------
+     HI(X20)         LO(X20)            0               0         = l20
+     LO(X21)            0               0               0         = l21
---------------------------------------------------------------
+     LO(X30)            0               0               0         = l30
---------------------------------------------------------------
 
 
 
Xij = Aj * Bi (64bits)  
lij : resultat (128bits) d'une multiplication élémentaire (cf ci-dessus)
 
le résultat de la multiplication est la somme de tous les lij.


Message édité par Deaddy le 29-04-2003 à 19:44:10
n°377012
Deaddy
Posté le 29-04-2003 à 19:19:55  profilanswer
 

au secours le formattage !!
(j'ai essayé fixed cpp, et leurs combinaisons mais rien)
 
[edit] ouf j'ai réussi (après un quart d'heure de padding avec des espaces)


Message édité par Deaddy le 29-04-2003 à 19:34:03
n°377025
LeGreg
Posté le 29-04-2003 à 19:28:50  profilanswer
 

BlackGoddess a écrit :


legreg : je risque de faire un dépassement de capacité avec une multiplication comme en primaire : lorsque je multiplie 2 long, la valeur doit etre tenue ds un int64. le probleme est que si les 2 long ont déja la valeur max, l'int64 aussi. si il y a une retenue, bam ...


 
eh oh ! je parle de multiplication en base x
pas de multiplication en base long !
 
LeGreg

n°377179
blackgodde​ss
vive le troll !
Posté le 29-04-2003 à 22:07:26  profilanswer
 

merci Deaddy pour l'explication lol, j'avais du mal a comprendre le code :)
 
pour la multiplication avec l'algo Karatsuba, je suis tjs en train d'essayer de comprendre ... je vais bien finir par y arriver :)


---------------
-( BlackGoddess )-
n°377185
Evadream -​jbd-
Posté le 29-04-2003 à 22:14:05  profilanswer
 

Le truc qu'il faut comprendre pour Karatsuba, c'est la gain d'une multiplication par rapport au raisonnement naif, ce n'est pas juste le fait de faire ca par dichotomie qui te permet de gagner en complexité. ( Théoriquement, on passe d'un complexité quadratique  une complexité en n^1.57 si mes souvenirs sont bons)
 
A+

n°377188
Taz
bisounours-codeur
Posté le 29-04-2003 à 22:15:05  profilanswer
 

ché aps j'ai pas la calculette mais je dirai log2(n)

n°377192
Evadream -​jbd-
Posté le 29-04-2003 à 22:20:50  profilanswer
 

n^(log en base de 2 de 3), j'ai retrouvé le résultat !
 
Edit : il doit surement y avoir plusieurs implémentations de Karatsuba, le résultat que j'ai donné correspond à la seule que j'ai vu, ptetre la version pédagogique :)


Message édité par Evadream -jbd- le 29-04-2003 à 22:23:33
n°377198
Taz
bisounours-codeur
Posté le 29-04-2003 à 22:24:54  profilanswer
 

sur? ça fait beaucoup quand meme. moi je maintiens un cout logarithmique

n°377206
Evadream -​jbd-
Posté le 29-04-2003 à 22:34:43  profilanswer
 

En me basant sur cette page :
 
http://gersoo.free.fr/docs/karat/kar.html
 
Ce que j'ai dit semble correct !

n°377209
Taz
bisounours-codeur
Posté le 29-04-2003 à 22:37:48  profilanswer
 

ah je croyais que tu parlais de ma méthode indienne

n°377214
Evadream -​jbd-
Posté le 29-04-2003 à 22:43:07  profilanswer
 

[:alphat] Je n'avais pas compris. En fait depuis le début je pense que méthode indienne = Karatsuba :D

n°377232
blackgodde​ss
vive le troll !
Posté le 29-04-2003 à 22:53:28  profilanswer
 

++Taz pourrais-tu décrire la méthode indienne alors stp ?


---------------
-( BlackGoddess )-
n°377282
Taz
bisounours-codeur
Posté le 29-04-2003 à 23:25:55  profilanswer
 

Code :
  1. def multIndienne(a, b):
  2.     def multR(x, y):
  3.         print x, y
  4.         if x==1:
  5.             return y
  6.        
  7.         if x%2==0:
  8.             return multR(x/2, y*2)
  9.         else:
  10.             return y + multR((x-1)/2, y*2)
  11.     if a<b:
  12.         return multR(a, b)
  13.     else:
  14.         return multR(b, a)


 
c'est comme ça que c'est fait en hardware, par ce que %2, *2 et /2 sont trivial, le reste c'est une additiob
 
et la il me semble bien que c'est log2(n), avec n la plus petite des 2 operandes

n°377300
blackgodde​ss
vive le troll !
Posté le 29-04-2003 à 23:42:45  profilanswer
 

d'accord, merci :)


---------------
-( BlackGoddess )-
n°377357
blackgodde​ss
vive le troll !
Posté le 30-04-2003 à 00:21:53  profilanswer
 

pour le modulo, j'ai pensé faire la division (vu que c'est des entiers, mon algo arrondi a l'entier inférieur), puis refaire la multiplication et voir la difference.
 
par exemple :
 
a mod b  
-> c = a/b
   d = c*b
   resultat = a-d
 
existe-t-il une manière plus optimisée ?


---------------
-( BlackGoddess )-
n°377404
Evadream -​jbd-
Posté le 30-04-2003 à 02:57:57  profilanswer
 

BlackGoddess > j'ai du mal à saisir l'intérêt de ta manip en fait :/
 
++Taz > J'ai tenté d'implémenter sur des listes de caractères la multiplication indienne, mais ca me donne des trucs comme ca :
 
En rouge Karatsuba et en vert la méthode Indienne. En abscisse, la taille des entiers, et en ordonnée le temps en secondes.
 
Voici pour des grands entiers avec moins de 1000 digits, on sent  que l'indienne faiblie :
 
http://evadream.free.fr/files/hfr/karaindi2.png  
 
Voici pour des grands entiers avec moins de 5000 digits :
 
http://evadream.free.fr/files/hfr/karaindi.png
 
Je me suis basé sur ton algo et j'ai implémenté ca à la suite d'un projet sur Karatsuba fait en OCaml, voic un bout de code, qui se calque sur ce que tu as donner :
 

Code :
  1. let multI a b =
  2.  
  3.    let rec multR(x, y) =
  4.        match x with
  5.         | Zero -> Zero
  6. | Num(1,Zero) -> y
  7. | _ ->
  8.  begin
  9.           if ( (modBin2 x) = 0) then multR( (binDiv2 x), (binMult2 y) )
  10.           else let newres = multR( binDiv2(binMinus1 x), binMult2 y)
  11.                     in add_with_carry(y, newres, 0, 2)
  12.       end
  13.    in
  14.    let res = compareNumber a b in
  15.    if res = -1 then
  16.        multR(a, b)
  17.    else
  18.        multR(b, a);;

 
 
modBin2, binMult2, binMinus1 et binDiv2 sont implémentées de la facon suivante :
 

Code :
  1. let modBin2 a =
  2. match a with
  3.     | Zero -> 0
  4.     | Num(a,_) -> if a = 0 then 0 else 1     
  5. let binMult2 a =
  6. zero(a,1)  (*ajout des zeros en tete (Big Endian) *)
  7. let binDiv2 a =
  8. match a with
  9.  | Zero -> Zero
  10.  | Num(a, Num(r,s) ) -> Num(r,s) (* decal à droite, donc à gauche en BigEndian *)
  11.  | Num(a,Zero) -> Zero
  12. let binMinus1 a =      (* pour faire le -1 *)
  13. match a with
  14.  | Zero -> failwith "never append"
  15.  | Num(a,r) -> Num(0,r)


 
 
MMmmmm... en tapant je réfléchis à compareBigInteger qui coute cher, mais elle n'est executé qu'une seule fois... (elle part au fond de la liste et la remonte jusque trouvé deux digits différents)...
 
Je vois pas trop comment améliorer cà, ca semble moins performant que Karatsuba.  
 
Si tu as le temps, vois tu ou ca pourrais coincé ?
 
Merci à toi !
 
@+


Message édité par Evadream -jbd- le 30-04-2003 à 02:59:42
n°377459
Taz
bisounours-codeur
Posté le 30-04-2003 à 08:56:05  profilanswer
 

ben c'est un problème d'implémentation, par ce que ln(n)/ln(2) < n*ln(2)
 
le truc c que si tu fournit pas de décalage rapide, la méthode n'a plus d'interet. cependant, tu vois que ça a quand meme un bonne efficité: c'est un bon cas pour faire un strategy pattern avec une factory
 
edit: le mieux ça serait que tu utilises un profiler pour voir ou ça coince.
 
le truc sera sans doute de reduire tes appels à Num. J'ai du mal à te lire, mais si ta division est entiere, tu peux allègrement te passer soustraction. c'est déjà àa de gagner


Message édité par Taz le 30-04-2003 à 09:26:23
n°378052
blackgodde​ss
vive le troll !
Posté le 30-04-2003 à 12:55:53  profilanswer
 

je n'arrive pas à faire de division ni de modulo :(
 
j'ai entendu parler de l'algorithme de newton
http://www.haypocalc.com/grandnbr/division.php
mais je n'ai pas compris :(
 
sinon, par soustractions successives, imaginons un tres grand nombre à diviser par 2, si on fait une boucle qui enleve 2 a chaque fois au dividende et rajoute 1 au quotien, jusqu'à ce que le diviseur (2) soit supérieur au dividende, ca prend un temps enorme ... je suppose qu'il doit etre possible de faire justement des divisions triviales par 2 pour n'importe quel diviseur, mais je n'arrive pas a trouver d'algo ...


---------------
-( BlackGoddess )-
n°378076
Evadream -​jbd-
Posté le 30-04-2003 à 13:19:15  profilanswer
 

++Taz a écrit :

ben c'est un problème d'implémentation, par ce que ln(n)/ln(2) < n*ln(2)
 
le truc c que si tu fournit pas de décalage rapide, la méthode n'a plus d'interet. cependant, tu vois que ça a quand meme un bonne efficité: c'est un bon cas pour faire un strategy pattern avec une factory
 
edit: le mieux ça serait que tu utilises un profiler pour voir ou ça coince.
 
le truc sera sans doute de reduire tes appels à Num. J'ai du mal à te lire, mais si ta division est entiere, tu peux allègrement te passer soustraction. c'est déjà àa de gagner


 
Merci pour tes remarques.
Num n'est pas une fonction, mais juste un descripteur du type récursif Num.
 
Pour les décalagages rapides, je ne pense pas pouvoir aller plus rapidement, ces opérations ayant un cout en 0(1).
 
(Re)Edit : Bin2Mult est maintenant aussi en O(1).
 
Je vais voir ca avec un profiler, ca va me permettre d'en utiliser un pour la première fois en caml :)
 
@+


Message édité par Evadream -jbd- le 30-04-2003 à 13:33:43
n°378586
Taz
bisounours-codeur
Posté le 30-04-2003 à 16:14:24  profilanswer
 

BlackGoddess a écrit :

je n'arrive pas à faire de division ni de modulo :(
 
j'ai entendu parler de l'algorithme de newton
http://www.haypocalc.com/grandnbr/division.php
mais je n'ai pas compris :(
 
sinon, par soustractions successives, imaginons un tres grand nombre à diviser par 2, si on fait une boucle qui enleve 2 a chaque fois au dividende et rajoute 1 au quotien, jusqu'à ce que le diviseur (2) soit supérieur au dividende, ca prend un temps enorme ... je suppose qu'il doit etre possible de faire justement des divisions triviales par 2 pour n'importe quel diviseur, mais je n'arrive pas a trouver d'algo ...

j'en parlais avec nraynaud l'autre jour: apparemment il n'existe pas d'algorithme vraiment bon pour la division

n°378660
blackgodde​ss
vive le troll !
Posté le 30-04-2003 à 16:44:43  profilanswer
 

ah :(
 
est-il possible de trouver le reste d'une division sans la faire ?


---------------
-( BlackGoddess )-
n°378721
Taz
bisounours-codeur
Posté le 30-04-2003 à 17:26:13  profilanswer
 

je pense pas. cela dit si je relis ta question, ç ame parait evident que non

n°378918
blackgodde​ss
vive le troll !
Posté le 30-04-2003 à 20:33:40  profilanswer
 

je demande juste lol, il me semblait aussi, mais des fois que qq1 connaisse un algo :)


---------------
-( BlackGoddess )-
n°378985
LeGreg
Posté le 30-04-2003 à 20:58:38  profilanswer
 

Oui si c'est une division par une puissance de x
si x est la base dans laquelle le nombre est exprimé..
 
Ceci dit si tu reflechis bien ca veut dire que
la division a deja ete faite (une division par puissance de x pour obtenir le chiffre correspondant).
 
Sinon en base x tu peux aussi obtenir le reste
de la division par (x-1) en faisant la somme des chiffres de ce nombre dans cette base.
 
LeGreg

n°572898
Riot
Buy me a riot
Posté le 21-11-2003 à 21:32:22  profilanswer
 

pour la division (avec des soustractions successives):
petit exemple:
14/3:
_ 14-3=11 (1 soustr)
_ 11-3=8  (2soustr)
_ 8-3=5   (3soustr)
_ 5-3=2    (4soustr, reste 2)
--> donc 14/3=4 (car on a effectué 4soustr) , reste 2
 
de plus on a 14%3 (modulo) ==2
 
++

n°572901
Taz
bisounours-codeur
Posté le 21-11-2003 à 21:34:49  profilanswer
 

maicaisupair, moi qui croyais que tu uppais pour me fêter mon anniversaire un peu en retard ...

n°572921
Riot
Buy me a riot
Posté le 21-11-2003 à 22:04:13  profilanswer
 

euh... ton anniv en tant que Taz, en tant qu'ex modo, ou dans la vie civile???
dans tous les cas, bon anniv :D

n°578686
Riot
Buy me a riot
Posté le 28-11-2003 à 22:24:28  profilanswer
 

pour une addition binaire:
vous en pensez quoi???
 
donc on fait res = A + B

Code :
  1. somme <- 0
  2. retenue <- 0
  3. pour i<-0 à n+1 faire
  4.   somme <- A[i] ^ B[i];   // ^ c un xor
  5.   res[i] <- somme ^ retenue;
  6.   retenue <- (A[i] & B[i]) ^ retenue;   // & c un et
  7. fin pour


 :hello:


Message édité par Riot le 28-11-2003 à 22:25:25
n°579077
Riot
Buy me a riot
Posté le 29-11-2003 à 21:36:21  profilanswer
 

c si nul que ça??? :?

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  multiplication, division, soustraction et modulo en base x

 

Sujets relatifs
Création d'une appli avec base de données de film avi[PHP/MYSQL] Creer une base de donnés MYSQL en php , sans php my admin?
Recherche base de donnéesSe connecter à une base ACCESS ?
erreur d'ouverture de base accessbesoins de conseil sur base de donnée
adressage indexé et basé...lire dans la base de registre !
Base PARADOXCréer une base de données
Plus de sujets relatifs à : multiplication, division, soustraction et modulo en base x


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR