Różne sposoby definiowania liczb pierwszych


32

Jedna z moich ulubionych definicji liczb pierwszych jest następująca:

  • 2 jest najmniejszą liczbą pierwszą.

  • Liczby większe niż 2 są liczbą pierwszą, jeśli nie można ich podzielić przez mniejszą liczbę pierwszą.

Jednak ta definicja wydaje się dowolna, dlaczego 2? Dlaczego nie jakiś inny numer? Cóż, spróbujmy jeszcze kilka liczb, które zdefiniują n-prime, takie jak

  • n jest najmniejszą n-liczbą pierwszą.

  • Liczby większe niż n są liczbą n-pierwszą, jeśli nie można ich podzielić przez mniejszą liczbę n-pierwszą.

Zadanie

Zadanie polega na napisaniu programu, który przyjmuje dwa wejścia, dodatnią liczbę całkowitą n i dodatnią liczbę całkowitą a . Następnie zdecyduje, czy a jest n- prime. Twój program powinien wypisać dwie różne wartości: jedną dla „tak, to n-pierwsza”, a drugą dla „nie, to nie n-pierwsza”.

To jest pytanie w golfa kodu, więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.

Testy

Oto listy pierwszych 31 liczb pierwszych dla n = 2 do n = 12 (1 to jedyna liczba pierwsza)

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=15to pierwszy interesujący przypadek testowy.
Neil,

6
Jest to pierwsze miejsce, w którym rozkład non-pattern „a jest n-liczba pierwsza iff n ≤a <2n lub (a≥2n i a jest liczba pierwsza)” ulega rozkładowi.
Misza Ławrow

2
„Liczby większe niż 2 są liczbą pierwszą, jeśli nie można ich podzielić przez mniejszą liczbę pierwszą”. - Ta definicja pozwala, aby dowolna liczba była liczbą pierwszą. Może chcesz powiedzieć iff zamiast jeśli ?

5
@ThePirateBay Nie mam na myśli dokładnego matematycznego znaczenia tego słowa. Zostawię to.
Wheat Wizard

1
@JeppeStigNielsen Nie jest to trudne do udowodnienia. Wszystkie liczby zespolone n-pierwsze muszą mieć tylko czynniki pierwsze mniejsze niż n. Wiemy również, że żaden podzbiór ich czynników nie może mieć produktu większego niż n, ponieważ nasza liczba byłaby przez to podzielna. Zatem każda n-pierwsza jest albo 2-pierwsza, albo iloczyn 2 liczb mniejszych niż n. Istnieje tylko skończona liczba par liczb mniejszych niż n, dlatego istnieje tylko skończona liczba złożonych liczb n-pierwszych. Mam nadzieję, że to ma sens, musiałem skrócić, aby dopasować to w komentarzu.
Wheat Wizard

Odpowiedzi:




4

Python 3 , 45 bajtów

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

Wypróbuj online!

Jak to działa

To przyjmuje dwie liczby całkowite jako dane wejściowe, i i k . Najpierw sprawdza, czy k ≥ i . Następnie generuje zakres [i, k) i dla każdej liczby całkowitej N w tym zakresie sprawdza, czy N jest coprime do k . Jeżeli spełnione są oba warunki, to k to ja -prime.


Nie możesz używać &zamiast andi >=izamiast >i-1?
Wheat Wizard

@WheatWizard >=i ma nadal 4 bajty (ze względu na miejsce).
Neil

@ Nee Jeśli zmienisz się &, nie potrzebujesz miejsca.
Wheat Wizard


4

R , 44 37 bajtów

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

Wypróbuj online!

-7 bajtów dzięki Giuseppe

Zwraca TRUEjeśli

  • ajest równe nlub ( a==n|)
  • ajest większa niż n i ( a>n&) dla każdej liczby k od ndo a-1, anie jest równomiernie podzielna przez k ( all(a%%n:(a-1)))

Zwraca FALSEinaczej


Witamy w PPCG! Świetna pierwsza odpowiedź!
FantaC,

3

J, 30 bajtów

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

Wypróbuj online!

Pobiera wartość początkową jako prawy argument i wartość do sprawdzenia przy lewym argumencie.

Zrozumiałem pierwotnie i nie uwzględniłem mniejszych argumentów niż liczba początkowa. Jestem trochę niezadowolony z długości mojego rozwiązania.

Wyjaśnienie

Niech xbędzie lewym argumentem (wartością do sprawdzenia) i yprawym argumentem (liczba początkowa).

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

Notatki

Element w pozycji x-yjest wynikiem testu pierwotności dla x(ponieważ dodaliśmy ydo pierwotnego zakresu).

Pomnożenie przez x >: ygwarantuje, że otrzymamy wartość falsey ( 0) za xmniej niż y.


3

JavaScript (ES6), 33 32 30 bajtów

Pobiera dane wejściowe w składni curry (n)(a). Zwraca wartość logiczną.

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

Próbny


3

Haskell , 30 bajtów

2 bajty zaoszczędzone dzięki pomysłowi H.PWiz, który został zapożyczony z odpowiedzi flawr

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

Wypróbuj online!

Ok, odkąd minęło trochę czasu, a jedyna jak dotąd odpowiedź Haskell to 45 bajtów, postanowiłem opublikować własną odpowiedź.

Wyjaśnienie

Ta funkcja sprawdza, czy jedyną liczbą między n a a , przez którą można podzielić a, jest sama.

Teraz w definicji wspomniano tylko n- primes mniejsze niż a , więc dlaczego sprawdzamy te wszystkie dodatkowe liczby? Czy nie będziemy mieć problemów, gdy a jest podzielne przez jakiś n- kompozyt większy niż n ?

Nie zrobimy tego, ponieważ jeśli n- kompozyt jest większy niż n, to z definicji musi być podzielny przez mniejszą n- pierwszą. Tak więc, jeśli dzieli tak musi mniejszy n -prime.

Jeśli a jest mniejsze niż n [n..a] , []nie może być równe, [1]co powoduje niepowodzenie sprawdzania.





1

dc , 40 34 37 bajtów

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

Dołączyłbym link TIO, ale wydaje się, że TIO ma błędną dystrybucję, dcwidząc, jak to działa zgodnie z przeznaczeniem w moim systemie, ale Qpolecenie działa niepoprawnie na TIO. Zamiast tego znajduje się link do bashpoligonu testowego z poprawnie działającą wersją dc:

Demo It!


1

APL (Dyalog) , 24 bajty

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

Wypróbuj online!

W jaki sposób?

⍳⍵- 1doa

o←⍺↓- ndo a, zapisz doo

o|⍨⊂o- modulo każdy element oz każdym elementem wo

0=- sprawdź, gdzie to się równa 0(dzieli)

+/¨ - zsumuj liczbę działów

1= - jeśli mamy tylko jeden, to liczba jest dzielona tylko przez siebie

o/⍨ - więc zachowujemy te zdarzenia

⍵∊- jest aw tej tablicy resztkowej?



0

JavaScript ES5, 34 bajty

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

0

Dodaj ++ , 20 bajtów

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

Wypróbuj 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]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.