Bonjour amateurs de saveurs inutile ! Aujourd'hui on va essayer de compresser les données
Des données on s'en partagent tous tout le temps au point qu'on s'en rend même plus vraiment compte
excepté quand ça prend du temps. Et oui on veut partager sa vidéo de trois heures en 4k avec le monde entier
et on sent bien que ça va prendre du temps, mais par quelle magie
pourrait-on réduire ce temps ? Et bien nul besoin de magie car on a quelque chose de bien plus puissants ...
les mathématiques !
C'est un peu comme de la magie quand on y pense. Il y a des formules et on comprend pas trop comment ça marche.
Oh mais la crois moi tu vas comprendre
Une donnée qu'es que c'est. C'est juste une suite finie de zéros et de uns
En informatique on appelle ça une trame binaire et en mathématiques un vecteur à coefficient dans le corps finit à deux éléments ...
mais c'est exactement la même chose !
Supposons que l'on veut envoyer un message textuel. La première chose c'est de le
transformer en une suite de nombres. Pour cela on s'est fixé une convention à travers le monde
la table ASCII où chaque symbole, lettres minuscules, majuscules
chiffres, ponctuation a une valeur numérique ...
comprise entre 0 et 255.
Le A majuscule c'est 65 par exemple Maintenant on va les écrire en binaire. Je vous renvoie vers ma vidéo sur les système de numérotation
mais pour faire court:
Chaque cases est une puissance de 2 et pour représenter un nombre on retire à chaque fois qu'on peut la plus grande puissance ...
et on met un 1 dans la case correspondante.
Ça veut dire que le nombre est égale à la somme de ces puissances de 2. Le fait que les nombres soit compris entre
0 et 255 fait qu'on a besoin d'au plus huit cases. une trame binaire de longueur 8, on appelle ça un octet !
Revenons à notre texte. On convertit chaque caractères en nombre grâce à
table à ASCII puis chaque nombres en octets quitte à ajouter des 0 à la fin et on colle les octets ensemble.
Ça c'est ce qui sera envoyé. Le récepteur n'aura qu'à détacher les paquets de 8 et retrouver les nombreux correspondants.
Ça c'est pour un texte, mais c'est la même chose pour une image en codant la couleur de chacun des pixels en binaire ou pour
une vidéo ou un son. De façon générale toute donnée numérique ce n'est qu'une suite finie de zéros et de uns.
La taille des fichiers que l'on voit affichés sur nos ordinateurs, c'est juste la longueur de cette suite.
Mais voilà on peut se poser la question étant donné une certaine suite de 0 et de 1 d'une certaine taille
y at il moyen de réduire cette taille
tout en faisant en sorte que la donne et qui soit décrite par cette suite ne soit pas altéré ?
Cette problématique c'est la base de la théorie mathématiques des codes de compression.
Si on reprend notre message d'avant on pourrait se dire qu'une bonne méthode de compression
serait de retirer les zéros qui ne servent à rien. On peut légitimement
se demander pourquoi on s'embête a envoyé un octet complet alors qu'en soit il suffirait d'envoyer juste la partie utile.
Le problème est que si on fait comme ça, la personne qui reçoit la trame binaire ne saura pas où
couper pour retrouver les bons nombres . Se forçait à prendre une taille de huit fait qu'il n'y a pas d'ambiguïté
En soit les zéros ajoutés à la fin sont quand même
nécessaire au bon décodage du message. Il faudrait trouver un moyen pour envoyer uniquement
l'information nécessaire en évitant aux plus possible l'envoi de données qui ne sert à rien. Des codes qui permettent cela il en existe plein comme
le code de Huffman ou le code de Lempel-Ziv, mais je vais vous présenter aujourd'hui mon préféré, le codage de
Fibonacci basé sur la célèbre suite. La suite de Fibonacci à plein de propriétés dont certaines ont déjà été expliqué en vidéo
mais beaucoup de gens ignorent que cette suite a également des applications en informatique. Petit rappel de la suite de Fibonacci:
On écrit 1
Puis deux et le terme suivant est la somme des deux précédents. 1+2 donne 3
2 + 3 donne 5. 3 + 5 donne huit' et on continue aussi loin qu'on veut. Cette suite c'est la suite de Fibonacci.
Bon ... en vrai du point de vue historique
il faudrait commencer
d'abord par deux 1 et après on arrive à cette suite là, mais pour l'utilisation qu'on va en faire on enlève le premier 1.
Si on représente ...
chacun des termes de la suite sous forme de tableau, comme on a fait en binaire
si je mets des 0 et des 1 je peux donc
représenter certain nombre, tout ceux qui peuvent s'écrire comme somme fini de termes de la suite de Fibonacci
où chaque termes est utilisé au plus une fois.
Je représente les nombres en base Fibonacci en quelque sorte.
 
Prenons ce nombre qui donne 30 regardons les deux 1 qui sont côte à côte.
Ça veut dire que pour écrire 30
je vais faire 3 + 5 donc dans mon écriture de 30 je vais avoir à faire plus 8, mai 8 c'est le terme qui
est juste après donc 10 je peux aussi l'écrire comme ceci.
 
1+ 8 + 21 ça donne bien 30, mais de façon générale si deux 1 se suivent,t ça veut dire que le nombre qui est
représenté s'écrit comme un terme de la suite plus le terme suivan,t mais par définition
de Fibonacci c'est
exactement le terme qui vient juste après donc je peux remplacer ces deux 1
par juste des 0 et un 1 juste après et si j'obtiens de nouveau deux uns côte à côte
je recommence jusqu'à la fin la suite
... et si on a trois 1 côte à côte ou plus
on commence par les deux qui sont les plus à droite et on transforme jusqu'à ne plus avoir deux 1 côte à côte.
Ce qu'on vient de montrer c'est que si un nombre et représentable en base Fibonacci, alors il existe une autre écriture, peut être plus longue
avec jamais deux 1 côte à côte.
C'est une propriété assez remarquable de la suite de Fibonacci, mais c'est loin d'être la seule parce qu'en fait ...
Tout nombre et représentable embase Fibonacci !
Et oui on peut démontrer que tout nombre peut s'écrire comme sommes finis de termes de
Fibonacci où chaque terme est utilisé au plus une fois.
Je vous ai même rédigé la démonstration et elle est disponible dans la description cette vidéo.
Bon c'est amusant, mais en quoi ça peut aider à compresser une information binaire que de l'écrire en base Fibonacci plutôt qu'en base deux.
Et bien comme je vous l'ai expliqué,  je peux représenter mais nombre avec une écriture
sans jamais deux 1 à la suite donc voilà comment je fais: J'ai une suite de nombres a envoyé, je les écris en base
Fibonacci puis je fais en sorte que deux 1 ne soient jamais côte à côte et maintenant j'ajoute à la fin de chaque nombre un 1 supplémentaire.
Ce1 en plus va nous permettre d'identifier où un nombre se finit et où le prochain commence.
Je colle tout ça ensemble et c'est bon !
Supposons que je veuille retrouver la suite de nombres cacher derrière cette trame binaire.
Je sais que les uns qui se répètent sont dû uniquement à l'ajout
volontaire d'un 1 à la fin de chaque nombre par propriété de Fibonacci. Je coupe partout je vois deux 1
je retire celui tout à la fin et je retrouve mes nombre en faisant la somme des termes de Fibonacci correspondant. Mais où est
l'utilité par rapport au binaire classique ? Et bien la taille s'adapte à la grandeur du nombre.
Là où dans le système classique, si on voulait envoyer des nombre entre 0 et 255
il fallait tout envoyé par octet, par paquet de 8 ...
on s'adapte au plus grand nombre quelque sorte ...
la la longueur de ce que j'envoie s'adapte à la grandeur de mon ombre
 
si on prend cette suites de nombres par exemple. La voilà en systèmes Fibonacci et en systèmes binaires classique. On voit que, pour cet exemple
en tout cas, le système Fibonacci est meilleur, mais qu'est ce que ça donne dans le cas général ?
Pour se donner une idée, on peut calculer la longueur des différents nombre entre 1 et 255
écrit en binaire Fibonacci pour calculer la longueur moyenne et on trouve presque 11
contre 8 avec le système standard puisque on se force à ce que tous les paquets aient une taille de 8.
Mais alors ce système ne compresse pas ... il étend ! On est gagnant à utiliser le système de
Fibonacci si on a beaucoup de petits nombres. Dans le système classique si on n'a QUE des petits nombres qui peuvent chacun
s'écrire avec une longueur d'au plus six ...
bon ... eh ben dans ce cas on envoie des paquets de 6 et pas des octets, mais si on ne serait ce qu'UN seul grand
nombre qui nécessite un octet pour être écrit ... et bien c'est fichu.
Il faut tout mettre sous forme d'octet et ça ajoute plein de 0, alors que dans le système de
Fibonacci, un grand nombre ne va pas influer sur la longueur des autres. C'est pourquoi
quand on utilise le système de compression de Fibonacci pour envoyer un texte
 
On n'utilise pas la table à ASCII, mais une autre où les caractères les plus utilisés comme la lettre 'E' pour le français sont mis
sur les petits nombres. Le code de compression de Fibonacci est une façon de faire, mais il en existe plein d'autres tout aussi ingénieuse
avec leurs avantages et leurs inconvénients
Quand on parle cote de compression, on a vite fait de nous voir que l'aspect informatique en oubliant que derrière se cachent de véritables trouvailles
mathématiques. Alors vous aussi faite tenir toute votre bibliothèque dans une clé usb,
n'oubliez pas que winrar expire dans 30 jours, mais surtout n'hésitez pas à briller en société ...
A+ ;)
