begin process at 2012 02 09 08:56:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > MULTIPLICATION DE GRANDS NOMBRES

MULTIPLICATION DE GRANDS NOMBRES


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :multiplication, grandsnombres Niveau :Débutant Date de création :26/02/2006 Vu :8 421

Auteur : TRAX44

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

C'est un de mes premiers programme en C.
Il effectue la multiplication de deux nombres quelque soit leur taille. Pour cela il utilise l'algorithme de la multiplication Egyptienne (aussi appelé multiplication Russe). Pour plus  d'information sur l'algorithme : http://www.recreomath.qc.ca/dict_russe_multiplicat ion.htm (n'est pas de moi).

Source

  • /* Exemple avec la multiplication de A=D91097D725BC9C2C et B=2E4376409371327 */
  • #include <stdio.h>
  • #include <stdlib.h>
  • int main () {
  • int a , b , n , i , ii, r;
  • a= 1 ; b = 1 ; /* index supérieur des tableaux respectivement de A et B */
  • unsigned int *A = malloc (sizeof(int)*(a+1)) ;
  • unsigned int *B = malloc (sizeof(int)*(a+b+2)) ;
  • unsigned int *res = malloc (sizeof(int)*(a+b+2)) ;
  • unsigned long long int c;
  • /* A=D91097D725BC9C2C ; B=2E4376409371327 ; répartie dans leur tableau*/
  • A[0]=0x025BC9C2C ; B[0]=0x009371327 ;
  • A[1]=0x0D91097D7 ; B[1]=0x02E43764 ;
  • do {
  • if (A[0]%2==1) {
  • for (i=0 ; i<=b ; i++) {/* addition */
  • c=(long long int)res[i]+(long long int)B[i] ; res[i]=(c&0x0FFFFFFFF) ;
  • n=i ;
  • while(c>>32!=0){
  • n++ ; c=(long long int)res[n]+(long long int)1 ;
  • if(c>>32==0){res[n]++ ;}else{res[n]=0;}
  • }
  • }/* for */
  • }/* if%2 */
  • r=0 ; /* décallage droite */
  • for (ii=0 ; ii<a ; ii++) {
  • r=(A[ii+1]&1)<<31 ; A[ii]=A[ii]>>1 ; A[ii]=A[ii]|r ;}
  • A[a]=A[a]>>1 ; if(A[a]==0){a--;}
  • /* décallage gauche*/
  • if ((B[b]&0x0EFFFFFFF)!=0) {b++ ; }
  • for(ii=b ; ii>=0 ; ii--) {r=(B[ii]&0x0EFFFFFFF)>>31 ; B[ii+1]=B[ii+1]|r ; B[ii]=B[ii]<<1; }
  • }while(a>-1) ;
  • /* 160 premiers bit du résultat obtenue */
  • printf("\n %X%X%X%X%X" ,res[4] , res[3] , res[2] , res[1] ,res[0]) ;
  • /* résultat du test */
  • printf("\n 273A2EE4CD3E67E2EC34BC6D8C70EB4\n") ;
  • free (A) ; free (B) ; free (res) ;
  • return 0 ;
  • } /* main */
/* Exemple avec la multiplication de A=D91097D725BC9C2C et B=2E4376409371327  */

#include <stdio.h> 
#include <stdlib.h>


int main () {

 int a , b , n , i , ii, r; 

a= 1 ; b = 1 ; /* index supérieur des tableaux respectivement de A et B */
unsigned int *A = malloc (sizeof(int)*(a+1)) ; 
unsigned int *B = malloc (sizeof(int)*(a+b+2)) ; 
unsigned int *res = malloc (sizeof(int)*(a+b+2)) ; 
unsigned long long int c; 

/* A=D91097D725BC9C2C ; B=2E4376409371327 ; répartie dans leur tableau*/
A[0]=0x025BC9C2C ; B[0]=0x009371327 ; 
A[1]=0x0D91097D7 ; B[1]=0x02E43764 ;  

do {
if (A[0]%2==1) {

for (i=0 ; i<=b ; i++) {/* addition */

c=(long long int)res[i]+(long long int)B[i] ; res[i]=(c&0x0FFFFFFFF) ; 

n=i ; 
while(c>>32!=0){
n++ ; c=(long long int)res[n]+(long long int)1 ; 
if(c>>32==0){res[n]++ ;}else{res[n]=0;}
}

}/*   for 	*/
}/*   if%2	*/


r=0 ; /* décallage droite */
for (ii=0 ; ii<a ; ii++) {
r=(A[ii+1]&1)<<31 ; A[ii]=A[ii]>>1 ; A[ii]=A[ii]|r ;}
A[a]=A[a]>>1 ; if(A[a]==0){a--;}

/* décallage gauche*/
if ((B[b]&0x0EFFFFFFF)!=0) {b++ ; }
for(ii=b ; ii>=0 ; ii--) {r=(B[ii]&0x0EFFFFFFF)>>31 ; B[ii+1]=B[ii+1]|r ; B[ii]=B[ii]<<1; }
}while(a>-1) ;  


/* 160 premiers bit du résultat obtenue */
printf("\n                    %X%X%X%X%X" ,res[4] , res[3] , res[2] , res[1] ,res[0]) ; 

/* résultat du test */
printf("\n                     273A2EE4CD3E67E2EC34BC6D8C70EB4\n") ; 

free (A) ; free (B) ; free (res) ; 
return 0 ; 
} /* main */

 Conclusion

Compilé avec gcc sous gentoo :)


 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture MANIPULATION DE NOMBRE COMPLEXE par bazdig25
Source avec Zip MULTIPLICATION MATRICIELLE ENCHAINEE par ducmath0

Commentaires et avis

Commentaire de pcmanof94 le 26/02/2006 15:13:37

tu pourais faire un petit effort de lisiblilité lol ton code ressemble pas mal a ta chambre ...
mais bon je t'aime bien mon petit traxou et ca marche donc je te met a 9/10 lol

Commentaire de TRAX44 le 26/02/2006 15:17:49

j'ai déjà fait un gros effort avant de poster. et je veux pas la note d'un ami mais celle d'un regart critique ! :)

Commentaire de luhtor le 26/02/2006 19:40:17

C'est pas réutilisable comme code ca. Faut créer une classe pour gérer ca, surcharger les opérateurs. Enfin plein de truc qui feraient que quelqu'un d'autre puisse l'utiliser.
Car en lui meme, le principe n'a rien d'extraordinaire.

++

Commentaire de TRAX44 le 26/02/2006 19:48:04

j'ai commencé ce programme deux jour après avoir commencé a touché au C. Je ne saivais même pas (quand je l'ai fait) qu'il existait un system de classe en C.
Sinon pour surcharger les opérateur en orienté objet je vois pas comment il est possible de faire (a part parser une string).
Luthor, tu pourrais nous fair un petit tuto pour nous expliquer ? :D
Sinon, non c'est pas extraordinaire, ça permet juste de pas utiliser un truc tout pret que tu sais pas comment ça marche :)

@+
trax

Commentaire de luhtor le 26/02/2006 20:23:00

Oke si tu débutes le C. J'ai pas fais assez attention. Tu précisais en C :)
Dans ma tete, le C++ permet tellement plus de chose, donc pour moi c'était du C++.
Mais meme si tu ne fais pas un système de classe. Tu peux te pencher sur les structures, et fournir une série de fonction avec. Comme des fonctions pour additionner, multiplier,... ces grands nombres.

Mon avis personnel étant que, ce site n'a pas pour but d'accueillir les essais personnels en matière de programmation. Si tu regardes ce site, il y a des quantités de sources très avancés qui ont un intérêt, car non seulement elle représente bcp de travail, ou elles présentent autre chose que ce que tout le monde sait à peu près faire.

Pour l'orienté objet, il y a des quantités de documents sur le C++ sur le web. En programmation basique, ton meilleur ami, c'est Google.

Pour ce qui est de la surchage des opérateurs, tu penses bien qu'il est hors de question de parser une string :)

Bon a part tout ca, bonne continuation en C :)

Commentaire de luhtor le 26/02/2006 20:33:59

Bon pour te montrer un exemple de surchage d'addition. Si ta classe, on l'appelle VLI (very large integer) où chaque objet est constitué d'un tableau alloué statiquement (et non dynamiquement comme tu le fais dans ta source) de TAB_SIZE entiers (environ 1000 pour des grands chiffres). Ta classe a l'allure suivante:

classe VLI
{
public:
...

// on définie l'opérateur +. Puisque c'est opérateur est symétrique, il est plus logique de le déclarer en fonction ami et donc externe

friend VLI operator + (const VLI & _objet1, const VLI & _objet2);

private:

unsigned int tab[TAB_SIZE];
};

// et apres on définie la fonction d'addition
VLI operator + (const VLI & _objet1, const VLI & _objet2)
{
  VLI new_VLI;
  // la tu fais l'addition de ces deux VLI (_objet1 et _objet2), tu stockes le résultat dans new_VLI.

  // et tu retournes le nouveau VLI créé.
  return new_VLI;
}

Et maintenant dans ton programme, tu pourras écrire :

VLI c(a + b); // en utilisant l'opérateur de recopie et en considérant que a,b sont initialisés correctement.

Si tu surchares l'opérateur << du C++. Tu pourrais écrire: cout << a + b << endl;

Bon aller, voila pour une petite présentation. ++

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Multiplication sur des tableaux entiers [ par kikouk ] Salut.J'ai besoin de créer une procédure sous Visual C++ qui réalise la multiplication de 2 grands entiers (stockés dans 2 tableaux (1 dimension)) et Aidez moi pour une calculette en C [ par pingouf ] Bonjour, j'ai besoin d'aide pour réaliser une calculette en C. Je suis un tout jeune programmeur et le début est toujours difficile aidez moi svp.Je d Multiplication de grands nombres [ par zekicker ] Salut,Je voudrais savoir si qq1 connait une méthode pour effectuer une multiplication de grands nombres comme 467684700 *655000000. En effet, j'obtien Multiplication des grands nombres. [ par J_r_m ] Salut @ tous !!!Je suis debutant en C, et je voudrais pouvoir multiplier deux "grands" nombres de plus de dix chiffres en base 10.Je pensais donc met [AES]Multiplication modulo ? (urgent) [ par Campagnard ] &nbsp;BonjourJe travaille sur l'impl&#233;mentation de l'AES. Dans ce standard, on parle de multiplication de polynaumes modulo un polynome irreductib Dépassement capacité multiplication integer [ par bipcpp ] Bonjour, J'ai trois integer 64 bits : _int64 i1,i2,i3; Comment d&#233;tecter le d&#233;passement de capacit&#233; possible sur i3, lors d'une multip multiplication 32bits*32 bits, résultat dans 2 32 bits [ par magodu22 ] je simule un microprocesseur qui fonctionne en assembleur en langage C. dans ce projet, je dois executer une multiplication de 2 mots de 32 bits, et p Multiplication de matrice symétrique [ par sortileges125 ] Voilà mon problème,Je cherche à faire une multiplication de deux matrices symétriques mais seulement avec la partie supérieure ou la partie inférieure Multiplication de 2 matrices [ par developvbdebut ] Bonjour tout le mondeJ'ai un probleme avec un algo pour la multiplication de 2 matrices.Voici le codeJe ne m'ai que la fonction qui fais le calcul.int Multiplication arabe en langage C [ par Stockalone1232 ] Bonjour tout le monde,Je suis débutant en langage C et je dois faire un programme de multiplication arabe de 2 grands nombres pour mon école. Si certa


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,295 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales