10
votes

Multiplication de grandes numéros dans MATLAB

J'ai une question à partir de curiosité pure. Comment la multiplication des grands nombres est-elle mise en œuvre dans Matlab? Est-ce que Karatsuba, Toom-3, Fürer ou quelque chose de tout à fait différent?


5 commentaires

Il y a un WHIP intéressant que j'ai trouvé dans Matlab Central qui peut être associé à votre problème ...


Merci ! cela est certainement interesting. Maintenant, je sais que je peux utiliser la boîte à outils symbolique pour faire ce genre d'opération. Malheureusement, cela ne dit rien sur la manière dont il est implémenté ou quel algorithme est utilisé. Quoi qu'il en soit, merci de commenter!


Si vous ne voulez pas pour votre exactitude, mais pour la vitesse , quels sont vos grandes nombres? Peuvent-ils être «approximativement» représentés par des doubles? comme 1e254? Qu'est-ce qui est grand? Avez-vous besoin d'arithmétique de précision arbitraire? Vous dites que vous voulez une grande multiplication de numéros, mais vous dites que vous ne vous souciez pas de précision. Qu'est-ce que ça veut dire?


Il y avait un fil de gros chiffres à Matlab . Comment est-ce différent de ce dont vous avez besoin?


Disons que je ne suis intéressé que par l'algorithme, qui est utilisé quand j'essaie de calculer quelque chose comme ceci: 139676498390139139676498390676498390 * 8745566554983 90676498390


4 Réponses :


3
votes

Il n'y a pas d'intégré BigInteger classe, si c'est ce que vous voulez dire. Vous pouvez utiliser la boîte à outils à point fixe ou importer des classes Java / .Net pertinentes.

Par défaut, les numéros sont représentés au format Point flottant à double précision IEEE.


1 commentaires

Qu'en est-il de la boîte à outils symbolique?



3
votes

Ajout à la réponse, si vous avez besoin de plus de chiffres de précision, vous pouvez essayer d'utiliser ce Fichier FEX


1 commentaires

Je ne vise pas la précision, mais pour la vitesse du calcul.



5
votes

Si vous êtes intéressé par l'algorithme pour calculer par exemple 139676498390139139676498390676498390 * 874556655498390676498390 , c'est ce qui se passe:

  • Les deux chiffres sont convertis en double dans IEEEA® Standard 754
  • En tant que tel, la représentation n'est pas exacte, car double ne peut représenter que avec précision des entiers allant jusqu'à 2 ^ 53-1 (cochez la documentation de bitmax fonction) (~ 10 ^ 15 , pendant que vos numéros sont sur l'ordre de 10 ^ 35 ).
  • la multiplication est effectuée en utilisant des nombres de points flottants à double précision et est ainsi également approximatif

    regarder cet exemple de code: xxx

    ce qui n'est clairement pas exactement la valeur que vous avez attribuée à a - seulement Les 16 premiers chiffres correspondent à 16 chiffres.


0 commentaires

0
votes

Si vos chiffres ne sont que gros, mais vous n'avez pas besoin d'un grand nombre de chiffres significatifs. Vous pouvez multiplier un petit nombre avec chaque multiplication, telle que 10 $ ^ -1 $. Gardez une trace du nombre de multiplications $ N $ et obtenez une valeur en termes de 10 ^ {- N} $. Cela peut être un travail temporaire autour.


0 commentaires