Diversi modi di definire i numeri primi


32

Una delle mie definizioni preferite dei numeri primi è la seguente:

  • 2 è il primo più piccolo.

  • I numeri maggiori di 2 sono primi se non sono divisibili per primi più piccoli.

Tuttavia questa definizione sembra arbitraria, perché 2? Perché non qualche altro numero? Bene, proviamo alcuni altri numeri che definiranno n-prime tale che

  • n è il più piccolo n-prime.

  • I numeri maggiori di n sono n-primi se non sono divisibili per n più piccoli.

Compito

Il compito qui è scrivere un programma che accetta due input, un numero intero positivo n e un numero intero positivo a . Deciderà quindi se a è n -prime. Il tuo programma dovrebbe generare due valori distinti uno per "sì, è n-prime" e uno per "no, non è n-prime".

Questa è una domanda di code-golf, quindi le risposte verranno classificate in byte con meno byte migliori.

test

Ecco gli elenchi dei primi 31 numeri primi per n = 2 a n = 12 (1 è l'unico numero 1-primo)

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=15è il primo caso di test interessante.
Neil,

6
È il primo posto in cui il non-pattern "a è n-prime iff n≤a <2n o (a≥2n e a è prime)" si rompe.
Misha Lavrov,

2
"I numeri maggiori di 2 sono primi se non sono divisibili per primi più piccoli." - Questa definizione consente a qualsiasi numero di essere primo. Forse vuoi dire iff invece di if ?

5
@ThePirateBay Non intendo il preciso senso matematico della parola se. Lo lascerò.
Mago del grano,

1
@JeppeStigNielsen Non è molto difficile dimostrarlo. Tutti i numeri compositi che sono n-primi devono avere solo fattori primi che sono più piccoli di n. Sappiamo anche che nessun sottoinsieme dei loro fattori può avere un prodotto più grande di n perché il nostro numero sarebbe divisibile per quello. Quindi ogni n-prime è 2-prime o il prodotto di 2 numeri in meno di n. Esistono solo un numero finito di coppie di numeri inferiori a n, quindi esiste solo un numero finito di numeri n-primi compositi. Spero che abbia senso, ho dovuto abbreviare per adattarlo a un commento.
Wheat Wizard il

Risposte:




4

Python 3 , 45 byte

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

Provalo online!

Come funziona

Questo richiede due numeri interi come input, i e k . Prima controlla se k ≥ i . Quindi genera l'intervallo [i, k) e per ogni numero intero N in questo intervallo, controlla se N è coprime a k . Se entrambe le condizioni sono soddisfatte, allora k è un i -prime.


Non puoi usare &invece di ande >=iinvece di >i-1?
Mago del grano

@WheatWizard ha >=i ancora 4 byte (a causa dello spazio).
Neil,

@Neil Se cambi in &non hai bisogno di spazio.
Wheat Wizard


4

R , 44 37 byte

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

Provalo online!

-7 byte grazie a Giuseppe

Restituisce TRUEif

  • aè uguale a no ( a==n|)
  • aè maggiore di n e ( a>n&) per ogni numero k da na a-1, anon è uniformemente divisibile per k ( all(a%%n:(a-1)))

Restituisce FALSEaltrimenti


Benvenuti in PPCG! Ottima prima risposta!
FantaC,

3

J, 30 byte

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

Provalo online!

Prende il valore iniziale come argomento giusto e il valore da verificare nell'argomento sinistro.

Inizialmente ho sbagliato e non ho tenuto conto degli argomenti di sinistra meno del numero primo di partenza. Sono un po 'scontento della lunghezza della mia soluzione ora.

Spiegazione

Sia xl'argomento sinistro (il valore da verificare) e ysia l'argomento giusto (il primo di partenza).

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

Gli appunti

L'elemento in posizione x-yè il risultato del test di primalità per x(dal momento che abbiamo aggiunto yalla gamma originale).

Moltiplicando per si x >: yottiene un valore di falso ( 0) per xmeno di y.


3

JavaScript (ES6), 33 32 30 byte

Accetta input nella sintassi del curry (n)(a). Restituisce un valore booleano.

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

dimostrazione


3

Haskell , 30 byte

2 byte salvati grazie all'idea di H.PWiz che è stata presa in prestito dalla risposta di Flawr

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

Provalo online!

Ok da quando è passato un po 'di tempo, e l'unica risposta di Haskell finora è di 45 btyes, ho deciso di pubblicare la mia risposta.

Spiegazione

Questa funzione controlla che l'unico numero tra n e a che a sia divisibile per è a se stesso.

Ora la definizione menziona solo n -primes più piccoli di a , quindi perché stiamo controllando tutti questi numeri extra? Non avremo problemi quando a è divisibile per alcuni n -compositi più grandi di n ?

Non lo faremo perché se esiste un n -composto maggiore di n , per definizione , deve essere divisibile per un n -prime più piccolo . Quindi, se divide un così deve essere il n -prime più piccolo.

Se a è minore di n [n..a] non sarà []quindi uguale a [1]causare il fallimento del controllo.




1

C, 55 byte

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

Provalo online!

53 byte se sono consentiti più valori di ritorno true:

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

Provalo online!


1

dc , 40 34 37 byte

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

Avrei incluso un collegamento TIO, ma TIO sembra trasportare una distribuzione errata di dccome funziona come previsto sul mio sistema, ma il Qcomando funziona erroneamente su TIO. Invece, ecco un link a un bashbanco di prova con una versione correttamente funzionante di dc:

Demo It!


1

APL (Dyalog) , 24 byte

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

Provalo online!

Come?

⍳⍵- 1aa

o←⍺↓- nin a, salva ino

o|⍨⊂o- modulo ogni elemento in ocon ogni elemento ino

0=- controlla dove è uguale 0(divide)

+/¨ - somma il numero di divisioni

1= - se ne abbiamo solo uno, il numero viene diviso solo per se stesso

o/⍨ - quindi manteniamo queste occorrenze

⍵∊- è ain quella matrice residua?



0

JavaScript ES5, 34 byte

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

0

Aggiungi ++ , 20 byte

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

Provalo 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]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.