Gilbreath Konjonktürü


18

Farz edelim ki asal sayıların sonsuz listesiyle başlıyoruz:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, ...

Ardından, her bir sayı çifti arasındaki mutlak farklılıkları tekrar tekrar alıyoruz:

[1, 2, 2, 4, 2, 4, 2, 4, 6, 2, 6, 4, 2, 4, 6, 6, 2, 6, 4, ...
[1, 0, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 2, 0, 4, 4, 2, ...
[1, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 4, 0, 2, ...
[1, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 4, 2, ...

Baştaki sayının her seferinde 1 olduğuna dikkat edin. Gilbreath'in Konjeksiyonu , bunun sonsuza dek sürmeye devam edeceği öngörüsüdür.

Baştaki sayının 1 olmayı bırakmasının tek yolu, sonraki sayı 0 veya 2 değilse, ikinci sayının 0 veya 2 olmaması, sonraki sayı da 0 veya 2.

Ne 0 ne de 2 olan ilk 1'den başka en eski sayının dizini, ardışık bir dizi çift arasında asla 1'den fazla aşağı inemez. Bu gerçek, eğer bir dizi ilk eleman olarak 1 bulunmadığında çok güçlü bir alt sınır koymak için kullanılmıştır.

Bu meydan okumada, bir dizinin dizini verilecektir ve bu dizideki baştaki 1 olmayan ve 0 veya 2 olmayan ilk sayının dizinini çıkarmalısınız.

Örneğin, yukarıdaki 4. mutlak fark dizisinde:

[1, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 4, 2, ...

İlk giriş dışında sıfır veya ikisi olmayan ilk giriş, 15 sıfırlama, 14 sıfırlama dizinidir. Giriş 4 olsaydı, 14 çıktı alırsınız.

1 ila 30 arasındaki girişler için çıkışlar:

[3, 8, 14, 14, 25, 24, 23, 22, 25, 59, 98, 97, 98, 97, 174, 176, 176, 176, 176, 291, 290, 289, 740, 874, 873, 872, 873, 872, 871, 870]

Bu OEIS A000232 .

Bu, 1 dizinlenmiş giriş ve 0 dizinlenmiş çıkışınız olduğunu varsayar. Tüm sekanslara karşılık gelen giriş aralığını kabul edebildiğiniz sürece, herhangi bir sabit tamsayıdan başlayarak girişlerinizi ve çıkışlarınızı endeksleyebilirsiniz.

Gereksinimler: Çözümünüz en fazla 30 dakika içinde en fazla 1 dakika içinde çalışmalıdır. Bilgisayar özelliklerine bağlı olacak kadar yakınsa, buna izin verilir.

En kısa kod kazanır.


Girişimi 2-endeksleyebilir miyim?
Sızdıran Rahibe

@LeakyNun Tabii.
isaacg

Çıktı girdi tabanlı indekslemeyi kullanabilir mi?
Luis Mendo

@LuisMendo Doğru, sabit. Hayır, indeksleme sabit olmalıdır.
isaacg

Yanıtlar:



4

Mathematica, 66 bayt

(For[z=1,Last@Nest[Abs@*Differences,Array[Prime,z+#],#]<3,z++];z)&

Argüman olarak pozitif bir tamsayı alan ve 1 indeksli bir tamsayı döndüren saf işlev. ilk asal sayılar listesinin yinelenen mutlak fark listesini Nest[Abs@*Differences,Array[Prime,z+#],#]hesaplar . sonuçta elde edilen listenin son öğesi en az oluncaya kadar bu hesaplamayı döngüye alır ve sonra çıktı alınır. (Algoritmanın doğruluğunun Gilbreath'ün varsayımını varsaydığını unutmayın!)#z+#For[z=1,Last@...<3,z++]3z



2

MATL , 18 bayt

`@:YqG:"d|]3<A}@G-

Giriş ve çıkış 1 tabanlıdır. Her test vakası için TIO'da 40 saniyeden az sürer.

Çevrimiçi deneyin!

açıklama

Bu, yinelenen mutlak ardışık farklılıklar en az bir değer aşana kadar ilk prim dizilerini denemeye devam eder 2.

`        % Do... while loop
  @:Yq   %   Array of first k primes, where k is iteration index
  G:"    %   Do this as many times as the input
    d|   %     Absolute value of consecutive differences
  ]      %   End
  3<A    %   Are they all less than 3? This is the loop condition
}        % Finally (execute before exiting loop)
  @G-    %   Push last iteration index minus input. This is the output
         % End (implicit). Continue with next iteration if top of stack is true
         % Display (implicit)

1

Perl 6 , 136120 bayt

{->\i,\n{i??&?BLOCK(i-1,lazy
n.rotor(2=>-1).map: {abs .[1]-.[0]})!!1+n.skip.first:
:k,none 0,2}($_,grep &is-prime,2..*)}

Ungolfed:

{   # Anonymous function with argument in $_
    sub f(\i, \n) {  # Recursive helper function
        if i != 0 {  # If we're not done,
            # Recurse on the absolute differences between adjacent entries:
            f(i - 1, lazy n.rotor(2 => -1).map: { abs .[1] - .[0] });
        } else {
            # Otherwise, return the first index after 0
            # where the value is neither 0 nor 2.
            1 + n.skip.first: :k, none 0, 2;
        }
    }
    # Call the helper function with the argument passed to the top-level
    # anonymous function (the recursion depth), and with the prime numbers
    # as the initial (infinite, lazy) list:
    f($_, grep &is-prime, 2 .. *);
}

30 giriş ile, fonksiyon mütevazı dizüstü bilgisayarımda yaklaşık dört saniye içinde çalışır.

... yedi aylık Perl 6 kurulumumu yükselttikten sonra 1,4 saniye oluyor (bu da bana skipilk çözümümden birkaç bayt tıraş etmeme izin veren bir yöntem sunuyor). 1 ila 30 arasındaki tüm test vakaları yaklaşık on saniye sürer.


1

Haskell , 94 bayt

f(a:b:r)=abs(a-b):f(b:r)
length.fst.span(<3).(iterate f[n|n<-[2..],all((>0).mod n)[2..n-1]]!!)

Çevrimiçi deneyin! Son satır anonim bir fonksiyondur. Bağlama örneğin etmek gve çağrı gibig 4 . Tüm test vakaları TIO'da 2 saniyeden az sürer.

Nasıl çalışır

[n|n<-[2..],all((>0).mod n)[2..n-1]]sonsuz sayıda asal listesi oluşturur.
f(a:b:r)=abs(a-b):f(b:r)sonsuz listenin elemanlarının mutlak farklılıklarını veren bir fonksiyondur. Bir sayı göz önüne alındığında n, (iterate f[n|n<-[2..],all((>0).mod n)[2..n-1]]!!)geçerli f nasal listesine kez. length.fst.span(<3)elemanların daha küçük olduğu sonuç listesinin önekinin uzunluğunu hesaplar 3.


0

Aksiyom, 289 bayt

g(n:PI):PI==(k:=n*10;c:List NNI:=[i for i in 1..(k quo 2)|prime?(i)];repeat(a:=concat(c,[i for i in (k quo 2+1)..k|prime?(i)]);j:=0;c:=a;repeat(j=n=>break;j:=j+1;b:=a;a:=[abs(b.(i+1)-b.i)for i in 1..(#b-1)]);j:=2;repeat(j>#a=>break;a.j~=2 and a.j~=1 and a.j~=0=>return j-1;j:=j+1);k:=k*2))

ungolf ve test

f(n:PI):PI==
  k:=n*10
  c:List NNI:=[i for i in 1..(k quo 2)|prime?(i)]
  repeat
    a:=concat(c,[i for i in (k quo 2+1)..k|prime?(i)])
    j:=0;c:=a
    repeat
       j=n=>break
       j:=j+1
       b:=a
       a:=[abs(b.(i+1)-b.i)  for i in 1..(#b-1)]
    j:=2
    repeat
       j>#a=>break
       a.j~=2 and a.j~=1 and a.j~=0 => return j-1
       j:=j+1
    k:=k*2

(4) -> [g(i)  for i in 1..30]
   (4)
   [3, 8, 14, 14, 25, 24, 23, 22, 25, 59, 98, 97, 98, 97, 174, 176, 176, 176,
    176, 291, 290, 289, 740, 874, 873, 872, 873, 872, 871, 870]

çözüm bulamazsa, bir döngüde 2 * x ana listesini genişletin ve kalan tüm listeleri yeniden hesaplayın. Bulmak için 3 saniye g (30)

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.