Fermat Asalları Oluşturma


10

Bir n sayısı verildiğinde, nci asal Fermat numarasını yazdırın , burada Fermat numaraları 2 2 k +1 biçimindedir . O> n 4. sonlandırmak beklenmemektedir rağmen bu kod teorik olarak hiç n için çalışma (yani hardcode yoktur), (O gerektiğine değil 4294967297 asal sayı değildir gibi için 4294967297 n = 5 dönün.)

Tüm Fermat primerlerinin 2 2 n +1 biçimindeyken, 2 2 n +1 biçiminin tüm sayılarının asal olmadığını unutmayın. Bu zorluğun amacı, n .

Test senaryoları

0 -> 3
1 -> 5
2 -> 17
3 -> 257
4 -> 65537

kurallar

  • Standart boşluklara izin verilmez.
  • 0-indeksleme ve 1-indeksleme kabul edilebilir.
  • Bu , en düşük bayt sayısı kazanır.

İlgili: İnşa edilebilir n-gons


1
Cevaplardan bazıları meydan okumayı yanlış mı yorumluyor? Çıktı veren bir program yazmıyor muyuz , girdi 2^(2^n) + 1nerede n? Bu, test durumlarınızla aynı çizgide (bildiğimiz kadarıyla birinci sınıf, bu yüzden kontrol etmeye gerek yok). Ve programın n> 4 olduğu yerde çalışmasını beklemiyorsunuz (ve n = 5 ilk asal olmayan).
jstnthms

Program teorik olarak n> 4 için çalışmalıdır, ancak bu sadece 5 Fermat primerini bildiğimiz için pratikte asla çalışmayacaktır.
poi830

Bilinen sadece 5 terim olduğundan, tüm Fermat primerleri için teorik olarak çalışmanın amacını gerçekten anlamıyorum.
Bay Xcoder

2
@CodyGray Testcasları yanıltıcı, çünkü bu işe yarıyor n=1:4. Tüm fermat primerleri formdadır 2^2^n+1, ancak bu formun tüm sayılarının 2^2^n+1aslında asal olduğu anlamına gelmez . Bu durum söz konusudur n=1:4, n=5örneğin değil .
JAD

3
Sanırım karışıklığın bir kısmı, girdinin nve çıktının formda olması gerektiğini söylüyorsunuz 2^(2^n)+1. Girdi ve üs için farklı değişkenler kullanırsanız, bazı karışıklıklar azalabilir. Ayrıca "n = 5'in makul bir zamanda çıktı alması gerekmediğini, ancak 4294967297 çıktısı almaması gerektiğini" belirtirseniz de yardımcı olabilir
Kamil Drakari

Yanıtlar:



3

Jöle , 13 11 bayt

ÆẸ⁺‘©ÆPµ#ṛ®

1 tabanlı indeksleme kullanır.

Çevrimiçi deneyin!

Nasıl çalışır

ÆẸ⁺‘©ÆPµ#ṛ®  Main link. No argument.

        #    Read an integer n from STDIN and call the chain to the left with
             arguments k = 0, 1, 2, ... until n matches were found.
ÆẸ           Find the integer with prime exponents [k], i.e., 2**k.
  ⁺          Repeat the previous link, yielding 2**2**k.
   ‘         Increment, yielding 2**2**k+1 and...
    ©        copy the result to the register.
     ÆP      Test the result for primality.
          ®  Yield the value from the register, i.e., the n-th Fermar prime.
         ṛ   Yield the result to the right.

Oh, bu yüzden sonucu temizlemek için kullanır ... TIL
Leaky Nun

Oh, yani tek bir tamsayı ÆẸyerine kullanır 2*... TIL
Outgolfer Erik

2

Perl 6 ,  45  42 bayt

{({1+[**] 2,2,$++}...*).grep(*.is-prime)[$_]}

Dene

{({1+2**2**$++}...*).grep(*.is-prime)[$_]}

Dene

Expanded:

{  # bare block lambda with implicit parameter 「$_」

  (  # generate a sequence of the Fermat numbers

    {
      1 +
      2 ** 2 **
        $++            # value which increments each time this block is called
    }
    ...                # keep generating until:
    *                  # never stop

  ).grep(*.is-prime)\  # reject all of the non-primes
  [$_]                 # index into that sequence
}



0

Pyth , 14 bayt

Lh^2^2byfP_yTQ

Çevrimiçi deneyin.

Ana fikir başka bir soruda xnor'un cevabından "ödünç alındı"

Lh^2^2byfP_yTQ

L                    define a function with name y and variable b, which:
 h^2^2b                returns 1+2^2^b
       y             call the recently defined function with argument:
        f    Q         the first number T >= Q (the input) for which:
         P_yT            the same function with argument T returns a prime
                     and implicitly print

0

05AB1E , 8 bayt

Kod:

Sonuçlar 1 endekslidir.

µN<oo>Dp

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

Açıklama:

µ              # Run the following n succesful times..
 N             #   Push Nn
  oo           #   Compute 2 ** (2 ** n)
    >          #   Increment by one
     D         #   Duplicate
      p        #   Check if the number is prime
               # Implicit, output the duplicated number which is on the top of the stack

0

Javascript, 12 46 bayt

k=>eval('for(i=n=2**2**k+1;n%--i;);1==i&&n')

Kodun çoğu buradan gelen ana kontrol tarafından alınır .


Yalnızca n. Fermat numarasını değil , nci asal Fermat numarasını döndürmesi gerektiğini unutmayın .
poi830

@ poi830 şimdi ana kontrol fonksiyonun çoğunu kaplıyor :(
SuperStormer

i == 1 yerine i <2 diyebilirsiniz diyebilirim çünkü sıfır da burada iyi mi? 2 bayt
azalacak

0

Dyalog APL (29 Karakter)

Bunun geliştirilebileceğinden neredeyse eminim.

{2=+/0=(⍳|⊢)a←1+2*2*⍵:a⋄∇⍵+1}

Bu, 1 + 2 ^ 2 ^ ⍵'nin bölen sayısını kontrol eden, burada ⍵ işlevin doğru argümanı olan yinelemeli bir işlevdir. Bölen sayısı 2 ise, sayı asaldır ve döndürür, aksi takdirde işlevi arg + 1 ile tekrar doğru argüman olarak çağırır.

Misal

{2=+/0=(⍳|⊢)a←1+2*2*⍵:a ⋄ ∇ ⍵+1}¨⍳4
      5 17 257 65537

Burada ⍳4'ün her birinde (1-4 sayıları) işlevi çağırırım. Sırayla her sayıya uygular.


0

Haskell , 61 bayt

p n=2^2^n;f=(!!)[p x+1|x<-[0..],all((>)2.gcd(p x+1))[2..p x]]

Çevrimiçi deneyin!

0 tabanlı dizin

açıklama

p n=2^2^n;                                          -- helper function 
                                                    -- that computes what it says
f=                                                  -- main function
  (!!)                                              -- partially evaluate 
                                                    -- index access operator
      [p x+1|                                       -- output x-th fermat number
             x<-[0..],                              -- try all fermat number indices
                      all                 [2..p x]  -- consider all numbers smaller F_x
                                                    -- if for all of them...
                         ((>)2                      -- 2 is larger than...
                              .gcd(p x+1))          -- the gcd of F_x 
                                                    -- and the lambda input 
                                                    -- then it is a Fermat prime!   
                                                  ]
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.