Mathematica, 79 octets
Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]-2⌊(2#)^.5+.5⌋+⌈Sqrt[8#+1]~Mod~1⌉&
Explication
Je ne pouvais pas être dérangé pour implémenter l'algorithme dans le défi, alors je voulais chercher un raccourci vers la solution. Bien que j'en ai trouvé un, malheureusement, il ne bat pas la réponse de Mathematica qui implémente l'algorithme. Cela dit, je suis sûr que le jeu n’est pas encore optimal et que d’autres langues pourraient bénéficier de cette approche ou de certaines des connaissances acquises au cours du processus.
Je prétends donc que la séquence que nous sommes supposés calculer est la suivante:
f (n) = 2 * ( A212652 (n) - A002024 (n)) + 1 + A023532 (n-1)
Sinon, c'est f (n) = 1 si n est un nombre triangulaire et f (n) = 2 * ( A212652 (n) - A002024 (n) + 1) sinon.
Dans la première expression, A023532 code simplement ces deux cas différents. Les deux autres séquences (plus 1) représentent la différence entre le plus grand entier k de la plus longue décomposition de n en entiers consécutifs (k-i + 1) + (k-i + 2) + ... + k = n et le plus grand entier j tel que 1 + 2 + ... + j <n .
En termes plus simples, voici comment trouver la réponse aux nombres non triangulaires: premièrement, trouvez le plus grand nombre triangulaire T j qui est inférieur à n . Alors j est l’avant-dernier nombre entier ajouté lors de l’étape 1 (car après avoir ajouté j + 1, nous aurons dépassé n ). Décomposez ensuite n en autant d’entiers consécutifs que possible (ou le plus petit possible) et appelez le maximum parmi ces nombres k . Le résultat est simplement 2 * (kj) . La raison intuitive en est que le maximum dans la décomposition augmente de 1 à chaque étape et nous nous arrêtons lorsque nous atteignons.k .
Nous devons montrer quatre choses pour prouver que cela fonctionne:
- f (n) = 1 pour les nombres triangulaires. C’est trivialement le cas, car la première étape consiste simplement à parcourir tous les nombres triangulaires. Si nous touchons n exactement pendant ce processus, nous avons terminé et il n'y avait qu'une seule étape pour calculer.
- Pour tous les autres numéros, nous finissons toujours après une étape de suppression, jamais après une étape d’insertion. Cela signifie que tous les autres f (n) sont pairs.
- A chaque étape d'insertion après la première, nous ajoutons un seul numéro. Cela garantit que nous arriverons à une décomposition comprenant k après kj paires de pas.
- La décomposition finale de n que nous obtenons est toujours la plus longue décomposition possible de n en nombres entiers consécutifs, ou, en d'autres termes, c'est toujours la décomposition de n avec le maximum le plus bas parmi les nombres additionnés. En d'autres termes, le dernier nombre ajouté à la somme est toujours A212652 (n) .
Nous avons déjà montré pourquoi (1) est vrai. Ensuite, nous prouvons que nous ne pouvons pas terminer sur une étape d’insertion à l’exception de la première (ce qui n’arrive pas pour les nombres non triangulaires).
Supposons que nous terminions sur une étape d'insertion, atteignant n après avoir ajouté une valeur p à la somme. Cela signifie qu'avant cette étape d'insertion, la valeur était np ( ou inférieure si nous ajoutions plusieurs valeurs à la fois). Mais cette étape d’insertion a été précédée d’une étape de suppression (nous n’aurions pas pu toucher n lors de l’étape 1). La dernière valeur q que nous avons supprimée au cours de cette étape de suppression était nécessairement inférieure à p en raison du fonctionnement de l'algorithme. Mais cela signifie que, avant de retirer q, nous avions n-p + q ( ou moins ), ce qui est inférieur à n. Mais ce qui est une contradiction, parce que nous aurions dû arrêter la suppression des entiers lorsque nous avons atteint n-p + q au lieu d'enlever une autre q . Cela prouve le point (2) ci-dessus. Nous savons donc maintenant que nous terminons toujours par une étape de suppression et que, par conséquent, tous les nombres non triangulaires ont des sorties paires.
Ensuite, nous prouvons (3) que chaque étape d’insertion ne peut insérer qu’une valeur. Ceci est essentiellement un corollaire de (2). Nous avons montré qu'après avoir ajouté une valeur, nous ne pouvions pas atteindre n exactement et puisque la preuve utilisait une inégalité, nous ne pouvions pas non plus nous retrouver sous n (depuis lors, n-p + q serait toujours inférieur à n et nous n'aurions pas dû être supprimés). autant de valeurs en premier lieu). Donc, chaque fois que nous ajoutons une seule valeur, nous sommes assurés de dépasser n parce que nous sommes passés en dessous de n en supprimant une valeur plus petite. Par conséquent, nous savons que la partie supérieure de la somme augmente de 1 à chaque étape. Nous connaissons la valeur initiale de cette extrémité supérieure (c’est le plus petit m tel queT m > n ). Maintenant, il ne nous reste plus qu'à déterminer cette limite supérieure une fois que nous aurons atteint la somme finale. Ensuite, le nombre d'étapes est simplement le double de la différence (plus 1).
Pour ce faire, nous prouvons (4) que la somme finale est toujours la décomposition de n en autant d’entiers que possible, ou la décomposition où le maximum de cette décomposition est minimal (c’est-à-dire la décomposition la plus précoce possible). Nous le ferons à nouveau par contradiction (le libellé de cette partie pourrait être un peu plus rigoureux, mais j'ai déjà passé beaucoup trop de temps à ce sujet ...).
Disons que la décomposition la plus ancienne / la plus longue possible de n est un peu a + (a + 1) + ... (b-1) + b , a ≤ b , et que l'algorithme la saute. Cela signifie qu'au moment où b est ajouté, a ne doit plus faire partie de la somme. Si a faisait partie de la somme s , alors nous aurions n ≤ s à ce moment. Donc soit la somme ne contient que les valeurs de a à b , ce qui équivaut à n et nous nous arrêtons (par conséquent, nous n'avons pas ignoré cette décomposition), ou bien il existe au moins une valeur inférieure à a dans la somme, gagner auquel cas n <set cette valeur serait supprimée jusqu'à ce que nous atteignions la somme exacte (encore une fois, la décomposition n'a pas été ignorée). Il faudrait donc nous débarrasser de a avant d’ajouter b . Mais cela signifie que nous devrions atteindre une situation dans laquelle a est la plus petite composante de la somme, et la plus grande n'est pas encore b . Cependant, à ce stade, nous ne pouvons pas supprimer a , car la somme est clairement inférieure à n (puisque b est manquant), nous devons donc ajouter des valeurs en premier jusqu'à ce que nous ajoutions b et n exactement. Cela prouve (4).
Donc, en prenant ces choses ensemble: nous savons que la première paire d’étapes nous donne une valeur maximale de A002024 (n) . Nous savons que la valeur maximale de la décomposition finale est A212652 (n) . Et nous savons que ce maximum est incrémenté une fois par paire. Par conséquent, l'expression finale est 2 * ( A212652 (n) - A002024 (n) + 1) . Cette formule fonctionne presque pour les nombres triangulaires, sauf que pour ceux-ci nous avons seulement besoin d'un pas, c'est pourquoi nous corrigeons le résultat avec la fonction indicatrice des nombres triangulaires (ou son inverse, selon ce qui convient le mieux).
Enfin, quant à la mise en œuvre. Pour la première séquence, j'utilise la formule MIN (impaire d | n; n / d + (d-1) / 2) d'OEIS. Il s'avère économiser quelques octets si nous prenons le facteur 2 dans cette expression pour obtenir MIN (impair d | n; 2n / j + d-1) , car -1 s'annule alors avec le +1 dans ma première version de f (n) qui code directement les deux cas pour les nombres triangulaires et non triangulaires. Dans le code, c'est:
Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]
Pour cette dernière séquence ( 1, 2, 2, 3, 3, 3, ...
), nous pouvons utiliser un formulaire fermé simple:
⌊(2#)^.5+.5⌋
Enfin, la fonction indicatrice inverse des nombres triangulaires est 0 lorsque 8n + 1 est un carré parfait. Ceci peut être exprimé dans Mathematica comme
⌈Sqrt[8#+1]~Mod~1⌉
Il y a beaucoup de façons d'exprimer ces deux dernières séquences et de décaler un décalage constant entre elles. Je suis donc certain que cette implémentation n'est pas encore optimale, mais j'espère que cela pourrait donner à d'autres un point de départ pour explorer de nouvelles approches. leurs propres langues.
Depuis que je suis allé à tous ces problèmes, voici un graphique de la séquence allant jusqu'à n = 1000 (je pourrais aussi calculer 100k en quelques secondes, mais cela ne montre pas vraiment d'informations supplémentaires):
Il serait peut-être intéressant d'examiner les variations à propos de ces lignes très droites, mais je laisserai cela à quelqu'un d'autre ...