Asal faktörlerden türetilen bir tam sayı dizisi hesaplama


10

Aşağıdakileri yapan bir işlev, ifade veya program oluşturun:

  1. Herhangi bir sayının asal faktörlerini alın ve toplayın. Örneğin, 28'in asal faktörleri 11 ile toplanan 2 2 7'dir.
  2. Sonucu verilen sayı için asal faktörlerin sayısı ile çarpın. Örneğin, 28, 11'e karşılık gelen 3 ana faktöre sahiptir. 11 * 3, 33'tür.
  3. Listede bulunan bir numaraya ulaşana kadar sonuç listesini (orijinal numarayla başlayan) kaydederek işlemi yinelemeli olarak tekrarlayın. Bu son numarayı eklemeden durdurun, böylece listede hiçbir kopya bulunmaz. 28 için ilerleme 28 33'tür, çünkü 33 tekrar 28 ile sonuçlanır.
  4. Sonuç listesindeki öğeleri sayın. 28 durumunda cevap 2'dir.

İşte sonuçları 0<n<=10, böylece algoritmanızı kontrol edebilirsiniz.

2 1 1 10 1 11 1 9 5 10

(Balpha'nın işaret ettiği gibi, higley(1)1 0 listesinden cevabı 2'dir. J'de yazılmış orijinal algoritmamdaki bir hata nedeniyle başlangıçta 1 vardı.)

Kibirli bir SOB olduğum ve bunu OEIS'te bulamadığım için, en azından bu kod golf turu boyunca buna "Higley Dizisi" diyelim. Ek bir avantaj olarak, ilk iki bulmak ndüşük olan higley(n)yerlerde nasal ve değildir n>1. (Bence sadece iki tane var, ama kanıtlayamıyorum.)

Bu standart kod golf, bu yüzden her zamanki gibi en az tuş vuruşu kazanır, ancak ayrıntılı olsalar bile, diğer dillerde akıllı cevapları upvote etmenizi rica ediyorum.


4
Neden highley(1) == 1? 4 sonuçlanan listesi) yani biri hiçbir asal çarpanları vardır [1, 0]bu yüzden, highley(1) == 2gördüğüm kadarıyla.
balpha

Giriş sayısı ve ara değerlerin 2 ^ 31-1'den büyük olmayacağını varsayabilir miyiz (yani işaretli bir 32 bit tam sayıya sığar)?
Peter Taylor

@Peter Taylor Sure.
Gregory Higley

Herhangi birinin yararlı bulması durumunda, belirsiz bir şekilde ilişkili ve biraz ilham verebilen OEIS dizileri A001414, A001222 ve A002217'dir.
Peter Taylor

1
yorum yapmadığınız için fark etmediğinizi varsayıyorum: Sadece iki asal olmayan sabitleme noktasının olduğunu kanıtladım ve yazıma ek olarak ekledim.
Peter Taylor

Yanıtlar:


6

J, 47 45

#@((~.@,[:(+/@{:*+/@:*/)2 p:{:)^:_)`2:@.(=&1)

Bu kullanmadan çok daha kısa olabilir ^:_, ama beynim zaten yeterince kızartılmış.

Düzenleme: (47-> 45) Çift kupon günü.

Kullanımı:

   higley =: #@((~.@,(+/@{:*+/@:*/)@(2&p:)@{:)^:_)`2:@.(=&1)
   higley 1
2
   higley"0 (1 + i. 10)
2 1 1 10 1 11 1 9 5 10

Vaov! GolfScript çözümünden daha kısa AJ çözümü. İlk gördüm. (Ben J.'nin büyük bir hayranıyım)
Gregory Higley

3
Biraz farklı bir algoritma kullanarak bunu önemli ölçüde kısaltabilirsiniz: #@((~.@,((+/*#)@:q:)@{:)^:_)`2:@.(=&1)38 karakterdir.
Gregory Higley

Vay canına, q: Geçmişe bakıldığında bariz.
Jesse Millikan

Karakterlerin patlamasına bakıp " geçmişe bakıldığında bariz " diyebilmeniz aklımı uçuruyor. Bu günlerden birinde Golfscript ya da J.'ye bakmalıyım
Casey

@Casey Bir seferde aynı şekilde hissettim, ama ne kadar çok J öğrenir ve kullanırsanız, o kadar çok "size sıçrar", ama yine de bilmem gereken şeyler görüyorum. J hakkında bilmek yararlı bir şey, bir eklemek eğer. ya: sembolü sonra, yeni bir sembol, örneğin yaratır {, {.ve {:tüm ortalama farklı şeyler, ama {-(örneğin) kesinlikle iki şey dizisidir, {ve -.
Gregory Higley

5

Golfscript, 68 67 62 61 karakter

[.]({[.2@{1$1$%{)}{\1$/1$}if}*;;].,*0+{+}*.2$?@@.@+\@)!}do;,(

Bu bir ifadedir: nyığını alır ve sonucu yığın üzerinde bırakır. nStdin'den alınan ve sonucu stdout'a yazdıran bir programa dönüştürmek için [,~

Kalbi [.2@{1$1$%{)}{\1$/1$}if}*;;](28 karakter) yığının en üst sayısını alır ve (inanılmaz derecede verimsiz bir algoritma ile) asal faktörlerinin bir listesini oluşturur. C tarzı sözde kod eşdeğeri:

ps = [], p = 2;
for (int i = 0; i < n; i++) {
    if (n % p == 0) {
        ps += p;
        n /= p;
    }
    else p++;
}

0+Hemen önce {+}*özel durum işlemek için olan n==1Golfscript boş liste üzerinde bir ikili işlem katlama gibi değil, çünkü.

Asal olmayan sabitleme noktalarından biri 27'dir; Ben bunu bir == p (a-1) / 2 ise bir düzeltme noktası olan eşleme (p a -> a 2 p) düşünerek ve küçük çalışarak programı kullanmadan buldum . ( Asal fiksasyonunu verir).aa==1

Programla arama yapmak ikinci bir düzeltme noktası açar: 30 = (2 + 3 + 5) * 3


Ek: yalnızca iki asal olmayan sabitleme noktası olduğunun kanıtı

İşaretleme: Tekrarlama ile sopfr(x)ilgili başlıca faktörlerin toplamıdır x(A001414). (A001222) ' Omega(x)nin ana faktörlerinin xsayısıdır. Higley halefi işlevih(x) = sopfr(x) Omega(x)

Diyelim ki bir asal N = h(N)ürün olan bir sabitleme noktamız var n=Omega(N).

N = p_0 ... p_{n-1} = h(N) = n (p_0 + ... + p_{n-1})

Temel sayı teorisi: nbölünür p_0 ... p_{n-1}, bu nedenle w=Omega(n)bu asallar asal faktörlerdir n. Wlog, onları sonuncu olacağız w. Böylece her iki tarafı da bölebilir nve

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-1}

veya

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-w-1} + sopfr(n)

Asal tüm göz önüne alındığında p_0için p_{n-w-1}bunlardan herhangi LHS daha RHS daha artar artan 1'den büyüktür. Böylece belirli bir naday için tüm aday çözümleri sıralayabiliriz.

Özellikle, LHS RHS'den büyükse, tüm "serbest" primerleri 2'ye ayarlayan bir çözüm olamaz. Yani

2^{n-w} > 2 (n-w) + sopfr(n)

Çünkü sopfr(n) <= n(sadece n = 4 veya n prime için eşitlikle), eğer varsa, herhangi bir sabitleme noktası olmadığını daha zayıf bir şekilde ifade edebiliriz.

2^{n-w} > 3 n - 2 w

Holding, wbiz farklı değerlerini seçebilirsiniz sabit ntatmin w=Omega(n). En küçük Böyle nolduğu 2^w. Eğer Not bu 2^{n-w}en az 3 olan (diğer bir deyişle, eğer n-w>1doğru olan ise n>2) daha sonra artan ntutarken wsabit daha RHS daha LHS artacaktır. Ayrıca, w>2mümkün nolan en düşük düzeyde ve eşitsizliğin karşılandığına ve hiçbir sabitleme noktasının bulunmadığına dikkat edin.

Bu bizi üç davaya bırakır: w = 0ve n = 1; w = 1ve nasaldır; veya w = 2ve nyarı asaldır.

Olgu w = 0. n = 1, Nherhangi bir asal.

Olgu w = 1. Eğer n = 2öyleyse N = 2pve ihtiyacımız var p = p + 2, bunun çözümü yok. Eğer n = 3öyleyse pq = p + q + 3ve iki çözümümüz var (p=2, q=5)ve (p=3, q=3). Eğer n = 5öyleyse 2^4 > 3 * 5 - 2 * 1, başka çözüm yoktur w = 1.

Olgu w = 2. Eğer n = 4öyleyse N = 4pqve ihtiyacımız var pq = p + q + 4. Bunun tamsayı bir çözümü vardır p=2, q=6, fakat asal bir çözümü yoktur. Eğer n = 6öyleyse 2^4 > 3 * 6 - 2 * 2, başka çözüm yoktur w = 2.

Tüm vakalar tükendi, bu nedenle tek asal olmayan sabitleme noktaları 27 ve 30'dur.


1
Kalem ve kağıt kullanarak aynı iki sabit noktayı buldum: 27 ve 30. OP'ye katılıyorum, sadece ikisi gibi görünüyor.
mellamokb

1
Bir sonraki ilginç soru olabilir. Sonsuz sayıda higley (x) = 2 var mı? Higley (x) = 100 gibi keyfi higley (x) üretmenin bir yolu var mı?
mellamokb

Çok hoş! Ben J erkeğim ama GolfScript'i öğrenmek zorunda kalabilirsiniz.
Gregory Higley

@mellamokb Bence bu dizi ile ilgili ilginç sorular var. Örneğin n, sayılmadan önce her biri için üretilen sayı dizisini dikkate alırsak, 49'dan nsonra adı geçen dizinin 28'de bitmediği herhangi bir asal olmayan var mı?
Gregory Higley

2
Sorulması gereken bir başka ilginç soru, yukarıdaki nsınırların basit bir fonksiyonunun olup olmadığıdır higley(n). (Bu, döngüyü önemli ölçüde basitleştirmeye izin verir - sadece yineleme f(n)süreleri ve daha sonra yinelenenleri atın).
Peter Taylor

4

Ruby, 92 karakter

f=->i{r=[i];(x=s=0;(2..i).map{|j|(s+=j;x+=1;i/=j)while i%j<1};r<<i=s*x)until r.uniq!;r.size}

Bu çözüm, higley (1) 'in 1 değil aslında 2 olduğunu varsayar (yukarıdaki balpha'nın yorumuna bakın):

(1..10).map &f
=> [2, 1, 1, 10, 1, 11, 1, 9, 5, 10]

2

Oktav - 109 karakter

l=[input('')];while size_equal(unique(l),l);n=factor(l(1));l=[sum(n)*length(n) l];endwhile;disp(length(l)-1);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.