Các cách khác nhau để xác định số nguyên tố


32

Một trong những định nghĩa yêu thích của tôi về các số nguyên tố như sau:

  • 2 là số nguyên tố nhỏ nhất.

  • Các số lớn hơn 2 là số nguyên tố nếu chúng không chia hết cho một số nguyên tố nhỏ hơn.

Tuy nhiên định nghĩa này có vẻ độc đoán, tại sao 2? Tại sao không phải là một số khác? Vâng, hãy thử một số số khác sẽ xác định n-Prime sao cho

  • n là số nguyên tố n nhỏ nhất.

  • Các số lớn hơn n là số nguyên tố n nếu chúng không chia hết cho số nguyên tố n nhỏ hơn.

Bài tập

Nhiệm vụ ở đây là viết chương trình có hai đầu vào, số nguyên dương n và số nguyên dương a . Sau đó nó sẽ quyết định nếu an -prime. Chương trình của bạn sẽ xuất ra hai giá trị riêng biệt một cho "có, đó là n-Prime" và một cho "không, nó không phải là số nguyên tố".

Đây là một câu hỏi golf-code vì vậy câu trả lời sẽ được ghi bằng byte với ít byte hơn.

Xét nghiệm

Dưới đây là danh sách 31 số nguyên tố đầu tiên cho n = 2 đến n = 12 (1 là số nguyên tố 1 duy nhất)

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=15là trường hợp thử nghiệm thú vị đầu tiên.
Neil

6
Đây là nơi đầu tiên mà mẫu không "a là n-Prime iff n≤a <2n hoặc (a≥2n và a là số nguyên tố)" bị phá vỡ.
Misha Lavrov

2
"Các số lớn hơn 2 là số nguyên tố nếu chúng không chia hết cho số nguyên tố nhỏ hơn." - Định nghĩa này cho phép bất kỳ số nào là số nguyên tố. Có lẽ bạn muốn nói iff thay vì nếu ?

5
@ThePirateBay Tôi không có nghĩa là ý nghĩa toán học chính xác của từ nếu. Tôi sẽ rời khỏi nó.
Thuật sĩ lúa mì

1
@JeppeStigNielsen Không khó để chứng minh điều này. Tất cả các số tổng hợp là n-Prime chỉ có các thừa số nguyên tố nhỏ hơn n. Chúng tôi cũng biết rằng không có tập hợp con nào trong các yếu tố của chúng có thể có sản phẩm lớn hơn n vì số của chúng tôi sẽ chia hết cho số đó. Do đó, mọi số nguyên tố là 2 số nguyên tố hoặc tích của 2 số nhỏ hơn n. Chỉ có một số hữu hạn các cặp số nhỏ hơn n, do đó chỉ có một số hữu hạn các số nguyên tố n tổng hợp. Hy vọng rằng điều đó có ý nghĩa, tôi đã phải viết tắt để phù hợp với nó trong một bình luận.
Thuật sĩ lúa mì

Câu trả lời:




4

Python 3 , 45 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Điều này có hai số nguyên làm đầu vào, ik . Đầu tiên kiểm tra nếu k ≥ i . Sau đó tạo phạm vi [i, k) và với mỗi số nguyên N trong phạm vi này, hãy kiểm tra xem N có trùng với k hay không . Nếu cả hai điều kiện được thỏa mãn, thì k là một i -prime.


Bạn không thể sử dụng &thay vì and>=ithay vì >i-1?
Thuật sĩ lúa mì

@WheatWizard >=i vẫn là 4 byte (vì dung lượng trống).
Neil

@Neil Nếu bạn đổi thành &bạn không cần dung lượng.
Thuật sĩ lúa mì


4

R , 44 37 byte

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

Hãy thử trực tuyến!

-7 byte nhờ Giuseppe

Trả về TRUEnếu

  • abằng nhoặc ( a==n|)
  • alớn hơn n ( a>n&) cho mọi số k từ nđến a-1, akhông chia hết cho k ( all(a%%n:(a-1)))

lợi nhuận FALSEkhác


Chào mừng đến với PPCG! Câu trả lời tuyệt vời đầu tiên!
FantaC

3

J, 30 byte

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

Hãy thử trực tuyến!

Lấy giá trị bắt đầu làm đối số bên phải và giá trị để kiểm tra ở đối số bên trái.

Tôi đã nhầm lẫn ban đầu và không tính đến các đối số bên trái ít hơn số nguyên tố ban đầu. Tôi hơi không hài lòng với độ dài của giải pháp của tôi bây giờ.

Giải trình

Đặt xđối số bên trái (giá trị cần kiểm tra) và ylà đối số bên phải (nguyên tố bắt đầu).

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

Ghi chú

Phần tử tại vị trí x-ylà kết quả của kiểm tra tính nguyên thủy cho x(vì chúng tôi đã thêm vào yphạm vi ban đầu).

Nhân với x >: yđảm bảo rằng chúng tôi nhận được một giá trị falsey ( 0) với giá trị xnhỏ hơn y.


3

JavaScript (ES6), 33 32 30 byte

Đưa đầu vào theo cú pháp currying (n)(a). Trả về một boolean.

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

Bản giới thiệu


3

Haskell , 30 byte

2 byte được lưu nhờ vào ý tưởng của H.PWiz được mượn từ câu trả lời của flawr

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

Hãy thử trực tuyến!

Ok kể từ khi được một lúc, và câu trả lời duy nhất của Haskell là 45 btyes, tôi quyết định đăng câu trả lời của riêng mình.

Giải trình

Hàm này kiểm tra rằng số duy nhất giữa nmột rằng một là chia hết là một chính nó.

Bây giờ định nghĩa chỉ đề cập đến n -primes nhỏ hơn a , vậy tại sao chúng ta kiểm tra tất cả các số phụ này? Chúng ta sẽ không gặp vấn đề khi a chia hết cho một số n- comp cùng lớn hơn n ?

Chúng tôi sẽ không bởi vì nếu có một n- comp cùng lớn hơn n thì nó phải chia hết cho một n -prime nhỏ hơn theo định nghĩa. Vì vậy, nếu nó chia một nên phải nhỏ hơn n -prime.

Nếu a nhỏ hơn n [n..a] thì sẽ []không thể bằng nhau [1]khiến cho việc kiểm tra thất bại.





1

dc , 40 34 37 byte

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

Tôi đã bao gồm một liên kết TIO, nhưng TIO dường như đang mang một bản phân phối bị lỗi dckhi thấy cách thức hoạt động như dự định trên hệ thống của tôi nhưng Qchức năng lệnh bị lỗi trên TIO. Thay vào đó, đây là một liên kết đến một khu vực bashthử nghiệm với phiên bản hoạt động chính xác của dc:

Demo nó!


1

APL (Dyalog) , 24 byte

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

Hãy thử trực tuyến!

Làm sao?

⍳⍵- 1đểa

o←⍺↓- nđể a, lưu vàoo

o|⍨⊂o- modulo mỗi mục trong ovới mỗi mục trongo

0=- kiểm tra xem nó bằng 0(chia)

+/¨ - tổng số lượng các bộ phận

1= - nếu chúng ta chỉ có một thì số đó chỉ được chia cho chính nó

o/⍨ - vì vậy chúng tôi giữ những sự kiện này

⍵∊- là atrong mảng dư?



0

JavaScript ES5, 34 byte

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

0

Thêm ++ , 20 byte

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

Hãy thử trực tuyến!

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]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.