Berbagai cara mendefinisikan bilangan prima


32

Salah satu definisi favorit saya tentang bilangan prima adalah sebagai berikut:

  • 2 adalah prime terkecil.

  • Angka yang lebih besar dari 2 adalah bilangan prima jika tidak dapat dibagi dengan bilangan prima yang lebih kecil.

Namun definisi ini tampaknya arbitrer, mengapa 2? Kenapa tidak nomor lain? Baiklah mari kita coba beberapa angka lain yang akan mendefinisikan n-prime sedemikian rupa

  • n adalah n-prime terkecil.

  • Angka yang lebih besar dari n adalah n-prime jika tidak dapat dibagi oleh n-prime yang lebih kecil.

Tugas

Tugas di sini adalah untuk menulis sebuah program yang mengambil dua input, bilangan bulat positif n dan positif bilangan bulat a . Maka akan memutuskan apakah a adalah n -prime. Program Anda harus menampilkan dua nilai berbeda satu untuk "ya, ini n-prime" dan satu untuk "tidak, itu bukan n-prime".

Ini adalah pertanyaan kode-golf sehingga jawaban akan dinilai dalam byte dengan lebih sedikit byte menjadi lebih baik.

Tes

Berikut adalah daftar 31 bilangan prima pertama untuk n = 2 hingga n = 12 (1 adalah satu-satunya bilangan prima)

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=15adalah kasus uji menarik pertama.
Neil

6
Ini adalah tempat pertama di mana non-pola "a adalah n-prime iff n≤a <2n atau (a≥2n dan a adalah prime)" rusak.
Misha Lavrov

2
"Angka yang lebih besar dari 2 adalah bilangan prima jika tidak dapat dibagi oleh bilangan prima yang lebih kecil." - Definisi ini memungkinkan angka apa pun menjadi prima. Mungkin Anda ingin mengatakan iff bukan if ?

5
@ ThePirateBay Saya tidak bermaksud arti matematika yang tepat dari kata jika. Saya akan meninggalkannya.
Wheat Wizard

1
@JeppeStigNielsen Tidak terlalu sulit untuk membuktikan ini. Semua bilangan komposit yang n-prime harus memiliki hanya faktor prima yang lebih kecil dari n. Kita juga tahu bahwa tidak ada himpunan bagian dari faktor-faktor mereka yang dapat memiliki produk lebih besar dari n karena jumlah kita akan dapat dibagi dengan itu. Jadi setiap n-prime adalah 2-prime atau produk dari 2 angka kurang dari n. Hanya ada sejumlah pasangan terbatas dari angka kurang dari n, sehingga hanya ada jumlah terbatas dari bilangan prima n-prime. Semoga itu masuk akal, saya harus menyingkat agar sesuai dalam komentar.
Wheat Wizard

Jawaban:


9

Haskell , 45 byte

n!a=not$any(n!)[x|x<-[n..a-1],mod a x<1]||n>a

Cobalah online!

Saya mendefinisikan fungsi rekursif yang bagus (!):

n!amemeriksa apakah ada faktor a, dalam kisaran [n,a-1], adalah n-prime. Maka itu meniadakan hasilnya. Itu juga memastikan itun>a



@WheatWizard Saya berharap seseorang akan memposting solusi yang lebih pendek :)
H.PWiz


4

Python 3 , 45 byte

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

Cobalah online!

Bagaimana itu bekerja

Ini mengambil dua bilangan bulat sebagai input, i dan k . Pertama memeriksa apakah k ≥ i . Kemudian menghasilkan kisaran [i, k) dan untuk setiap bilangan bulat N dalam rentang ini, memeriksa apakah N adalah coprime ke k . Jika kedua kondisi terpenuhi, maka k adalah i -prime.


Tidak bisakah Anda menggunakan &sebagai ganti anddan >=ibukan >i-1?
Wheat Wizard

@WheatWizard >=i masih 4 byte (karena ruang).
Neil

@ Neil Jika Anda berubah &Anda tidak perlu ruang.
Wheat Wizard


4

R , 44 37 byte

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

Cobalah online!

-7 byte terima kasih kepada Giuseppe

Kembali TRUEjika

  • asama dengan natau ( a==n|)
  • alebih besar dari n dan ( a>n&) untuk setiap angka k dari nhingga a-1, atidak habis dibagi oleh k ( all(a%%n:(a-1)))

Kembali FALSEsebaliknya


Selamat datang di PPCG! Jawaban pertama yang bagus!
FantaC

3

J, 30 byte

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

Cobalah online!

Mengambil nilai awal sebagai argumen kanan dan nilai untuk memeriksa argumen kiri.

Saya awalnya mengacaukan dan tidak memperhitungkan argumen kiri kurang dari perdana. Saya agak tidak senang dengan panjang solusi saya sekarang.

Penjelasan

Membiarkan xmenjadi argumen kiri (nilai untuk memeriksa) dan ymenjadi argumen yang tepat (perdana awal).

>:*(-{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

Catatan

Elemen pada posisi x-yadalah hasil pengujian primality untuk x(karena kami menambahkan yke rentang asli).

Mengalikan dengan x >: ymemastikan bahwa kami mendapatkan nilai falsey ( 0) xkurang dari y.


3

JavaScript (ES6), 33 32 30 byte

Mengambil input dalam sintaks currying (n)(a). Mengembalikan boolean.

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

Demo


3

Haskell , 30 byte

2 byte disimpan berkat ide H.Piz yang dipinjam dari jawaban flawr

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

Cobalah online!

Ok sejak lama, dan satu-satunya jawaban Haskell sejauh ini adalah 45 btyes, saya memutuskan untuk mengirim jawaban saya sendiri.

Penjelasan

Fungsi pemeriksaan ini bahwa satu-satunya angka antara n dan sebuah yang sebuah habis dibagi adalah sebuah sendirinya.

Sekarang definisi hanya menyebutkan n -primes lebih kecil dari a , jadi mengapa kita memeriksa semua angka tambahan ini? Bukankah kita akan memiliki masalah ketika a dapat dibagi oleh beberapa n- komposit lebih besar dari n ?

Kami tidak akan melakukannya karena jika ada n- komposit lebih besar dari n itu harus dibagi oleh n -prime yang lebih kecil menurut definisi. Jadi, jika itu membagi a maka semakin kecil n -prime.

Jika suatu lebih kecil dari n [n..a] akan []demikian tidak bisa menyamai [1]menyebabkan cek gagal.




1

C, 55 byte

f(n,a,i){for(i=a;i-->n;)a%i||f(n,i)&&(i=0);return-1<i;}

Cobalah online!

53 byte jika beberapa nilai pengembalian yang benar diizinkan:

f(n,a,i){for(i=a;i-->n;)a%i||f(n,i)&&(i=0);return~i;}

Cobalah online!


1

dc , 40 34 37 byte

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

Saya akan menyertakan tautan TIO, tetapi TIO tampaknya membawa distribusi yang salah untuk dcmelihat bagaimana ini berfungsi sebagaimana dimaksud pada sistem saya tetapi Qperintahnya berfungsi secara keliru pada TIO. Sebaliknya, ini adalah tautan ke tempat bashpengujian dengan versi berfungsi dengan benar dc:

Demo!


1

APL (Dyalog) , 24 byte

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

Cobalah online!

Bagaimana?

⍳⍵- 1untuka

o←⍺↓- nke a, simpan keo

o|⍨⊂o- Modulo setiap item odengan setiap item dalamo

0=- periksa di mana ia sama 0(membagi)

+/¨ - jumlahkan jumlah divisi

1= - jika kita hanya punya satu maka jumlahnya hanya dibagi dengan sendirinya

o/⍨ - jadi kami menjaga kejadian ini

⍵∊- Apakah adalam array residual itu?



0

JavaScript ES5, 34 Bytes

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

0

Tambahkan ++ , 20 byte

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

Cobalah 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]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.