Kare ağaç halkaları asallardan oluşturulabilir mi?


33

Görünüşe göre evet! Üç kolay adımda.

Aşama 1

Let f ( n (az asal sayı ya da eşittir) birinci sayım fonksiyonu ifade n ).

Tamsayı dizisini s ( n ) aşağıdaki gibi tanımlayın. Her pozitif tamsayı için n ,

  • Initiallize t için n .
  • Sürece t ne de 1 de asal yerine t tarafından f ( t ) ve yineleme.
  • Yineleme sayısı s ( n ) 'dir.

Yinelemeli işlemin sona ermesi garantilidir, çünkü n'nin tümü için f ( n ) < n'dir .

Örneğin n = 25 olarak düşünün . Biz initiallize t Bu asal ne de 1 olmadığı 25. = biz işlem f Bu yeni değeri olur 9'dur (25), t . Bu bir asal ne 1 değil, o yüzden devam ediyoruz: f (9) 4. Tekrar devam ediyoruz: f (4) 2. Bu bir asal olduğundan burada duruyoruz. 3 iterasyon yaptık (25'ten 9'a, sonra 4'ten sonra 2'ye). Böylece s (25) 3'tür.

Dizinin ilk 40 terimi aşağıdaki gibidir. Dizi OEIS'de değil.

0 0 0 1 0 1 0 2 2 2 0 1 0 2 2 2 0 1 0 3 3 3 0 3 3 3 3 3 0 3 0 1 1 1 1 1 0 2 2 2

Adım 2

Tamsayıdır bir tek pozitif verilen N , sonlu dizisi sarılmasıyla NxN dizisi (matris) oluşturmak s (1), s (2), ..., s ( K 2 ) oluşturmak üzere bir kare olarak dışarı doğru spiral . Örneğin, N = 5 verildiğinde spiral

s(21)   s(22)   s(23)   s(24)   s(25)
s(20)   s(7)    s(8)    s(9)    s(10)
s(19)   s(6)    s(1)    s(2)    s(11)
s(18)   s(5)    s(4)    s(3)    s(12)
s(17)   s(16)   s(15)   s(14)   s(13)

veya, değerleri değiştirerek,

 3       3       0       3       3
 3       0       2       2       2
 0       1       0       0       0
 1       0       1       0       1
 0       2       2       2       0

Aşama 3

N × N dizisini gri renk eşlemeli veya zevkinize uygun başka bir renk eşlemeli bir görüntü olarak gösterin. Harita kademeli olmalıdır, böylece sayıların sırası bazı renklerin görsel olarak belirgin sıralarına karşılık gelir. Aşağıdaki test durumları bazı örnek renk haritalarını göstermektedir.

Meydan okuma

Tek bir pozitif tamsayı N verildiğinde , yukarıda açıklanan resmi üretin.

kurallar

  • Spiral dışarı doğru olmalı, fakat saat yönünde veya saat yönünün tersinde olabilir ve sağa (yukarıdaki örnekte olduğu gibi) sola, aşağı veya yukarı hareket etmeye başlayabilir.

  • Yatay ve dikey eksenlerin ölçekleri aynı olmak zorunda değildir. Ayrıca eksen etiketleri, renk çubuğu ve benzeri elemanlar isteğe bağlıdır. Spiral açıkça görülebildiği sürece görüntü geçerlidir.

  • Görüntüler standart yollardan herhangi biriyle çıkarılabilir . Özellikle, görüntü ekranda gösterilebilir veya bir grafik dosyası üretilebilir veya bir RGB değerleri dizisi çıkarılabilir. Bir dosya veya diziyi çıkarıyorsanız, lütfen görüntülendiğinde neye benzediğine dair bir örnek gönderin.

  • Giriş araçları ve format her zamanki gibi esnektir . Bir program veya bir işlev sağlanabilir . Standart boşluklar yasaktır .

  • Bayt cinsinden en kısa kod kazanır.

Test durumları

Aşağıdaki resimler (tam çözünürlük için tıklayınız) N'nin birkaç değerine karşılık gelmektedir . Yukarıdaki örnekte olduğu gibi, saat yönünde, ilk önce bir spiral kullanılır. Görüntüler ayrıca birkaç geçerli renk haritasını da göstermektedir.

  • N = 301: görüntü tanımını buraya girin

  • N = 501: görüntü tanımını buraya girin

  • N = 701: görüntü tanımını buraya girin


Eğer bir değerler dizisi s(n)değiştirilmeden bazı komplolama fonksiyonlarına / paketlerine beslenebilirse ( imshowörneğin matplotlib'de bunun işlenebileceğini düşünüyorum ) bu kabul edilebilir bir çıktı formu mu?
dylnan,

@dylnan Sure, ekranda görüntü çizdiği veya geçerli bir dosya ürettiği sürece. Aslında örnekleri bahsettiğinize benzer bir şeyle hazırladım. Sadece değerlerin ölçeklendirilmesine dikkat edin. Örneğin, 1'in üzerindeki tüm değerlerin Matlab'in (ve muhtemelen Matplotlib'inkiler) imshowyaptığı gibi aynı renkte verilmesi kabul edilemez
Luis Mendo

iyi bir nokta. Bunu yapıp imshowyapmadığından emin değilim .
dylnan,

1
@ kamoroso94 Lütfen buraya
Luis Mendo,

1
Evet çok açık
Christopher

Yanıtlar:


3

Dyalog APL, 94 bayt

'P2'
2⍴n←⎕
9
(⍪0){×≢⍵:(≢⍺)((⍉∘⌽⍺,↑)∇↓)⍵⋄⍺}2↓{⍵⌊1+⍵[+\p]}⍣≡9×~p←1=⊃+/(≠⍨,≠⍨,~⍴⍨(×⍨n)-2×≢)¨,\×⍳n

varsayar ⎕IO=0

n = 701 için çıktı (.pgm'den .png'ye dönüştürülür):

görüntü tanımını buraya girin


10

MATLAB - 197 185 178 175 184 163 162 148 142 140 bayt

Ander ve Andras sayesinde 12 baytı, ikisini bir araya getirdiği için Luis'e çok teşekkürler. Remco sayesinde 16 tıraş, kusur sayesinde 6

function F(n)
p=@primes
s=@isprime
for a=2:n^2
c=0
if~s(a)
b=nnz(p(a))
while~s(b)
b=nnz(p(b))
c=c+1
end
end
d(a)=c
end
imagesc(d(spiral(n)))

N=301( F(301)) İçin sonuç :

görüntü tanımını buraya girin

Açıklama:

function F(n)
p=@primes % Handle
s=@isprime % Handle
for a=2:n^2 % Loop over all numbers
    c=0 % Set initial count
    if~s(a) % If not a prime
        b=nnz(p(a)) % Count primes
        while~s(b) % Stop if b is a prime. Since the code starts at 2, it never reaches 1 anyway
            b=nnz(p(b)) % count again
            c=c+1 % increase count
        end
    end
    d(a)=c % store count
end
imagesc(d(spiral(n))) % plot

8

Wolfram Dili (Mathematica) , 124 bayt

Martin Ender'e 12 byte tasarruf ettiğin için teşekkürler !

Image[#/Max@#]&[Array[(n=0;Max[4#2#2-Max[+##,3#2-#],4#
#-{+##,3#-#2}]+1//.x_?CompositeQ:>PrimePi[++n;x];n)&,{#,#},(1-#)/2]]&

Çevrimiçi deneyin!


Oluşturulan görüntü:

Spiral

Doğrudan bu cevabımdan alınan sarmal değerin kapalı formülü .


5
#/2-.5bir bayt kaydeder.
user202729

8
Haha, bunu kendine mi öneriyorsun?
Luis Mendo,

6
@ user202729 İşe yaramıyor.
user202729

18
İç diyaloğunuzu bölmek istememiştim:
Luis Mendo

pİhtiyacınız olana dek tanımını ertele :...,{y,p=(1-#)/2,-p},{x,p,-p}
Martin Ender

7

MATLAB: 115 114 110 bayt

Bir liner (R2016b + 'da komut dosyasında işlev olarak çalıştırma ) 115 bayt

I=@(N)imagesc(arrayfun(@(x)s(x,0),spiral(N)));function k=s(n,k);if n>1&~isprime(n);k=s(nnz(primes(n)),k+1);end;end

Fonksiyonu, kusur tarafından önerildiği gibi ayrı bir dosyaya koymak ve her ilave dosya kuralı için 1 ilave byte kullanmak

Dosyada s.m, kod + dosya için 64 + 1 bayt

function k=s(n,k);if n>1&~isprime(n);k=s(nnz(primes(n)),k+1);end

Tanımlamak için komut penceresi I, 45 bayt

I=@(N)imagesc(arrayfun(@(x)s(x,0),spiral(N)))

Toplam: 110 bayt


Bu while, diğer MATLAB uygulamalarında olduğu gibi döngü yerine özyineleme kullanır ( gnovice , Adriaan ). Bir komut dosyası olarak çalıştır (R2016b veya daha yeni bir sürümde), bu Igibi çalıştırılabilecek işlevi tanımlar I(n).

Yapılandırılmış versiyonu:

% Anonymous function for use, i.e. I(301)
% Uses arrayfun to avoid for loop, spiral to create spiral!
I=@(N)imagesc(arrayfun(@(x)s(x,0),spiral(N)));

% Function for recursively calculating the s(n) value
function k=s(n,k)
    % Condition for re-iterating. Otherwise return k unchanged
    if n>1 && ~isprime(n)
        % Increment k and re-iterate
        k = s( nnz(primes(n)), k+1 );
    end
end

Örnek:

I(301)

arsa

Notlar:

  • sİşlevi de adsızlaştırmaya çalıştım , elbette sayımı önemli ölçüde azaltacak. Ancak, 2 sorun var:

    1. Sonsuz özyineleme, anonim işlevler kullanırken kaçınmak zordur, çünkü MATLAB bir mola durumu sunacak üçlü bir operatöre sahip değildir. Üçlü bir operatör türüne bürünmek (aşağıya bakınız) ayrıca iki defa ihtiyacımız olduğu için baytlara da mal olur.

    2. Bayt ekleyen özyinelemeli ise ( buraya bakın ) , kendisine anonim bir işlev iletmek zorundasın .

    Buna yaklaştığım en yakın şey şu satırları kullanıyordu, belki de çalışması değişebilir:

    % Condition, since we need to use it twice 
    c=@(n)n>1&&~isprime(n);
    % This uses a bodged ternary operator, multiplying the two possible outputs by
    % c(n) and ~c(n) and adding to return effectively only one of them
    % An attempt was made to use &&'s short-circuiting to avoid infinite recursion
    % but this doesn't seem to work!
    S=@(S,n,k)~c(n)*k+c(n)&&S(S,nnz(primes(n)),k+1);

6

MATLAB - 126 121 * bayt

Adria'lılardan daha vectorized bir yaklaşım denedim ve daha fazla bayt tıraş edebildim. İşte tek satırlı çözüm:

function t(n),M=1:n^2;c=0;i=1;s=@isprime;v=cumsum(s(M));while any(i),i=M>1&~s(M);c=c+i;M(i)=v(M(i));end;imagesc(c(spiral(n)))

Ve işte güzelce biçimlendirilmiş çözüm:

function t(n),
  M = 1:n^2;
  c = 0;
  i = 1;
  s = @isprime;
  v = cumsum(s(M));
  while any(i),         % *See below
    i = M > 1 & ~s(M);
    c = c+i;
    M(i) = v(M(i));
  end;
  imagesc(c(spiral(n)))

* Not: Gereksiz yinelemelerin metrik bir değerine izin vermeye istekliyseniz, satırı while any(i), değiştirebilir for m=v, ve 5 bayttan tasarruf edebilirsiniz.


Güzel! cumsumVektörleştirmek ve kaçınmak için nasıl kullanacağınızı seviyorumnnz(primes(...)
Luis Mendo

1
Doğru anlarsam, gereğinden fazla tekrar etmenin zararı olmaz (hız pahasına). Böylece while any(i)tarafından değiştirebilirsiniz for m=M. Kodun çalışması için saatler sürmesi kimin umrunda :-)
Luis Mendo

2
@LuisMendo: Tabii, neden olmasın? Zaten gerekenden bir kez daha yineleniyor, başka bir şey n^2ya da bu yüzden yineler zarar verecek! ;)
gnovice

1
İşte ruh budur! Ayrıca daha hızlı çalışan bir sürümü de tutabilirsiniz, ancak bayt sayısı daha kısa
Luis Mendo

2

Python 3, 299 265 bayt

Jonathan Frech ve NoOneIsHere'in biçimlendirme önerileri sayesinde 5 bayt kurtarıldı. Yalnızca bir kez çağrılan işlev tanımını kaldırarak ek 34 bayt kaldırıldı.

Bu, diğerlerinden biraz daha uzun, çünkü python, önceliği belirleme komutuna sahip değil veya bir diziyi sarmal. Ancak nispeten hızlı bir şekilde çalışır, ancak bir dakika kadar n = 700.

from pylab import*
def S(n):
 q=arange(n*n+1);t=ones_like(q)
 for i in q[2:]:t[2*i::i]=0
 c=lambda i:0 if t[i]else 1+c(sum(t[2:i]));S=[c(x)for x in q]
 t=r_[[[S[1]]]]
 while any(array(t.shape)<n):m=t.shape;i=multiply(*m)+1;t=vstack([S[i:i+m[0]],rot90(t)])
 return t

Şununla test et

n = 7
x = S(n)
imshow(x, interpolation='none')
colorbar()
show(block=False)

1
Muhtemel 294 bayt (test edilmemiş).
Jonathan Frech,

1
Hızlı bir şey: importve arasındaki boşluğu kaldırabilirsiniz *.
NoOneIsHere

2

J, 121 Bayt

load 'viewmat'
a=:3 :'viewmat{:@((p:inv@{.,>:@{:)^:(-.@((=1:)+.1&p:)@{.)^:_)@(,0:)"0(,1+(i.@#+>./)@{:)@|:@|.^:(+:<:y),.1'

Bir işlevi tanımlar:

a=:3 :'viewmat{:@((p:inv@{.,>:@{:)^:(-.@((=1:)+.1&p:)@{.)^:_)@(,0:)"0(,1+(i.@#+>./)@{:)@|:@|.^:(+:<:y),.1' | Full fuction
                                                                     (,1+(i.@#+>./)@{:)@|:@|.^:(+:<:y),.1  | Creates the number spiral
              {:@((p:inv@{.,>:@{:)^:(-.@((=1:)+.1&p:)@{.)^:_)@(,0:)"0                                      | Applies S(n) to each element
       viewmat                                                                                             | View the array as an image

2

R, 231 bayt

function(n){p=function(n)sum(!n%%2:n)<2;M=matrix(0,n,n);M[n^2%/%2+cumsum(c(1,head(rep(rep(c(1,-n,-1,n),l=2*n-1),rev(n-seq(n*2-1)%/%2)),-1)))]=sapply(1:(n^2),function(x){y=0;while(x>2&!p(x)){x=sum(sapply(2:x,p));y=y+1};y});image(M)}

Biraz daha az golf oynadı:

function(n){
    p=function(n)sum(!n%%2:n)<2 #"is.prime" function
    M=matrix(0,n,n)             #empty matrix
    indices=n^2%/%2+cumsum(c(1,head(rep(rep(c(1,-n,-1,n),l=2*n-1),rev(n-seq(n*2-1)%/%2)),-1)))
    values=sapply(1:(n^2),function(x){
        y=0
        while(x>2&!p(x)){
            x=sum(sapply(2:x,p))
            y=y+1
            }
        y})
    M[indices]=values
    image(M) #Plotting
}

Anonim işlev Bir grafik penceresinde çıktı. Ölçek kırmızı skaladadır ve en koyu gölge 0'a eşittir ve daha net gölgeler artan değerlerdir.

N = 101 için sonuç:

n = 101

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.