Czy to Pascal Prime?

18

Powszechnie wiadomo, że nieparzyste liczby pierwsze pojawią się w trójkącie Pascala dokładnie dwa razy. Jednak nie wszystkie liczby, które pojawiają się dokładnie dwa razy w trójkącie Pascala, są liczbą pierwszą. Nazwiemy te liczby liczbą pierwszą Pascala.

Liczby pierwsze Pascala to liczby złożone, które pojawiają się dokładnie dwa razy w trójkącie Pascala. Pierwsze kilka liczb pierwszych Pascala to

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

Wyzwanie polega na przyjęciu dodatniej liczby całkowitej n jako wartości wejściowej i wyjściowej true lub false, w zależności od tego, czy n jest liczbą pierwszą Pascala, czy nie. To jest golf golfowy, więc wygrywa najkrótszy program!

Po prostu piękna sztuka
źródło
Odpowiedni OEIS.
Martin Ender
2
Czy możemy wyprowadzić True, jeśli nie jest liczbą pierwszą Pascala, a false, jeśli tak jest?
caird coinheringaahing
Sekwencja ta OEIS sekwencyjnego A002808 „s skrzyżowanie z OEIS sekwencji A137905 .
całkowicieludzki
@cairdcoinheringaahing nie, musi być w podanym wymaganiu.
Po prostu piękna sztuka
Dziwię się, że nikt nie opublikował odpowiedzi w Pascalu. Zrobię to, jeśli będę miał czas (i jeśli uda mi się znaleźć mój stary kompilator Pascal).
manassehkatz-Reinstate Monica

Odpowiedzi:

10

Wolfram Language (Mathematica) , 45 bajtów

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

Wypróbuj online!

Każda liczba złożona n pojawia się dokładnie dwa razy w rzędzie n i nie może pojawić się później. Zatem warunkiem dla liczb pierwszych Pascala jest to, że w ogóle nie pojawiają się one w pierwszych rzędach n-1 .

O ile wiem, jest to krótsze niż sprawdzenie, czy pojawia się dokładnie dwa razy w pierwszych n wierszach i możliwość użycia !PrimeQzamiast tego.

Martin Ender
źródło
4

Python 2 , 93 bajty

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

Wypróbuj online!

Jest to nazwana funkcja f , która wyprowadza kod zakończenia , 0 dla Pascal Primes, 1 w przeciwnym razie.

Jak to działa

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.

To w zasadzie sprawdza, czy n występuje w pierwszych n - 1 rzędach trójkąta Pascala, czy jest liczbą pierwszą, i generuje błąd, jeśli spełniony jest którykolwiek z tych dwóch warunków.

Zaoszczędzono 1 bajt dzięki ovs .

Pan Xcoder
źródło
93 bajty
dniu
@ovs: o To sprytne! Dzięki.
Pan Xcoder
4

Galaretka , 11 10 9 bajtów

Dzięki:

  • Martin Ender za -1 bajt! (inne podejście, użyj (+1) unikaj używania n2(-2), więc -1 ogólnie.
  • Jonathan Allan za naprawę błędu.
  • Dennis dla kolejnego -1 bajtu.
Ḷc€ḶFċ=ÆP

Wypróbuj online!

Alternatywne podejście , Jonathan Allan . (wadliwy)

----------- 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.

Objaśnienie ostatniego wiersza:

  • Jak zauważył Martin Ender, „ npojawia się dwa razy w trójkącie Pascala” jest równoważne z „ nnie pojawia się w pierwszych n-1rzędach”.
  • Chcemy zwrócić, truejeśli liczba nie jest liczbą pierwszą (to znaczy ÆP == 0), a liczba cwynosi zero. Z tego możemy wywnioskować ÆP == c.
    Można udowodnić, że jeśli są równe, to są równe 0, ponieważ:
    • ÆP zwraca wartość logiczną, która może wynosić tylko 0 lub 1.
    • Jeśli zwraca 1, to njest liczbą pierwszą, dlatego nie może pojawić się w pierwszych n-1wierszach (to znaczy, c == 0)
użytkownik202729
źródło
1nie jest liczbą pierwszą Pascala; to mówi, że tak.
Jonathan Allan
Ḷc€ḶFċoÆP¬myślę, że działałoby
Jonathan Allan
ċ=ÆPpowinno działać.
Dennis
Do Twojej wiadomości znalazłem wadę w moim podejściu i usunąłem ją.
Jonathan Allan
BTW też Ḷcþ`Fċ=ÆPpowinno działać.
Pan Xcoder
4

Haskell , 86 84 bajtów

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

Wypróbuj online!

Wyjaśnienie

Funkcja prekurencyjnie definiuje zdegenerowany trójkąt Pascala:

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

Jak widzimy (w tym rozwiązaniu 1jest nieco wyjątkowy) każda liczba npojawia się dokładnie dwa razy w tym n+1rzędzie, a wszystkie elementy kolejnych rzędów tylko się powiększają, dlatego musimy tylko sprawdzić, czy njest gdzieś w górę do ntego rzędu, aby zobaczyć, czy element jest zdyskwalifikowany:

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

Teraz mamy Truedla wszystkich elementów, które pojawiają się ponad dwukrotnie (z wyjątkiem 1), więc wszystko, czego potrzeba, aby mieć uszkodzoną isPrimefunkcję, która powraca Truedo 1:

all((>0).rem n)[2..n-1]
ბიმო
źródło
4

APL (Dyalog) , 44 34 24 19 bajtów

5 bajtów zapisanych dzięki @Cowsquack

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

Wypróbuj online!

W jaki sposób?

Dbamy o to, aby nie

- zasięg 0.. n-1,

⍳∘.! - na dwumian kartezjański z jaźnią

⊢∊- zawierają n,

- ani nie

⊢|⍨- nmodulo każdej pozycji

2↓⍳- zasięg 2..n-1

~0∊- nie zawiera 0(inaczej niepodzielny)

Uriel
źródło
Przekształcenie go w pociąg (∨/1↓1≠⊢∨⍳)∧(~⊢∊⍳∘.!⍳)jest krótsze o dwa bajty
Kritixi Lithos
@ Cowsquack hmm Nie zauważyłem, że zrobiło się tak krótko, że mógł zmieścić się pociąg (rozpoczęty jako 40 bajtów). Dzięki!
Uriel
(0∊⊢|⍨2↓⍳)∧∘~⊢∊⍳∘.!⍳dla dwóch kolejnych zmieniłem algorytm sprawdzania pierwotności
Kritixi Lithos
@Cowsquack oo sprytny. Nigdy wcześniej nie widziałem tej zmienności pierwotności
Uriel
Zmiana układu ~daje (~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳jeden bajt mniej.
Kritixi Lithos
2

JavaScript (Node.js) , 103 101 bajtów

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)

Wypróbuj online!

l4m2
źródło
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%ntrereity działa, ale tak naprawdę dla małego zasięgu
l4m2
2

Ruby , 97 95 bajtów

->n{c=!r=[1,1]
(2...n).map{|i|c|=1>n%i
[n]&r=[0,*r,0].each_cons(2).map{|a,b|a+b}}&[[n]]==[]&&c}

Wypróbuj online!

Zeskrobałem kilka bajtów.

Przywróć Monikę - notmaynard
źródło
2

R , 55 bajtów

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

Wypróbuj online!

sum(!n%%1:n)>2jest testem złożonym i outer(1:n-1,1:n,choose)oblicza wiersze 0do n-1trójkąta Pascala, więc upewniamy nsię, że tam się nie pojawia.

Giuseppe
źródło
2

05AB1E , 10 bajtów

ÝDδcI¢IpÌQ

Wypróbuj online!

Wyjaśnienie

Ý            # 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

Kontrole, które nwystępują dokładnie dwa razy w pierwszych n + 1 rzędach trójkąta paskali i nie są liczbą pierwszą.
Porównanie działa, ponieważ w trójkącie nie ma liczb pierwszych, które mogą wystąpić 3 razy.

Emigna
źródło
1

Haskell , 90 bajtów

f n=2==sum[1|i<-[0..n],j<-[0..i],p[j+1..i]`div`p[1..i-j]==n,mod(p[1..n-1]^2)n<1]
p=product

Wypróbuj online!

całkowicie ludzki
źródło
1

JavaScript (Node.js) , 79 133 130 128 bajtów

f=(n,a=[1])=>n<a.length||[...'0'.repeat(n)].filter((x,i)=>n%i<1).length>1&&a.indexOf(n)<0&&f(n,[...a.map((x,i)=>x+a[i-1]||1),1])

Wypróbuj online!

zła sprawdzanie liczb pierwszych +50 bajtów :(

Shieru Asakoto
źródło
0

Python 2 , 105 104 bajtów

dzięki user202729 za -1 bajt

a=q=[1];n=input();r=n<4;p=1
for i in range(2,n):q=a+map(sum,zip(q[1:],q))+a;r+=n in q;p*=n%i
print p+r<1

Wypróbuj online!

ovs
źródło
Para nawiasów wokół p+rwydaje się zbędna ...
user202729