Nó có phải là một Pascal Prime không?


18

Người ta biết rằng các số nguyên tố lẻ sẽ xuất hiện trong tam giác của Pascal chính xác hai lần. Tuy nhiên, không phải tất cả các số xuất hiện chính xác hai lần trong tam giác của Pascal đều là số nguyên tố. Chúng ta sẽ gọi những số này là số nguyên tố Pascal.

Các số nguyên tố Pascal là các số tổng hợp xuất hiện chính xác hai lần trong tam giác của Pascal. Một số nguyên tố Pascal đầu tiên là

4, 8, 9, 12, 14, 16, 18, ...

Thử thách của bạn là lấy số nguyên dương n làm đầu vào và đầu ra đúng hay sai, tùy thuộc vào việc n có phải là số nguyên tố Pascal hay không. Đây là môn đánh gôn, vì vậy chương trình ngắn nhất sẽ thắng!



2
Chúng ta có thể xuất True nếu nó không phải là số nguyên tố Pascal và false nếu có?
caird coinheringaahing

Trình tự này là trình tự OEIS Giao điểm của A002808 với trình tự OEIS A137905 .
hoàn toàn là

@cairdcoinheringaahing không, nó phải nằm trong yêu cầu nhất định.
Nghệ thuật đơn giản đẹp

Tôi ngạc nhiên không ai đã đăng một câu trả lời trong Pascal. Tôi sẽ nếu tôi có thời gian (và nếu tôi có thể tìm thấy trình biên dịch Pascal cũ của mình).
manassehkatz-Phục hồi Monica

Câu trả lời:


10

Ngôn ngữ Wolfram (Mathicala) , 45 byte

CompositeQ@#&&Binomial~Array~{#-1,#}~FreeQ~#&

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

Mỗi số hỗn hợp n xuất hiện chính xác hai lần trên hàng n và không thể xuất hiện sau đó. Vì vậy, điều kiện cho các số nguyên tố Pascal là chúng hoàn toàn không xuất hiện trong các hàng n-1 đầu tiên .

Theo như tôi có thể nói, điều này ngắn hơn việc kiểm tra xem nó xuất hiện chính xác hai lần trong n hàng đầu tiên và có thể sử dụng !PrimeQthay thế.


4

Python 2 , 93 byte

def f(n):l=[1];exec"(n in l)>=any(n%k<1for k in range(2,n))>q;l=map(sum,zip([0]+l,l+[0]));"*n

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

Đây là hàm f được đặt tên , xuất ra thông qua mã thoát , 0 cho các số nguyên tố Pascal, 1 nếu không.

Làm thế nào điều này hoạt động?

def f(n):l=[1];                       # Define a function f (arg. n) and a list l = [1].
exec"..."*n                           # Execute n times.
(n in l)                              # Boolean: "n is in l?" is greater than...
   >=any(n%k<1for k in range(2,n))    # the boolean: "Is n composite?"?
            >q;                       # If the boolean comparison returns a falsy
                                      # result, then continue on without any difference.
                                      # Otherwise, evaluate the other part of the
                                      # inequality, thus performing "is greater than q".
                                      # Since we have no variable "q", this terminates
                                      # with exit code 1, throwing a "NameError".
l=map(sum,zip([0]+l,l+[0]));          # Generate the next row in Pascal's triangle,
                                      # By zipping l prepended with a 0 with l appended
                                      # with a 0 and mapping sum over the result.

Về cơ bản, điều này kiểm tra xem n xảy ra trong n - 1 hàng đầu tiên của tam giác Pascal hay nếu nó là số nguyên tố và đưa ra lỗi nếu bất kỳ điều kiện nào trong hai điều kiện này được đáp ứng.

Lưu được 1 byte nhờ vào ovs .



@ovs: o Thật thông minh! Cảm ơn.
Ông Xcoder

4

Thạch , 11 10 9 byte

Nhờ vào:

  • Martin Ender cho -1 byte! (cách tiếp cận khác, sử dụng (+1) tránh sử dụng n2(-2), do đó -1 tổng thể.
  • Jonathan Allan để sửa lỗi.
  • Dennis cho -1 byte khác.
Ḷc€ḶFċ=ÆP

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

Cách tiếp cận khác , bởi Jonathan Allan . (thiếu sót)

----------- Explanation -----------
Ḷ            Lowered range. [0, 1, ..., n-1]
 c€Ḷ           `c`ombination `€`ach with `Ḷ`owered range [0...n-1]
    F        Flatten.
     ċ       Count the number of occurences of (n) in the list.
       ÆP    Returns 1 if (n) is a prime, 0 otherwise.
      =      Check equality.

Giải thích cho dòng cuối cùng:

  • Như Martin Ender đã chỉ ra, " nxuất hiện hai lần trong tam giác Pascal" tương đương với " nkhông xuất hiện ở các n-1hàng đầu tiên ".
  • Chúng tôi muốn trả về truenếu số không phải là số nguyên tố (nghĩa là ÆP == 0) và số đếm cbằng không. Từ đó chúng ta có thể suy ra điều đó ÆP == c.
    Có thể chứng minh rằng nếu chúng bằng nhau, thì chúng bằng 0, bởi vì:
    • ÆP trả về giá trị boolean, chỉ có thể là 0 hoặc 1.
    • Nếu nó trả về 1, thì đó nlà một số nguyên tố, do đó nó không thể xuất hiện trong các n-1dòng đầu tiên (nghĩa là, c == 0)

1không phải là số nguyên tố Pascal; Điều này nói rằng nó là.
Jonathan Allan

Ḷc€ḶFċoÆP¬tôi nghĩ sẽ làm việc
Jonathan Allan

ċ=ÆPnên làm việc.
Dennis

FYI Tôi tìm thấy một lỗ hổng trong cách tiếp cận của tôi và đã xóa nó.
Jonathan Allan

BTW Ḷcþ`Fċ=ÆPcũng nên làm việc.
Ông Xcoder

4

Haskell , 86 84 byte

p=[]:[zipWith(+)(1:x)x++[1]|x<-p]
f n=all((>0).rem n)[2..n-1]==any(elem n)(take n p)

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

Giải trình

Hàm pđịnh nghĩa đệ quy một tam giác Pascal suy biến:

[]
[1]
[2,1]
[3,3,1]
[4,6,4,1]
[5,10,10,5,1]

Như chúng ta có thể thấy (trong giải pháp 1này có phần đặc biệt), mọi số nxuất hiện chính xác hai lần trong n+1hàng thứ và tất cả các phần tử của các hàng tiếp theo chỉ lớn hơn, do đó chúng ta chỉ cần kiểm tra xem ncó ở đâu đó lên nhàng thứ không để xem có yếu tố bị loại:

any(elem n)(take(n-1)p)

Bây giờ chúng ta phải Truecho tất cả các yếu tố đó xuất hiện nhiều hơn hai lần (trừ 1), vì vậy tất cả chúng ta cần là phải có một lỗi isPrimehàm trả về Truecho 1:

all((>0).rem n)[2..n-1]

4

APL (Dyalog) , 44 34 24 19 byte

5 byte được lưu nhờ @Cowsquack

(~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳

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

Làm sao?

Chúng tôi đảm bảo rằng không

- phạm vi 0.. n-1,

⍳∘.! - khi nhị thức cartesian với chính mình

⊢∊- chứa n,

- cũng không

⊢|⍨- nmodulo từng mục của

2↓⍳- phạm vi 2..n-1

~0∊- không chứa 0(còn gọi là không chia)


Chuyển đổi nó thành một chuyến tàu (∨/1↓1≠⊢∨⍳)∧(~⊢∊⍳∘.!⍳)ngắn hơn hai byte
Kritixi Lithos

@Cowsquack hmm Tôi không nhận thấy nó ngắn đến mức một đoàn tàu có thể vừa (bắt đầu là 40 byter). Cảm ơn!
Uriel

(0∊⊢|⍨2↓⍳)∧∘~⊢∊⍳∘.!⍳Đối với hai người khác, tôi đã thay đổi thuật toán kiểm tra tính nguyên thủy
Kritixi Lithos

@Cowsquack oo thông minh. Tôi chưa bao giờ thấy sự thay đổi nguyên thủy trước đây
Uriel

Sắp xếp lại các ~cung cấp (~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳cho một byte ít hơn.
Kritixi Lithos

2

JavaScript (Node.js) , 103 101 byte

n=>(r=x=>[...Array(n).keys(F=n=>n>0?n*F(n-1):1)].every(x))(i=>r(j=>F(i)/F(j)/F(i-j)-n))>r(i=>i<2|n%i)

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


n=>(r=x=>[...Array(n).keys(F=n=>n>0?n*F(n-1):1)].every(x))(i=>r(j=>F(i)/F(j)/F(i-j)-n))>F(n-1)**2%nthreority hoạt động nhưng trên thực tế cho phạm vi nhỏ
l4m2


2

R , 55 byte

function(n)sum(!n%%1:n)>2&!n%in%outer(1:n-1,1:n,choose)

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

sum(!n%%1:n)>2là phép thử tổng hợp và outer(1:n-1,1:n,choose)tính toán các hàng 0theo n-1tam giác của Pascal, vì vậy chúng tôi đảm bảo nkhông xuất hiện ở đó.


2

05AB1E , 10 byte

ÝDδcI¢IpÌQ

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

Giải trình

Ý            # push range [0 ... input]
 D           # duplicate
  δc         # double vectorized command binomial
    I¢       # count occurrences of input
      Ip     # check input for primality
        Ì    # add 2
         Q   # compare for equality

Kiểm tra nxảy ra chính xác hai lần trong n + 1 hàng tam giác pascals đầu tiên và không phải là số nguyên tố.
Việc so sánh hoạt động vì không có số nguyên tố nào có thể xảy ra 3 lần trong tam giác.





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.