Asalları tanımlamanın farklı yolları


32

Asal sayıların en sevdiğim tanımlarından biri aşağıdaki gibidir:

  • 2 en küçük olanıdır.

  • 2'den büyük sayılar, küçük bir asal tarafından bölünemezlerse asaldır.

Ancak bu tanım keyfi görünüyor, neden 2? Neden başka bir numara değil? Peki diğer bazı numaraları deneyelim n-üssü olarak tanımlayacak şekilde

  • n en küçük n-üssüdür.

  • N'den büyük olan sayılar n-asal sayılar tarafından bölünemezlerse n-asal sayılardır.

Görev

Buradaki görev, iki girdi alan bir program yazmak, pozitif bir tamsayı n ve pozitif bir tamsayı a . Eğer o zaman karar verecek bir olduğunu n -Başbakan. Programınız, "evet, n-asal", diğeri "hayır, n-asal değil" için iki ayrı değer vermelidir.

Bu bir kod-golf sorusudur, bu nedenle cevaplar daha az byte'ın daha iyi olmasıyla byte olarak puanlanacaktır.

Testler

Burada n = 2 - n = 12 için ilk 31 primenin listesi verilmiştir (1 tek 1-asal sayıdır)

n=2: [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=3: [3,4,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=4: [4,5,6,7,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=5: [5,6,7,8,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=6: [6,7,8,9,10,11,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=7: [7,8,9,10,11,12,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=8: [8,9,10,11,12,13,14,15,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=9: [9,10,11,12,13,14,15,16,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=10: [10,11,12,13,14,15,16,17,18,19,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=11: [11,12,13,14,15,16,17,18,19,20,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=12: [12,13,14,15,16,17,18,19,20,21,22,23,25,27,29,31,33,35,37,41,43,47,49,53,55,59,61,67,71,73,77]

4
n=6, a=15ilk ilginç test durumudur.
Neil

6
"A-n'nin asal iff n≤a <2n olduğu veya (a≥2n ve a'nın asal olduğu") olmayan modelin bozulduğu ilk yer.
Misha Lavrov

2
"2'den büyük sayılar, asal küçük harflerle bölünemezlerse asaldır." - Bu tanım, herhangi bir sayının asal olmasına izin verir. Belki eğer yerine iff demek istersin ?

5
@ThePirateBay Ben kelimenin kesin matematiksel anlamda demek istemiyorum. Onu bırakacağım.
Buğday Sihirbazı,

1
@JeppeStigNielsen Bunu kanıtlamak çok zor değil. N-asal olan tüm bileşik sayılar yalnızca n'den küçük asal faktörlere sahip olmalıdır. Ayrıca, faktörlerinin hiçbir alt kümesinin n'den büyük bir ürüne sahip olamayacağını da biliyoruz, çünkü sayımız bu şekilde bölünebilir. Böylece her n-üssü 2-üssü veya n'den küçük 2 sayının çarpımıdır. N'den küçük yalnızca sınırlı sayıda çift çifti vardır, bu nedenle yalnızca sınırlı sayıda bileşik n-asal sayı vardır. Umarım bu mantıklı, bir yorumda sığdırmak için kısaltmak zorunda kaldı.
Buğday Sihirbazı,

Yanıtlar:




4

Python 3 , 45 bayt

lambda i,k:(i>k)<all(k%r for r in range(i,k))

Çevrimiçi deneyin!

Nasıl çalışır

Bu giriş olarak iki tamsayı alır, i ve k . İlk önce k if i olup olmadığını kontrol eder . Daha sonra [i, k) aralığını oluşturur ve bu aralıktaki her bir N tamsayısı için , N'nin k'ye kopya olup olmadığını kontrol eder . Her iki koşul da yerine getirilirse, k bir i- prime olur.


Eğer kullanılamaz &yerine andve >=iyerine >i-1?
Buğday Sihirbazı

@WheatWizard >=i hala 4 bayttır (boşluk nedeniyle).
Neil

@Neil Değişirseniz &, boşluğa ihtiyacınız yoktur.
Buğday Sihirbazı


4

R , 44 37 bayt

function(a,n)a==n|a>n&all(a%%n:(a-1))

Çevrimiçi deneyin!

Giuseppe sayesinde -7 bayt

TRUEEğer döndürür

  • aeşittir nveya ( a==n|)
  • adaha büyüktür n ve ( a>n&her numara için) k gelen niçin a-1, abölünebilir değildir k ( all(a%%n:(a-1)))

İade FALSEaksi


PPCG'ye Hoşgeldiniz! Harika ilk cevap!
FantaC

3

J, 30 bayt

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:

Çevrimiçi deneyin!

Başlangıç ​​değerini doğru argüman ve sol argümanda kontrol edilecek değeri alır.

Başlangıçta berbat ettim ve başlangıçtan daha az sol argümanları hesaba katmadım. Şimdi çözümümün uzunluğundan biraz mutsuzum.

açıklama

Izin xsol argüman (check değer) olmalı ve ysağ argüman (başlangıç asal) olmak.

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:
                          ^:>:  Execute left argument if x >= y
                     i.@[         Create range [0..x]
                   ]+             Add y to it (range now: [y..x+y])
                |/~               Form table of residues
            0=                    Equate each element to 0
          +/                      Sum columns
      1=                          Equate to 1
    -{                            Take the element at position x-y
>:*                             Multiply by result of x >= y

notlar

x-yKonumdaki öğe, x( yilk aralığa eklediğimizden beri) için birincillik testinin sonucudur .

Çarparak x >: y falsey değerinin ( 0) xaltında bir değer almamızı sağlar y.


3

JavaScript (ES6), 33 32 30 bayt

Körleme sözdiziminde girdi alır (n)(a) . Bir boole döndürür.

n=>p=(a,k=a)=>k%--a?p(a,k):a<n

gösteri


3

Haskell , 30 bayt

2 byte ödünç oldu H.PWiz fikri sayesinde kaydedilen flawr cevabı

n!a=[1]==[1|0<-mod a<$>[n..a]]

Çevrimiçi deneyin!

Tamam, bir süredir ve şu ana kadarki tek Haskell cevabı 45 bit, ben de kendi cevabımı göndermeye karar verdim.

açıklama

Bu fonksiyon kontrol arasındaki tek sayı olduğu , n ve bir bu , bir bölünemeyen olan bir kendini.

Şimdi tanım sadece bahseder n daha -primes küçük bir öyleyse neden hepimiz bu ekstra sayılar kontrol ediyoruz? Biz sorun olmaz bir bazı bölünemeyen n -Kompozit daha büyük n ?

Yapamazlar çünkü varsa n daha büyük -Kompozit n daha küçük bölünebilir olmalıdır n tanım gereği -Başbakan. O böler Böylece eğer bir böylece daha küçük olmalıdır n -Başbakan.

Eğer bir daha küçük olan , n [n..a] olacak [], böylece eşit değildir [1]kontrol başarısız olmasına neden olur.





1

dc , 40 34 37 bayt

[0p3Q]sf?se[dler%0=f1+dle>u]sudle>u1p

Bir TIO bağlantısı eklerdim, ancak TIO, bunun dcsistemimde amaçlandığı şekilde çalıştığını, ancak Qkomutun TIO'da hatalı çalıştığını görme konusunda hatalı bir dağılım gösteriyor gibi görünüyor . Bunun yerine, burada bashdoğru çalışan versiyonu olan bir test alanına bağlantıdc :

Demo!


1

APL (Dyalog) , 24 bayt

{⍵∊o/⍨1=+/¨0=o|⍨⊂o←⍺↓⍳⍵}

Çevrimiçi deneyin!

Nasıl?

⍳⍵- 1içina

o←⍺↓- niçin a, kaydeto

o|⍨⊂o- her bir öğenin içinde obulunduğu her öğeyi moduloo

0=- Nereye eşit olduğunu kontrol edin 0(bölünür)

+/¨ - bölüm sayısını toplamı

1= - eğer sadece bir tane varsa, sayı sadece kendi başına bölünür

o/⍨ - öyleyse bu olayları koruyoruz

⍵∊- ao artık dizide mi?



0

JavaScript ES5, 34 Bayt

for(a=i=(p=prompt)();a%--i;);i<p()

0

Add++, 20 bytes

L,2Dx@rBcB%B]b*!!A>*

Try it online!

L,   - Create a lambda function
     - Example arguments:  [5 9]
  2D - Copy below; STACK = [5 9 5]
  x  - Repeat;     STACK = [5 9 [9 9 9 9 9]]
  @  - Reverse;    STACK = [[9 9 9 9 9] 5 19] 
  r  - Range;      STACK = [[9 9 9 9 9] [5 6 7 8 9]]
  Bc - Zip;        STACK = [[9 5] [9 6] [9 7] [9 8] [9 9]]
  B% - Modulo;     STACK = [4 3 2 1]
  B] - Wrap;       STACK = [[4 3 2 1]]
  b* - Product;    STACK = [24]
  !! - Boolean;    STACK = [1]
  A  - Arguments;  STACK = [1 5 9]
  >  - Greater;    STACK = [1 1]
  *  - Product;    STACK = [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.