Division des grands nombres - Stack Overflow
J'ai besoin d'un algorithme de division qui peut gérer les grands entiers (128 bits). Je l'ai déjà demandé comment le faire via les opérateurs de décalage de bits. Cependant, mon implémentation actuelle semble demander une meilleure approche
Fondamentalement, j'enregistrer des numéros deux de longues longues unsigned int dans le format
A * 2 ^ 64 + B avec B < 2 ^ 64 .
Ce nombre est divisible par 24 et je veux diviser par 24.
Mon approche actuelle est de le transformer comme
Cependant, cela est buggy.
(Notez que plancher est A / 24 et que mod est un% 24. Les divisions normales sont stockées dans un long double. Entiers sont stockés dans long long unsigned int.
Etant donné que 24 est égal à 11 000 en binaire, le second opérande ne devrait pas changer quelque chose dans la gamme de la quatrième opérande, car il est décalé de 64 bits vers la gauche.
Donc, si A * 2 ^ 64 + B est divisible par 24, et B n'est pas, il montre aisément qu'il les bugs car il retourne un nombre non entier.
Quelle est l'erreur dans ma mise en œuvre?
Serait-ce peut-être résolu avec la multiplication inverse? La première chose à noter est que 24 == 8 3 * de sorte que le résultat de
Soit x = (a >> 3), le résultat de la division est de 8 * (x / 3). Maintenant, il reste à trouver la valeur de x / 3.
arithmétique modulaire indique qu'il existe un nombre n tel que n * 3 == 1 (mod 2 ^ 128). Cela donne:
Il reste à trouver le n constante. Il y a une explication sur la façon de le faire sur wikipedia. Vous aurez également à mettre en œuvre la fonctionnalité de multiplier à nombres de 128 bits.
J'espère que cela t'aides.
Etant donné que 24 est égal à 11 000 en binaire, le second opérande ne devrait pas changer quelque chose dans la gamme de la quatrième opérande, car il est décalé de 64 bits vers la gauche.
La propriété que Y * 2 ^ 64 ne gêne pas les chiffres binaires de poids inférieur à une addition ne fonctionne que lorsque Y est un nombre entier.