Mathematica, 79 bytes
Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]-2⌊(2#)^.5+.5⌋+⌈Sqrt[8#+1]~Mod~1⌉&
Explicação
Não me incomodei em implementar o algoritmo no desafio, então queria procurar um atalho para a solução. Embora eu tenha encontrado um, infelizmente não bate a resposta do Mathematica que implementa o algoritmo. Dito isso, tenho certeza de que ainda não está otimizado, e pode haver outros idiomas que podem se beneficiar dessa abordagem ou de algumas das idéias obtidas no processo.
Por isso, afirmo que a sequência que devemos calcular é:
f (n) = 2 * ( A212652 (n) - A002024 (n)) + 1 + A023532 (n-1)
Como alternativa, é f (n) = 1 se n for um número triangular ef (n) = 2 * ( A212652 (n) - A002024 (n) + 1) caso contrário.
Na primeira expressão, A023532 simplesmente codifica esses dois casos diferentes. As outras duas seqüências (mais 1) são a diferença entre o maior número inteiro k na decomposição mais longa de n em números inteiros consecutivos (k-i + 1) + (k-i + 2) + ... + k = n e o maior número inteiro j, de modo que 1 + 2 + ... + j <n .
Em palavras um pouco mais simples, é aqui como encontramos a resposta para os números não triangular: primeiro, encontrar o maior número triangular T j que é menos do que n . Então j é o penúltimo número inteiro que é adicionado durante a etapa 1 (porque depois de adicionar j + 1 , teremos excedido n ). Decomponha n em tantos (ou tão pequenos) números inteiros consecutivos quanto possível e chame o máximo entre esses números k . O resultado é simplesmente 2 * (kj) . A razão intuitiva para isso é que o máximo na decomposição cresce 1 ponto a cada dois passos e paramos quando atingimosk .
Precisamos mostrar quatro coisas para provar que isso funciona:
- f (n) = 1 para números triangulares. Esse é trivialmente o caso, porque o primeiro passo simplesmente interage com todos os números triangulares. Se acertarmos n exatamente durante esse processo, terminaremos e houve apenas uma etapa para calcular.
- Para todos os outros números, sempre terminamos após uma etapa de exclusão, nunca após uma etapa de inserção. Isso significa que todos os outros f (n) são pares.
- Em cada etapa de inserção após a primeira, adicionamos apenas um único número. Isso garante que alcançaremos uma decomposição incluindo pares de etapas k após kj .
- A decomposição final de n que obtemos é sempre a maior decomposição possível de n em números inteiros consecutivos, ou seja, é sempre a decomposição de n com o menor valor máximo entre os números somados. Em outras palavras, o último número que adicionamos à soma é sempre A212652 (n) .
Já mostramos por que (1) é verdadeiro. Em seguida, provamos que não podemos terminar em uma etapa de inserção, exceto a inicial (o que não ocorre para números não triangulares).
Suponha que tenhamos terminado uma etapa de inserção, atingindo n após adicionar um valor p à soma. Isso significa que, antes desta etapa de inserção, o valor era np ( ou menos se adicionássemos vários valores de uma vez). Mas essa etapa de inserção foi precedida por uma etapa de exclusão (já que não poderíamos ter atingido n durante a etapa 1). O último valor q removemos durante esta etapa de exclusão foi necessariamente menor que p devido à maneira como o algoritmo funciona. Mas isso significa que, antes de removermos q , tínhamos n-p + q ( ou menos ), que é menor que n. Mas isso é uma contradição, porque teríamos que parar de remover números inteiros quando atingimos n-p + q em vez de remover outro q . Isso prova o ponto (2) acima. Então agora sabemos que sempre terminamos em uma etapa de exclusão e que, portanto, todos os números não triangulares têm saídas pares.
A seguir, provamos (3) que cada etapa de inserção pode inserir apenas um valor. Este é essencialmente um corolário de (2). Mostramos que, após adicionar um valor, não podemos atingir n exatamente e, como a prova estava usando uma desigualdade, também não podemos terminar abaixo de n (já que n-p + q ainda seria menor que n e não deveríamos ter removido que muitos valores em primeiro lugar). Portanto, sempre que adicionamos um único valor, é garantido que excedamos n, porque ficamos abaixo de n removendo um valor menor. Portanto, sabemos que a extremidade superior da soma cresce 1 em cada dois passos. Sabemos o valor inicial deste extremidade superior (é o menor m tal queT m > n ). Agora só precisamos descobrir esse limite superior quando chegarmos à soma final. Então o número de etapas é simplesmente o dobro da diferença (mais 1).
Para fazer isso, provamos (4) que a soma final é sempre a decomposição de n em tantos números inteiros quanto possível, ou a decomposição em que o máximo nessa decomposição é mínimo (ou seja, é a decomposição mais antiga possível). Faremos isso novamente por contradição (a redação desta parte pode ser um pouco mais rigorosa, mas eu já gastei muito tempo nisso ...).
Digamos que a decomposição mais antiga / mais longa possível de n seja a + (a + 1) + ... (b-1) + b , a ≤ b , e digamos que o algoritmo a ignore. Isso significa que, no momento em que b é adicionado, a não deve mais fazer parte da soma. Se a fizesse parte da soma s , teríamos n ≤ s naquele momento. Portanto, ou a soma contém apenas os valores de a a b , que é igual a n e paramos (portanto, não pulamos essa decomposição) ou há pelo menos um valor menor que a na soma, ganhe nesse caso n <se esse valor seria removido até atingirmos a soma exata (novamente, a decomposição não foi ignorada). Portanto, teríamos que nos livrar de a antes de adicionar b . Mas isso significa que teríamos que chegar a uma situação em que a seja o menor componente da soma e o maior ainda não seja b . No entanto, nesse ponto, não podemos remover a , porque a soma é claramente menor que n (já que b está ausente), portanto, é necessário adicionar valores primeiro até adicionarmos b e pressionar n exatamente. Isso prova (4).
Então, juntando essas coisas: sabemos que o primeiro par de etapas nos fornece um valor máximo de A002024 (n) . Sabemos que o valor máximo da decomposição final é A212652 (n) . E sabemos que esse máximo é incrementado uma vez em cada par de etapas. Portanto, a expressão final é 2 * ( A212652 (n) - A002024 (n) + 1) . Essa fórmula quase funciona para números triangulares, exceto que para aqueles que precisamos apenas de 1 etapa em vez de 2, é por isso que corrigimos o resultado com a função indicadora dos números triangulares (ou sua inversa, o que for mais conveniente).
Finalmente, quanto à implementação. Para a sequência anterior, estou usando a fórmula MIN (ímpar d | n; n / d + (d-1) / 2) da OEIS. Acontece que salvamos alguns bytes se levarmos o fator 2 para essa expressão para obter MIN (ímpar d | n; 2n / d + d-1) , porque esse -1 então cancela com o +1 na minha primeira versão de f (n) que codifica diretamente os dois casos para números triangulares e não triangulares. No código, isso é:
Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]
Para a última sequência ( 1, 2, 2, 3, 3, 3, ...
), podemos usar um formulário fechado simples:
⌊(2#)^.5+.5⌋
E, finalmente, a função indicadora inversa dos números triangulares é 0 sempre que 8n + 1 é um quadrado perfeito. Isso pode ser expresso no Mathematica como
⌈Sqrt[8#+1]~Mod~1⌉
Existem várias maneiras de expressar essas duas últimas seqüências e de mudar um deslocamento constante entre elas. Portanto, tenho certeza de que essa ainda não é uma implementação ideal, mas espero que isso possa dar aos outros um ponto de partida para examinar novas abordagens no suas próprias línguas.
Desde que eu resolvi esse problema, aqui está um gráfico da sequência de n = 1000 (eu também poderia calcular 100k em alguns segundos, mas na verdade não mostra nenhum insight adicional):
Pode ser interessante examinar as variações dessas linhas muito retas, mas deixarei isso para outra pessoa ...