Ist es ein Pascal Prime?

18

Es ist bekannt, dass ungerade Primzahlen im Pascalschen Dreieck genau zweimal vorkommen. Es sind jedoch nicht alle Zahlen, die genau zweimal im Pascalschen Dreieck vorkommen, Primzahlen. Wir werden diese Zahlen Pascal-Primzahlen nennen.

Pascal-Primzahlen sind zusammengesetzte Zahlen, die im Pascal-Dreieck genau zweimal vorkommen. Die ersten paar Pascal-Primzahlen sind

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

Ihre Herausforderung besteht darin, eine positive ganze Zahl n als Eingabe und Ausgabe wahr oder falsch zu nehmen, je nachdem, ob n eine Pascal-Primzahl ist oder nicht. Das ist Code-Golf, also gewinnt das kürzeste Programm!

Einfach schöne Kunst
quelle
Relevantes OEIS.
Martin Ender
2
Können wir True ausgeben, wenn es keine Pascal-Primzahl ist, und False, wenn es eine ist?
Caird Coinheringaahing
Diese Sequenz ist OEIS Sequenz A002808 ‚s Kreuzung mit OEIS Sequenz A137905 .
Totalhuman
@cairdcoinheringaahing nein, es muss in der gegebenen Anforderung sein.
Einfach schöne Kunst
Ich bin überrascht, dass niemand eine Antwort in Pascal gepostet hat. Ich werde, wenn ich die Zeit dazu habe (und wenn ich meinen alten Pascal-Compiler finde).
Manassehkatz-Reinstate Monica

Antworten:

10

Wolfram-Sprache (Mathematica) , 45 Bytes

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

Probieren Sie es online!

Jede zusammengesetzte Zahl n erscheint genau zweimal in Zeile n und kann danach nicht mehr angezeigt werden. Die Bedingung für Pascal-Primzahlen ist also, dass sie in der ersten n-1 überhaupt nicht vorkommen Zeilen überhaupt nicht vorkommen.

Soweit ich das beurteilen kann, ist dies kürzer, als zu überprüfen, ob es in den ersten n Zeilen genau zweimal vorkommt und !PrimeQstattdessen verwendet werden kann.

Martin Ender
quelle
4

Python 2 , 93 Bytes

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

Probieren Sie es online!

Dies ist eine benannte Funktion f , die über einen Exit-Code ausgegeben wird , 0 für Pascal Primes, 1 sonst.

Wie das geht

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.

Dies prüft grundsätzlich, ob n in der ersten n - 1 vorkommt Zeilen des Pascalschen Dreiecks vorkommt oder ob es eine Primzahl ist, und löst einen Fehler aus, wenn eine dieser beiden Bedingungen erfüllt ist.

1 Byte dank ovs gespeichert .

Mr. Xcoder
quelle
93 Bytes
Ovs
@ovs: o Das ist schlau! Vielen Dank.
Mr. Xcoder
4

Jelly , 11 10 9 Bytes

Dank an:

  • Martin Ender für -1 Byte! (Ein anderer Ansatz, verwenden Sie (+1), vermeiden Sie die Verwendung von n2(-2), also insgesamt -1.
  • Jonathan Allan für die Fehlerbehebung.
  • Dennis für ein weiteres -1 Byte.
Ḷc€ḶFċ=ÆP

Probieren Sie es online!

Alternativer Ansatz von Jonathan Allan . (fehlerhaft)

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

Erklärung für die letzte Zeile:

  • Martin Ender wies darauf hin, dass " nzweimal im Pascal-Dreieck auftaucht" gleichbedeutend ist mit " nnicht in den ersten n-1Zeilen auftaucht ".
  • Wir möchten zurückgeben, truewenn die Zahl keine Primzahl ist (dh ÆP == 0) und der Zähler cNull ist. Daraus können wir schließen ÆP == c.
    Es kann bewiesen werden, dass wenn sie gleich sind, sie gleich 0 sind, weil:
    • ÆP Rückgabe eines Booleschen Werts, der nur 0 oder 1 sein kann.
    • Wenn es 1 zurückgibt, nist es eine Primzahl, daher kann es nicht in den ersten n-1Zeilen erscheinen (d. H. c == 0)
user202729
quelle
1ist keine Pascal-Primzahl; das sagt es ist.
Jonathan Allan
Ḷc€ḶFċoÆP¬würde funktionieren, denke ich.
Jonathan Allan
ċ=ÆPsollte arbeiten.
Dennis
Zu Ihrer Information Ich habe einen Fehler in meinem Ansatz gefunden und ihn gelöscht.
Jonathan Allan
BTW Ḷcþ`Fċ=ÆPsollte auch funktionieren.
Mr. Xcoder
4

Haskell , 86 84 Bytes

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

Probieren Sie es online!

Erläuterung

Die Funktion pdefiniert rekursiv ein entartetes Pascal-Dreieck:

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

Wie wir sehen können (in dieser Lösung 1ist es etwas Besonderes), nerscheint jede Zahl genau zweimal in der n+1vierten Zeile und alle Elemente der nachfolgenden Zeilen werden nur größer. Daher müssen wir nur überprüfen, ob nsich irgendwo bis zur nvierten Zeile eine befindet Element ist disqualifiziert:

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

Jetzt haben wir Truefür alle Elemente, die mehr als zweimal vorkommen (außer 1), nur eine fehlerhafte isPrimeFunktion, die zurückgibt Truefür 1:

all((>0).rem n)[2..n-1]
ბიმო
quelle
4

APL (Dyalog) , 44 34 24 19 Bytes

5 Bytes gespart dank @Cowsquack

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

Probieren Sie es online!

Wie?

Wir stellen sicher, dass dies auch nicht der Fall ist

- Reichweite 0.. n-1,

⍳∘.! - Nach kartesischem Binomial mit Selbst

⊢∊- enthalten n,

- noch nicht

⊢|⍨- nModulo jedes Element von

2↓⍳- Reichweite 2..n-1

~0∊- nicht enthalten 0(auch bekannt als nicht teilbar)

Uriel
quelle
Die Umwandlung in einen Zug (∨/1↓1≠⊢∨⍳)∧(~⊢∊⍳∘.!⍳)ist um zwei Bytes kürzer
Kritixi Lithos
@Cowsquack hmm Ich habe nicht bemerkt, dass es so kurz wurde, dass ein Zug passen könnte (angefangen als 40 Byter). Vielen Dank!
Uriel
(0∊⊢|⍨2↓⍳)∧∘~⊢∊⍳∘.!⍳Für zwei weitere habe ich den Algorithmus für die Primalitätsprüfung geändert
Kritixi Lithos
@Cowsquack oo schlau. Ich habe diese Variation der Ursprünglichkeit noch nie gesehen
Uriel
Neuordnung der ~gibt (~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳für ein Byte weniger.
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)

Probieren Sie es online!

l4m2
quelle
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 funktioniert, aber in der Tat für kleine Reichweite
l4m2
2

Ruby , 97 bis 95 Bytes

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

Probieren Sie es online!

Ein paar Bytes abgeschabt.

Setzen Sie Monica wieder ein - notmaynard
quelle
2

R , 55 Bytes

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

Probieren Sie es online!

sum(!n%%1:n)>2ist der zusammengesetzte Test und outer(1:n-1,1:n,choose)berechnet Zeilen 0zu n-1Pascals Dreieck, also stellen wir sicher, dass nsie dort nicht erscheinen.

Giuseppe
quelle
2

05AB1E , 10 Bytes

ÝDδcI¢IpÌQ

Probieren Sie es online!

Erläuterung

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

Überprüft, ob nes in den ersten n + 1 Reihen des Pascal-Dreiecks genau zweimal vorkommt und keine Primzahl ist.
Der Vergleich funktioniert, da es keine Primzahlen gibt, die dreimal im Dreieck vorkommen können.

Emigna
quelle
1

Haskell , 90 Bytes

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

Probieren Sie es online!

total menschlich
quelle
1

JavaScript (Node.js) , 79 133 130 128 Byte

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])

Probieren Sie es online!

böser Prim Checker +50 Bytes :(

Shieru Asakoto
quelle
0

Python 2 , 105 104 Bytes

danke an user202729 für -1 byte

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

Probieren Sie es online!

ovs
quelle
Das Klammerpaar p+rscheint überflüssig zu sein ...
user202729