Algorithmes basés sur des systèmes de base numérique? [fermé]

87

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.

templatetypedef
la source
5
J'aime aussi la question, mais comment choisir la «bonne» réponse? Cela devrait-il être un wiki communautaire?
vlad
14
Cela devrait être le wiki de la communauté
BlueRaja - Danny Pflughoeft
18
@close votant: Si une question sur les algorithmes est hors sujet chez SO, je ne sais pas de quoi il s'agit ici. Des questions idiotes pour les débutants sur CSS? "puis-je haz regex plzz"? "plz email teh codez 4 mi hoemwok"?
MAK
2
Guide de l'auto-stoppeur de la galaxie: quelle est la réponse à la vie, à l'univers et à tout? Réponse de Deep Thought: 42. La Terre comme machine à trouver la question: qu'est-ce que 9 x 6? et c'est pourquoi tout est si foutu. Vu sur un tee-shirt: 9 (base 13) x 6 (base 13) = 42 (base 13). QED.
Chris Walton
"Quels sont les autres algorithmes qui utilisent un système numérique intelligent comme étape clé de leur intuition ou de leur preuve?" Stack Overflow n'est pas un moteur de recommandation , une liste de tout ou une ferme de liens . Algorithmes pour résoudre des questions de programmation pratiques, absolument. Clearinghouses pour des algorithmes intelligents, non. Vous voudrez peut-être demander plus sur la méta des mathématiques s'ils le souhaitent.

Réponses:

39

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:

  1. Systèmes de nombres positionnels
  2. Nombres binaires (listes binaires à accès aléatoire, représentations sans zéros, représentations paresseuses, représentations segmentées)
  3. Incliner les nombres binaires (incliner les listes d'accès aléatoire binaire, incliner les tas binomiaux)
  4. Nombres trinaires et quaternaires

Quelques-unes des meilleures astuces, distillées:

  • Faites la distinction entre les représentations denses et clairsemées de nombres (vous le voyez généralement dans les matrices ou les graphiques, mais cela s'applique également aux nombres!)
  • Les systèmes numériques redondants (systèmes qui ont plus d'une représentation d'un nombre) sont utiles.
  • Si vous arrangez le premier chiffre pour qu'il soit différent de zéro ou que vous utilisez une représentation sans zéro, la récupération de la tête de la structure de données peut être efficace.
  • Évitez les emprunts en cascade (de prendre la queue de la liste) et les carry (de conser sur la liste) en segmentant la structure des données

Voici également la liste de référence de ce chapitre:

  • Guibas, McCreight, Plass et Roberts: Une nouvelle représentation pour les listes linéaires.
  • Myers: une pile applicative à accès aléatoire
  • Carlsson, Munro, Poblete: Une file d'attente binomiale implicite avec un temps d'insertion constant.
  • Kaplan, Tarjan: Listes purement fonctionnelles avec caténation par ralentissement récursif.
Edward Z. Yang
la source
2
+1 J'ai un exemplaire du livre d'Okasaki ... J'ai adoré ces chapitres et c'est en partie pourquoi j'ai posé cette question (les tas binomiaux asymétriques bootstrapés sont vraiment cool!) Je ne l'ai pas lu tout au long, bien que peut-être que je devrais. Aussi, je vais vérifier ces références; Ils ont un beau look.
templatetypedef
La thèse complète d'Okasaky est disponible en ligne: cs.cmu.edu/~rwh/theses/okasaki.pdf
Gigi
20

"Les nombres ternaires peuvent être utilisés pour véhiculer des structures auto-similaires comme un triangle de Sierpinski ou un ensemble de Cantor." la source

"Les nombres quaternaires sont utilisés dans la représentation des courbes de Hilbert 2D." la source

"Le système de numération quater-imaginaire a été proposé pour la première fois par Donald Knuth en 1955, dans une soumission à une recherche de talents scientifiques au lycée. Il s'agit d'un système numérique positionnel non standard qui utilise le nombre imaginaire 2i comme base. Il est capable pour représenter chaque nombre complexe en utilisant uniquement les chiffres 0, 1, 2 et 3. " la source

"Les chiffres romains sont un système biquinaire." la source

"Senary peut être considéré comme utile dans l'étude des nombres premiers puisque tous les nombres premiers, lorsqu'ils sont exprimés en base six, autres que 2 et 3 ont 1 ou 5 comme chiffre final." la source

"Le sexagésimal (base 60) est un système numérique dont la base est soixante. Il est originaire des anciens Sumériens au 3ème millénaire avant JC, il a été transmis aux anciens Babyloniens, et il est encore utilisé - sous une forme modifiée - pour mesurer temps, angles et coordonnées géographiques qui sont des angles. " la source

etc...

Cette liste est un bon point de départ.

Benjamin
la source
6
Aucun de ceux-ci n'est lié aux algorithmes.
BlueRaja - Danny Pflughoeft
11
Bien sûr qu'ils le sont. Construire un triangle de Triangle de Sierpinski en ternaire ou calculer les coordonnées géographiques en sexagésimal. Que diriez-vous d'un algorithme pour transformer les chiffres romains en nombres décimaux? Qu'en est-il des algorithmes de recherche de nombres premiers basés sur le système sénaire?
Benjamin
9

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.

Ben Horner
la source
3
Je pense que c'est complètement volé dans le post de templatetypedef, il a dû rester coincé dans mon subconscient. Je l'ai seulement laissé parce qu'il parle de plus de bases que de binaires.
Ben Horner
2
Cela génère tous les partitionnements avec au plus p partitions, et il y a des redondances. Comment est 111222distinct de 222111?
Null Set le
7

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.

templatetypedef
la source
2
C'est le moyen le plus simple de générer des sous-ensembles :)
st0le
C'est la façon la plus simple de compter dans les concepts combinatoires.
Saeed Amiri
@ st0le- Je pense que c'est un peu plus compliqué que la version standard car elle répertorie les ensembles dans l'ordre lexicographique, plutôt que l'ordre normal que vous obtenez du mappage un à un entre les bits et l'inclusion d'ensemble.
templatetypedef
6

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 .

mhum
la source
6

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.

 n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}

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:

         / (I + A) * G(K, A^2)        , if N = 2K
G(N,A) = |
         \ I + (A + A^2) * G(K, A^2)  , if N = 2K + 1

aussi,

         / (I + A + A^2) * G(K, A^3)           , if N = 3K
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3)     , if N = 3K + 1
         \ I + A * (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 2

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é:

         / (I + A + A^2) * G(K, A^3)       , if N = 0 or 3 mod 6
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 1 or 4 mod 6
         | (I + A) * G(3K + 1, A^2)        , if N = 2 mod 6
         \ I + (A + A^2) * G(3K + 2, A^2)  , if N = 5 mod 6

Regardez l'article pour une meilleure explication car je ne suis pas un expert dans ce domaine.

Egon
la source
5

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)

Martin DeMello
la source
C'était un article génial et j'ai fini par l'utiliser dans une conférence que j'ai donnée intitulée «Fun with Number Systems». Merci beaucoup de publier ceci!
templatetypedef
Bienvenue et heureux que vous ayez pu l'utiliser!
Martin DeMello
5

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:

'A'*b^3+'B'*b^2+'C'*b^1+'D'*b^0

En substituant des valeurs ASCII aux caractères et en prenant b à 256, cela devient,

65*256^3+66*256^2+67*256^1+68*256^0

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.

MAK
la source
4

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.

flolo
la source
3

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.

Match nul
la source
1

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).

suffisant
la source
1
Et n'importe quel système de calendrier - maya, lunaire, babylonien ... avec la monnaie anglaise avant 1971 (LSD). Comme vous le dites, la liste est longue.
Chris Walton
1

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.

Michael Anderson
la source
0

Peut-être AKS est le cas.

Saeed Amiri
la source