Mathematica, 79 bayt
Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]-2⌊(2#)^.5+.5⌋+⌈Sqrt[8#+1]~Mod~1⌉&
açıklama
Algoritmayı bu zorlukla uygulamak için canımı sıkmadı, bu yüzden çözüme giden bir kısayol aramak istedim. Bir tane bulurken maalesef algoritmayı uygulayan Mathematica cevabını geçmiyor. Bununla birlikte, bunun henüz en iyi şekilde golf oynamadığından eminim ve bu yaklaşımdan ya da süreçte edinilen bazı fikirlerden faydalanabilecek başka diller olabilir.
Bu yüzden hesaplamamız gereken dizinin:
f (n) = 2 * ( A212652 (n) - A002024 (n)) + 1 + A023532 (n-1)
Alternatif olarak, eğer n bir üçgen sayı ise f (n) = 1, aksi takdirde f (n) = 2 * ( A212652 (n) - A002024 (n) + 1) olur .
İlk ifadede, A023532 basitçe bu iki farklı durumu kodlar. Diğer iki dizi (artı 1) en büyük tam sayıyı arasında fark vardır k en uzun ayrışma n ardışık tamsayılar (k-i + 1) + (k-i + 2) + ... + k = n ve en büyük tamsayı j, böylece 1 + 2 + ... + j <n .
Biraz daha basit bir ifadeyle, burada olmayan üçgen sayılar için cevap bulmak nasıl: Birincisi, büyük üçgen sayı bulmak T j olduğunu az daha n . Daha sonra j , 1. adımda eklenen sondan fazla tamsayıdır (çünkü j + 1 ekledikten sonra n'yi geçeceğiz ). Ardından n'yi mümkün olduğu kadar çok sayıda (veya küçük) ardışık tamsayıya ayırın ve bu sayılar arasında en fazla k'yi çağırın . Sonuç sadece 2 * (kj) . Bunun sezgisel nedeni, ayrıştırmadaki maksimum değerin diğer her adımda 1 oranında artması ve ulaştığımızda durmamızdır.k .
Bunun işe yaradığını ispatlamak için dört şey göstermemiz gerekiyor:
- Üçgen sayılar için f (n) = 1 . Bu esasen böyledir, çünkü ilk adım basitçe tüm üçgen sayıları boyunca yinelenir. Biz vurursanız n bu süreçte tam bitti ve hesaplamak için sadece bir adım yoktu.
- Diğer tüm numaralar için, bir ekleme adımından sonra asla bir silme adımından sonra sonlanır. Bu, diğer tüm f (n) ' nin eşit olduğu anlamına gelir .
- Birinciden sonraki her ekleme adımında, yalnızca tek bir sayı ekleriz. Bu, kj çift basamaklarından sonra k dahil bir ayrışmaya ulaşacağımızı garanti eder .
- Elde ettiğimiz n'in nihai ayrışması , her zaman n'nin ardışık tam sayılara mümkün olan en uzun ayrışması veya başka bir deyişle, her zaman n'nin toplam sayılar arasında en düşük azami dağılışıdır. Başka bir deyişle, toplamı eklediğimiz son sayı her zaman A212652 (n) 'dir .
Neden (1) doğru olduğunu zaten gösterdik. Sonra, ilk adım hariç (üçgen olmayan sayılar için gerçekleşmeyen) bir ekleme adımına son veremeyeceğimizi kanıtlıyoruz.
Bir ekleme adımında sona erdiğimizi , toplama p değerini ekledikten sonra n'ye ulaşdığımızı varsayalım . Bu, bu ekleme adımından önce, değerin np olduğu ( veya bir kerede birden fazla değer eklediğimizde daha az olduğu) anlamına gelir . Ancak bu ekleme adımından önce bir silme adımından önce geldik (çünkü 1. adımda n'ye vuramadık ). Bu silme adımı sırasında çıkardığımız son q , algoritmanın çalışmasından dolayı mutlaka p'den daha azdı . Çıkarılmış önce Ama bu araçlar q biz , n-p + q ( daha az ya da daha az olan) n. Ancak bu bir çelişkidir, çünkü başka bir q'yu çıkarmak yerine n-p + q'ya bastığımızda tamsayıları kaldırmak zorunda kalmazdık . Bu, yukarıdaki (2) noktasını kanıtlar. Şimdi her zaman bir silme adımına son verdiğimizi ve bu nedenle tüm üçgen olmayan sayıların bile çıktıları olduğunu biliyoruz.
Daha sonra kanıtlıyoruz (3), her ekleme adımının sadece bir değer ekleyebileceğini kanıtlıyoruz. Bu aslında (2) nin bir sonucudur. Bir değer ekledikten sonra tam olarak n'e vuramayacağımızı ve ispatın bir eşitsizlik kullandığından beri, n'in altına da çıkamayacağımızı gösterdik (o zamandan beri n-p + q hala n'den az olurdu ve kaldırmamalıydık) ilk etapta bu kadar değer). Bu yüzden ne zaman tek bir değer eklesek, n'i geçmemiz garantilidir, çünkü daha küçük bir değeri kaldırarak n altına indik. Dolayısıyla, toplamın üst kısmının diğer her adımda 1 arttığını biliyoruz . Biz (o en küçük olan bu üst ucunun başlangıç değerini bilmek m böyleT m > n ). Şimdi son toplamı bulduktan sonra bu üst ucu bulmamız gerekiyor. O zaman adım sayısı farkın iki katıdır (artı 1).
Bunu yapmak için, (4), son toplamın her zaman n'nin mümkün olduğu kadar çok sayıda tamsayıya ayrıştırılması olduğunu veya bu ayrıştırmadaki maksimum değerin en az olduğu yerde ayrıştırma olduğunu (yani, mümkün olan en eski ayrıştırma) kanıtlıyoruz. Bunu yine çelişki ile yaparız (bu kısımdaki ifadeler biraz daha titiz olabilirdi, ama ben zaten bunun için çok fazla zaman harcadım ...).
N'nin mümkün olan en erken / en uzun ayrışmanın bazı a + (a + 1) + ... (b-1) + b , a ≤ b olduğunu ve algoritmanın atladığını söyleyin. O zaman bu araçlar b ilave alır, bir zorunluluk artık toplamı bir parçası olabilir. Eğer bir toplamı bir parçasıydı lar , o zaman olurdu n ≤ s o anda. Yani ya toplamı sadece gelen değerleri içeren bir karşı b eşittir, n ve biz (dolayısıyla biz bu ayrışma atlamak değildi) durdurmak veya daha az en az bir değer yoktur bir hangi durumda toplamında, kazanmak n <sve biz kesin toplamı elde edinceye kadar bu değer ortadan kalkacaktı (yine, ayrışma atlanmadı). Bu yüzden kurtulmak olurdu bir eklemeden önce b . Ama biz olurdu demek olduğunu bir durum ulaşmak için bir toplamının en küçük bileşenidir ve büyük değildir b henüz. Ancak, bu noktada biz kaldıramazsınız bir toplamı açıkça daha az olduğu için, n (çünkü b eksik), biz eklemek kadar ilk değerlerini eklemek için gerekli konum böylece b ve isabet n tam olarak. Bu kanıtlar (4).
Öyleyse bunları birlikte almak: İlk adım çiftinin bize maksimum A002024 (n) değeri verdiğini biliyoruz . Son ayrışmanın maksimum değerinin A212652 (n) olduğunu biliyoruz . Ve bu maksimumın her adımda bir artırıldığını biliyoruz. Dolayısıyla, son ifade 2 * ( A212652 (n) - A002024 (n) + 1) 'dir . Bu formül neredeyse üçgensel sayılar için işe yarar, bunun dışında 2 yerine sadece 1 adım gerekli olanların dışında, bu nedenle sonucu üçgensel sayıların (veya tersi, hangisi daha uygunsa) gösterge işlevi ile düzeltiriz.
Son olarak, uygulamaya gelince. Önceki dizi için OEIS'den MIN (tek d | n; n / d + (d-1) / 2) formülünü kullanıyorum . MIN ifadesini almak için 2 faktörünü bu ifadeye alırsak, birkaç bayttan tasarruf edersek ortaya çıkıyor , çünkü -1 , ilk sürümümde +1 ile iptal ettiğinden ve f (n) ile doğrudan üçgen şeklinde olan ve üçgen sayılar için iki olgu kodlar. Kodda, bu:
Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]
İkinci sıra için ( 1, 2, 2, 3, 3, 3, ...
) basit bir kapalı form kullanabiliriz:
⌊(2#)^.5+.5⌋
Ve son olarak, 8n + 1 mükemmel bir kare olduğunda üçgen sayıların ters gösterge işlevi 0'dır . Bu, Mathematica’da şu şekilde ifade edilebilir:
⌈Sqrt[8#+1]~Mod~1⌉
Bu son iki diziyi ifade etmenin ve aralarındaki bazı sabit dengeleri kaydırmanın birçok yolu var, bu yüzden bunun henüz en uygun bir uygulama olmadığından eminim, ancak umarım bu, başkalarına yeni yaklaşımlara bakmak için bir başlangıç noktası verebilir. kendi dilleri
Tüm bu sıkıntılara gittiğimden, işte n = 1000'e kadar olan dizilerin bir grafiği: ( Birkaç saniye içinde 100k'yi de hesaplayabilirim, ancak ek bir içgörü göstermiyor):
Bu çok düz çizgilerle ilgili varyasyonlara bakmak ilginç olabilir, ama bunu başkasına bırakacağım ...