J'ai remarqué récemment qu'il existe de nombreux algorithmes basés en partie ou en totalité sur des utilisations intelligentes des nombres dans des bases créatives. Par exemple:
- Les tas binomiaux sont basés sur des nombres binaires, et les tas binomiaux plus complexes sont basés sur des nombres binaires biaisés.
- Certains algorithmes pour générer des permutations ordonnées lexicographiquement sont basés sur le système numérique factoradique.
- Les essais peuvent être considérés comme des arbres qui regardent un chiffre de la chaîne à la fois, pour une base appropriée.
- Les arbres de codage de Huffman sont conçus pour que chaque arête de l'arbre code un zéro ou un dans une représentation binaire.
- Le codage de Fibonacci est utilisé dans la recherche de Fibonacci et pour inverser certains types de logarithmes.
Ma question est la suivante: quels sont les autres algorithmes qui utilisent un système de nombres intelligent comme étape clé de leur intuition ou de leur preuve? . Je pense organiser une conférence sur le sujet, donc plus je dois tirer d'exemples, mieux c'est.
algorithm
math
data-structures
numbers
number-systems
templatetypedef
la source
la source
Réponses:
Chris Okasaki a un très bon chapitre dans son livre Structures de données purement fonctionnelles qui traite des «représentations numériques»: essentiellement, prenez une représentation d'un nombre et convertissez-la en une structure de données. Pour donner une idée, voici les sections de ce chapitre:
Quelques-unes des meilleures astuces, distillées:
Voici également la liste de référence de ce chapitre:
la source
etc...
Cette liste est un bon point de départ.
la source
J'ai lu votre question l'autre jour, et j'ai été confronté aujourd'hui à un problème: comment générer tous les partitionnements d'un ensemble? La solution qui m'est venue et que j'ai utilisée (peut-être en raison de la lecture de votre question) était la suivante:
Pour un ensemble avec (n) éléments, où j'ai besoin de (p) partitions, comptez tous les (n) nombres de chiffres en base (p).
Chaque numéro correspond à un partitionnement. Chaque chiffre correspond à un élément de l'ensemble, et la valeur du chiffre vous indique dans quelle partition placer l'élément.
Ce n'est pas étonnant, mais c'est chouette. Il est complet, n'entraîne aucune redondance et utilise des bases arbitraires. La base que vous utilisez dépend du problème de partitionnement spécifique.
la source
111222
distinct de222111
?Je suis récemment tombé sur un algorithme sympa pour générer des sous-ensembles dans l'ordre lexicographique basé sur les représentations binaires des nombres entre 0 et 2 n - 1. Il utilise les bits des nombres à la fois pour déterminer quels éléments doivent être choisis pour l'ensemble et pour réorganiser localement les ensembles générés pour les mettre en ordre lexicographique. Si vous êtes curieux, j'ai un article publié ici .
En outre, de nombreux algorithmes sont basés sur la mise à l'échelle (comme une version faiblement polynomiale de l'algorithme de débit maximal de Ford-Fulkerson), qui utilise la représentation binaire des nombres dans le problème d'entrée pour affiner progressivement une approximation approximative en une solution complète.
la source
Pas exactement un système de base intelligent mais une utilisation intelligente du système de base: les séquences de Van der Corput sont des séquences à faible divergence formées en inversant la représentation en base n des nombres. Ils sont utilisés pour construire les séquences Halton 2D qui ressemblent à ceci .
la source
Je me souviens vaguement de quelque chose à propos des systèmes à double base pour accélérer certaines multiplications matricielles.
Le système à double base est un système redondant qui utilise deux bases pour un numéro.
Redondant signifie qu'un nombre peut être spécifié de plusieurs manières.
Vous pouvez rechercher l'article "Algorithme hybride pour le calcul du polynôme matriciel" de Vassil Dimitrov, Todor Cooklev.
Essayer de donner le meilleur bref aperçu possible.
Ils essayaient de calculer le polynôme matriciel
G(N,A) = I + A + ... + A^{N-1}
.En supposant que N est composite
G(N,A) = G(J,A) * G(K, A^J)
, si nous appliquons pour J = 2, nous obtenons:aussi,
Comme il est "évident" (en plaisantant) que certaines de ces équations sont rapides dans le premier système et certaines meilleures dans le second - c'est donc une bonne idée de choisir la meilleure de celles qui dépendent
N
. Mais cela nécessiterait un fonctionnement modulo rapide pour 2 et 3. Voici pourquoi la double base entre en jeu - vous pouvez fondamentalement faire l'opération modulo rapidement pour les deux, vous donnant un système combiné:Regardez l'article pour une meilleure explication car je ne suis pas un expert dans ce domaine.
la source
RadixSort peut utiliser différentes bases de nombres. http://en.wikipedia.org/wiki/Radix_sort Implémentation assez intéressante d'un bucketSort.
la source
voici un bon article sur l'utilisation des nombres ternaires pour résoudre le problème de la «contrefaçon» (où vous devez détecter une seule pièce de monnaie contrefaite dans un sac de pièces régulières, en utilisant un solde le moins de fois possible)
la source
Les chaînes de hachage (par exemple dans l' algorithme de Rabin-Karp ) évaluent souvent la chaîne comme un nombre de base-b composé de n chiffres (où n est la longueur de la chaîne, et b est une base choisie suffisamment grande). Par exemple, la chaîne "ABCD" peut être hachée comme suit:
En substituant des valeurs ASCII aux caractères et en prenant b à 256, cela devient,
Cependant, dans la plupart des applications pratiques, la valeur résultante est prise modulo un certain nombre de taille raisonnable pour maintenir le résultat suffisamment petit.
la source
L'exponentiation par quadrillage est basée sur la représentation binaire de l'exposant.
la source
Dans
Hackers Delight
(un livre que tout programmeur devrait savoir à mes yeux), il y a un chapitre complet sur les bases inhabituelles, comme -2 comme base (oui, bases négatives droites) ou -1 + i (i comme unité imaginaire sqrt (-1)) comme base. Aussi, je fais un bon calcul de la meilleure base (en termes de conception matérielle, pour tous ceux qui ne veulent pas la lire: la solution de l'équation est e, donc vous pouvez aller avec 2 ou 3, 3 serait un peu mieux (facteur 1,056 fois mieux que 2) - mais est technique plus pratique).D'autres choses qui me viennent à l'esprit sont le compteur gris (lorsque vous ne comptez dans ce système que les changements de 1 bit, vous utilisez souvent cette propriété dans la conception matérielle pour réduire les problèmes de métastabilité) ou la généralisation du codage Huffmann déjà mentionné - le codage arithmétique.
la source
La cryptographie utilise largement les anneaux entiers (arithmatique modulaire) et aussi les champs finis, dont les opérations sont intuitivement basées sur le comportement des polynômes à coefficients entiers.
la source
J'aime vraiment celui-ci pour convertir les nombres binaires en codes Gray: http://www.matrixlab-examples.com/gray-code.html
la source
Excellente question. La liste est en effet longue. L'heure est une simple instance de bases mixtes (jours | heures | minutes | secondes | am / pm)
J'ai créé un cadre de n-tuple d'énumération de méta-base si vous êtes intéressé à en entendre parler. C'est un sucre syntaxique très doux pour les systèmes de numérotation de base. Il n'est pas encore publié. Envoyez mon nom d'utilisateur par e-mail (sur gmail).
la source
L'un de mes favoris utilisant la base 2 est l' encodage arithmétique . C'est inhabituel car le cœur de l'algorithme utilise des représentations de nombres entre 0 et 1 en binaire.
la source
Peut-être AKS est le cas.
la source