Rechercher : dans
Par :

Calcul modulo grand nombre

Dernière réponse le 11 déc 2008 à 15:16:35 tchobubu, le 24 oct 2008 à 17:30:20 
 Signaler ce message aux modérateurs

Bonjour,
je voudrais calculer le modulo d'un nombre a 15 chiffres maxi exemple: 123456789012345%97
sa a l'aire simple mais je ne n'arrive ni a enregistrer un aussi grand nombre dans une variable a ni a utiliser l'opérateur modulo car le nombre n'est pas un int

merci
c surmnt pcq la vitesse de la lumière est plus grande ke cel­le du son, k1 c** parait brillant avant d'avoir parlé.

Meilleures réponses pour « calcul modulo grand nombre » dans :
Windows Update [toutes versions] VoirLe moyen le plus commode pour tenir à jour son système est de passer par Démarrer>Tous les programmes>Windows Update. Une fois sur le site, seules seront proposées les mises à jour nécessaires. Cependant, un assez grand nombre d'utilisateurs...
Télécharger Gnumeric VoirLes applications de traitement de textes existent en grand nombre sur le Web que l'on peut télécharger. Mais celles destinées à la gestion et création de feuilles de calcul sont rares. Gnumeric est une application open source utilisée pour le...
Télécharger Ghostscript VoirGhostscript est le nom d'un ensemble d'outils fournissant : Un interpréteur pour le langage PostScript (TM), offrant la possibilité de convertir des fichiers PostScript (fichiers PS) vers un grand nombre de formats bitmap, de les afficher ou...
Tableur - Les fonctions mathématiques VoirLes fonctions standards Méthode description ABS() Cette méthode renvoie la valeur absolue d'un nombre, il renvoie donc le nombre s'il est positif, son opposé (positif) s'il est négatif IMPAIR(valeur) Cette méthode renvoie la valeur...
PHP - Bases de données VoirPhp permet un interfaçage très simple avec un grand nombre de bases de données. Lorsqu'une base de données n'est pas directement supportée par Php, il est possible d'utiliser un driver ODBC, pilote standard pour communiquer avec les bases de...
Windows 7 - Notepad et Wordpad VoirTout faire (ou presque) avec Windows 7 Si Windows 7 possède autant de fonctions, c’est qu’il intègre un grand nombre de logiciels, permettant ainsi de multiples usages pour l’ordinateur. Qu’il s’agisse de vous permettre de rédiger des documents,...

1

mamiemando, le 25 oct 2008 à 00:34:29

Tout dépend de ce que tu utilises. Par exemple sous linux avec bc ça se fait sans problème :

(mando@aldur) (~) $ bc
bc 1.06.94
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
123456789012345%97
12

Par contre c'est vrai qu'en C par exemple, même avec des long long int ça ne marche pas...

Répondre à mamiemando

2

fiddy, le 25 oct 2008 à 01:04:55

Salut,
En C, en prenant du long long int, ça marche très bien ;)
Google is your friend

Répondre à fiddy

3

mamiemando, le 25 oct 2008 à 01:09:58
  • +1

Effectivement :

#include <stdio.h>

int main(){
    long long int x = 123456789012345;
    printf("%lld\n",x % 97);
    return 0;
}

... me donne :
(mando@aldur) (~) $ gcc -W -Wall plop.c
plop.c: In function ‘main’:
plop.c:4: warning: integer constant is too large for ‘long’ type

Ceci dit malgré le warning, le programme donne bien 12... Quand j'ai vu le warning je n'ai même pas pris le temps de tester :p

Répondre à mamiemando

4

fiddy, le 25 oct 2008 à 01:35:11
  • +1

Normal. T'as obligé LL à la fin de l'initialisation.
Teste :

long long int x = 123456789012345LL;

Ca devrait enlever le warning ;)
Google is your friend

Répondre à fiddy

8

mamiemando, le 25 oct 2008 à 13:26:37

Effectivement, je ne connaissais pas. Comme quoi on en apprend tous les jours !

Répondre à mamiemando

5

bizu53, le 25 oct 2008 à 01:37:46
  • +2

La technique (je pense) la plus simple si tu veux pouvoir gérer des nombres énormes, c'est de les saisir en tant que chaine de caractères, que tu fractionnes ensuite dans plusieurs int (ils sont gentils les int :)) après t'as juste à faire une petite fonction qui te prendre ce tableau (unicolonne) de int et t'en fais ce que tu veux ^^.

Pour le cas du modulo, tu sais que (a×b+c)%m = ( (a%m)×(b%m)+c%m ) % m
Ici le b serait une simple puissance de 10 correspondant à la situation de la coupure.

Pour reprendre ton exemple :
x_initial = 123456789012345
m = 97
Par exemple en coupant de cette manière :
x[0]=1234567
x[1]=89012345
on a donc x_initial = x[0] × 10^8 + x[1]

tu fais donc :
1234567 % 97 = 48
(10^8) % 97 = 81 (obtenu avec une simple boucle for autant de fois que la puissance de 10, en multipliant par 10 à chaque fois et en prenant le modulo : 10%97=10 ; 100%97=3 ; 30%97=30 ; 300%97=9 ; 90%97=90 ; 900%97=27 ; 270%97=76 ; 760%97=81)
89012345 % 97 = 4

ce qui te donne (48*81+4)%97=12

Tu peux bien évidemment fractionner ton nombre de + de morceau la formule est bien sûr toujours valable, ça te ferait juste de simples additions supplémentaires. Tu peux ainsi trouver le modulo 97 d'un nombre de 8000 chiffres si tu veux de la même manière (en ayant fractionné ton nombre en 1000 int de 8 chiffres chacun)

Répondre à bizu53

6

fiddy, le 25 oct 2008 à 01:41:05

Pour les grands nombres oui. Sauf qu'il demande pour 15 chiffres maximum ;)
Google is your friend

Répondre à fiddy

7

bizu53, le 25 oct 2008 à 01:45:03
  • +1

En effet j'avais pas fait attention au mot "maxi" qu'il avait bien précisé ^^ ça pourra toujours être utile à qqu'un qui tomberait sur ce sujet en cherchant pour des bigs bigs nombres comme ça :)

Répondre à bizu53

11

 ermite67, le 11 déc 2008 à 15:16:35
  • +1

MERCI bizzu53, moi cela m'a servi en tous cas !!

J'utilise un langage qui ne me permets pas de traiter des nombres de plus de 15 chiffres, et je devais calculer un modulo 97 de nombres jusqu'à 18 chiffres !

Pour infos, voici une deuxième méthode que j'ai trouvé :

Exemple sur 9 chiffres pour le numéro 510007547061111462 :

1 Calculer le modulo 97 des 9 premiers chiffres du numéro considéré.
Modulo 97 de 510007547 = 74

2 Recomposer, en partant du reste, un nouveau nombre de 9 chiffres et calculer son
modulo97 :
Modulo 97 de 740611114 = 12.

3 Répéter l'étape précédente jusqu'à ce que tous les chiffres aient été traités.
Modulo 97 de 1262 = 1.
Ce résultat est identique au reste de la division 510007547061111462 par 97.

Répondre à ermite67

9

tchobubu, le 30 oct 2008 à 15:50:43

Bravo a tous et merci ! c surmnt pcq la vitesse de la lumière est plus grande ke cel­le du son, k1 c** parait brillant avant d'avoir parlé.

Répondre à tchobubu

10

tchobubu, le 30 oct 2008 à 15:57:26

Petit ajout le 'LL' est obligatoire après l'initialisation du grand nombre en C++ car il n'y a pas de warning mais une erreur a la compilation ;) encore merci c surmnt pcq la vitesse de la lumière est plus grande ke cel­le du son, k1 c** parait brillant avant d'avoir parlé.

Répondre à tchobubu