Smalltalk et les nombres

24 novembre 2019

Je suis tombé sur un autre article intéressant sur l’excellent blogue de John D. Cook où il traite des erreurs possibles de précision quand on effectue des calculs avec des Float ou des Double.

Évidemment, dans le problème énoncé, si on a recours à des calculs en point flottants, Smalltalk n’échappe pas à la situation décrite, comme n’importe quel autre langage de programmation!

Cependant, on a tendance à l’oublier, Smalltalk vient à la base avec une riche hiérarchie sous la classe Number d’aussi loin qu’on se souvienne!  Il y a donc moyen de faire en sorte que l’expression décrite converge vers une solution précise et exacte!  Comment?  Avec des fractions!

C’est symptômatique de chaque Smalltalker, nous oublions trop souvent à quel point les nombres en Smalltalk sont traités de façon transparente, sans que nous ayions besoin de librairies spécialisés pour le « large integer arithmetic » ou les fractions par exemple! Nul besoin de savoir si tel ou tel nombre peut être représenté sur 32 ou 64 bits!  En fait, les LargeIntegers ne sont limités que par la mémoire disponible sur votre ordi! Quel autre langage peut se targuer d’être en mesure de faire les calculs suivants sans avoir besoin de librairies spécialisées ou que votre environnement de développement vous explose en pleine figure??


Humour (154)

28 février 2019


Programmer pour la performance

25 janvier 2019

Deux excellents papiers (Programmer pour la performance, partie 1 et partie 2) de Romain Dolbeau sur un aspect mal compris, mal aimé et mal géré de la programmation : la performance.

Pour les adeptes de problèmes mathématiques dont je suis, vous aurez sans doute reconnu l’auteur de ces deux articles si vous vous intéressez aux nombres de Lychrel puisque Romain est l’actuel détenteur du record en la matière! Tous les détails de la quête du nombre 196 détaillés ici !


Humour (139)

5 décembre 2018


Fragments (2)

20 novembre 2018

On définit grossièrement la persistence multiplicative par le nombre de fois qu’on peut multiplier les chiffres d’un nombre entre eux jusqu’à ce que le résultat ne comporte qu’un seul chiffre.

Par exemple:

679 ->  6 * 7 * 9 = 378
378 ->  3 * 7 * 8 = 168
168 ->  1 * 6 * 8 = 48
48 ->  4 * 8 = 32
32 ->  3 * 2 = 6

On dira donc que le nombre 679 a une persistence multiplicative de 5.

Le code Pharo ci-bas sert à trouver la persistence multiplicative d’un nombre.

| persistence residu |

"Trouver la persistence multiplicative du nombre 277777788888899"
residu := 277777788888899.

persistence := 0.
[ residu > 9 ]
    whileTrue: [ residu := residu printString 
                               inject: 1 
                               into: [ :mul :each | mul * each digitValue ].
                 persistence := persistence + 1 ].
persistence inspect

Pour des méthodes plus performantes, il y a cet excellent papier (en anglais) qui explique quelques astuces et également celui-ci en français..

 


Factoriser les grands nombres

23 septembre 2018

Plusieurs méthodes pour factoriser les grands nombres existent mais l’important, c’est de comprendre comment ça se fait et surtout pourquoi!

Un excellent article sur le sujet ici.


Daniel Lemire

3 mars 2018

Un autre blogue que je recommande fortement est celui de Daniel Lemire (pas l’humoriste mais bien l’informaticien!).  Il y traite souvent d’algorithmes et de performance avec une minutie du détail inouïe.

Pour avoir un bon exemple de son style et des sujets qu’il traite, je vous suggère son billet sur le choix aléatoire de nombre distinct (Picking distinct numbers at random: benchmarking a brilliant algorithm) ainsi que son article intitulé Iterating over set bits quickly.

Finalement, un exemple de ses contributions à l’open source, les RoaringBitmap.