Czy to słaba liczba pierwsza?

26

Liczba pierwsza jest słaba, jeśli najbliższa inna liczba pierwsza jest mniejsza od niej. Jeśli jest remis, liczba pierwsza nie jest słaba.

Na przykład 73 jest liczbą pierwszą słabą, ponieważ 71 jest liczbą pierwszą, ale 75 jest liczbą złożoną.

Zadanie

Napisz kod komputerowy, który po podaniu liczby pierwszej większej niż 2 określi, czy jest to liczba pierwsza słaba. Jest to standardowy dlatego powinieneś wypisać dwie unikalne wartości dla każdego z dwóch przypadków (np. weakI not weak).

To jest więc obowiązują standardowe reguły dla tagu.

OEIS

Oto pierwsze 47 słabych liczb pierwszych:

3, 7, 13, 19, 23, 31, 43, 47, 61, 73, 83, 89, 103, 109, 113, 131, 139, 151, 167, 181, 193, 199, 229, 233, 241, 271, 283, 293, 313, 317, 337, 349, 353, 359, 383, 389, 401, 409, 421, 433, 443, 449, 463, 467, 491, 503, 509, 523, 547, 571, 577, 601, 619, 643, 647

Oto OEIS dla słabych liczb pierwszych (powinien zwrócić weak) OEIS A051635

Oto OEIS dla zrównoważonych liczb pierwszych (powinien zwrócić not weak) OEIS A006562

Oto OEIS dla silnych liczb pierwszych (powinien zwrócić not weak) OEIS A051634

Kreator pszenicy
źródło
not weakczy strong?
CalculatorFeline
7
@CalculatorFeline nie słaby jest inny niż silny
Wizard Wheat

Odpowiedzi:

26

Galaretka , 7 bajtów

Æn+Æp>Ḥ

Wypróbuj online!

Wyjaśnienie

           See if
Æn         the next prime
  +Æp      plus the previous prime
     >Ḥ    is greater than 2n

Jako bonus, zmieniających >się =lub <czeki dla liczb pierwszych zrównoważonych i silne, odpowiednio.

PurkkaKoodari
źródło
To powinno być >, nie?
Dennis
2
Och, wow, to sprytne ...
ETHproductions
Po prostu też to wypracowałem. Dobra robota!
Jonathan Allan
To takie sprytne ...
Erik the Outgolfer
12

Mathematica, 24 bajty

n=NextPrime;2#+n@-#<n@#&

NextPrimeWbudowanych można (ab?) Wykorzystane do obliczenia poprzedni Prime przez karmienie go argument negatywny.

Martin Ender
źródło
6

Galaretka , 9 bajtów

ḤÆRạÞ⁸ḊḢ>

Zwraca 1za słaby i 0nie słaby lub zrównoważony (zwraca 1za wkład 2)

Wypróbuj online!

W jaki sposób?

ḤÆRạÞ⁸ḊḢ> - Link: prime number > 2, p
Ḥ         - double -> 2*p
 ÆR       - yield primes between 2 and 2*p inclusive
     ⁸    - chain's left argument, p
    Þ     - sort by:
   ạ      -   absolute difference (i.e. distance from p)
      Ḋ   - dequeue (removes p from the list, since it has distance zero)
       Ḣ  - head (gives us the nearest, if two the smallest of the two)
        > - greater than p?
Jonathan Allan
źródło
Ninja dał mi kompleksowe rozwiązanie ...
Erik Outgolfer
To było ułamek sekundy!
Jonathan Allan
1
Nie, nie było, było 9 pełnych sekund cyrku. Nie, 10 sekund.
Erik the Outgolfer
Tak było (patrząc na czasy) tak się stało, jak tu przesłałem :)
Jonathan Allan
1
Cóż, wydaje się po prostu grałem szybciej niż ja ... (to dość wycieczka do pierwszego przejść od IIṠ⁼1do II>0celu I<\) ... twoje jest znacznie różni się jednak. Wygląda na to, że myślisz inaczej niż ja ... EDYCJA: Pietu1998 powrócił!
Erik the Outgolfer
5

PHP , 69 bajtów

drukuje jeden dla słabej liczby pierwszej i nic dla nie słabej liczby pierwszej

for(;!$t;$t=$d<2)for($n=$d=$argn+$i=-$i+$w^=1;$n%--$d;);echo$n<$argn;

Wypróbuj online!

Jörg Hülsermann
źródło
3

Oktawa, 93 84 bajtów

Dzięki @LuisMendo i @ rahnema1 za oszczędność bajtów!

function r=f(x);i=j=x;do--i;until(i<1|isprime(i));do++j;until(isprime(j));r=x-i<j-x;

Wypróbuj online!

Steadybox
źródło
Nie możesz użyć i-=1etc? Również endnie jest potrzebne w funkcji; możesz przenieść go do stopki
Luis Mendo
3

Maxima, 42 bajty

f(n):=is(n-prev_prime(n)<next_prime(n)-n);

Wypróbuj online!

rahnema1
źródło
3

MATL , 13 bajtów

qZq0)G_Yq+GE>

W przeciwnym 1razie dane wyjściowe są słabe 0.

Wypróbuj online!

Wyjaśnienie

q      % Implicit input, Subtract 1
Zq     % Vector of primes up to that
0)     % Get last one
G      % Push input again
_Yq    % Next prime
+      % Add
G      % Push input
E      % Multiply by 2
>      % Greater than? Implicit display
Luis Mendo
źródło
3

GNU APL 1.2, 78 bajtów

∇f N
X←(R←(~R∊R∘.×R)/R←1↓⍳N×2)⍳N
(|R[X-1]-N)<|R[X+1]-N
∇

∇f N deklaruje funkcję, która przyjmuje argument.

(~R∊R∘.×R)/R←1↓⍳N×2daje listę wszystkich liczb pierwszych od 2 do dwukrotności argumentu. Zakładam, że następna liczba pierwsza jest mniejsza niż dwukrotność oryginału. Jeśli jest to nieprawda, N*2podaje N do kwadratu i zajmuje taką samą liczbę bajtów (mam nadzieję, że jest to wystarczająco duża, aby przekroczyć kolejną liczbę pierwszą). (Zobacz wyjaśnienie Wikipedii dotyczące działania wyszukiwania głównego)

X←(R←(...))⍳Nprzypisuje tę listę do wektora R(zastępując jej poprzednią zawartość), znajduje indeks oryginalnej liczby pierwszej Nna tej liście, a następnie przypisuje ten indeks do X.

|R[X-1]-Noblicza różnicę między poprzednią liczbą pierwszą (ponieważ Rzawiera liczby pierwsze, ten X-1element jest liczbą pierwszą przed N), Na następnie przyjmuje wartość bezwzględną (APL działa od prawej do lewej).

|R[X+1]-N robi to samo, ale dla następnej liczby pierwszej.

(|R[X-1]-N)<|R[X+1]-Ndrukuje 1, jeśli poprzednia liczba pierwsza jest bliższa oryginałowi niż kolejna liczba pierwsza, a 0 w przeciwnym razie. Nawiasy są potrzebne do pierwszeństwa.

kończy funkcję.

Arc676
źródło
2

Pyth, 15 bajtów

>-fP_ThQfPT_tQy

Wypróbuj tutaj.

Wykorzystuje algorytm Pietu1998.

Erik the Outgolfer
źródło
2

Perl 6 , 41 bajtów

{[>] map ->\n{$_+n,*+n...&is-prime},1,-1}

Wypróbuj online!

$_jest argumentem funkcji. Funkcja mapowania -> \n { $_ + n, * + n ... &is-prime }przyjmuje liczbę ni zwraca ciąg liczb, $_ + n, $_ + 2*n, ...który kończy się, gdy osiągnie liczbę pierwszą. Mapowanie tej funkcji na dwie liczby 1i -1tworzy sekwencję dwóch sekwencji; pierwszy zaczyna się na $_ + 1i kończy pierwszą liczbą pierwszą większą niż $_, a drugi zaczyna się na $_ - 1i kończy pierwszą liczbą pierwszą mniejszą niż $_. [>]zmniejsza tę dwuelementową listę operatorem większym niż, zwracając wartość true, jeśli pierwsza sekwencja jest większa (tj. dłuższa) niż druga.

Sean
źródło
2

Python 2.7 - 120 bajtów

from math import*
i=lambda x:factorial(x-1)%x==x-1
def f(n,c):return 1 if i(n-c)>i(n+c) else 0 if i(n+c)>0 else f(n,c+1)

Ponieważ python nie ma wbudowanej funkcji podstawowej, możemy użyć twierdzenia Wilsona, aby uzyskać ładny krótki sprawdzanie liczby pierwszej. Twierdzenie Wilsona stwierdza, że ​​liczba jest liczbą pierwszą wtedy i tylko wtedy, gdy (n-1)! jest zgodny z -1 mod (n). Dlatego funkcja i zwróci 1, jeśli liczba jest liczbą pierwszą, i 0, jeśli nie jest. Następnie funkcja f określa, czy następna liczba pierwsza z tej liczby występuje najpierw, gdy jest zwiększana w dół, a nie w górę. Jeśli żadna z liczb inkrementowanych nie jest liczbą pierwszą, jest ona po prostu rekurencyjnie wywoływana ponownie.

Niektóre przykładowe We / Wy

f(3,1)
1
f(15,1)
0
Joe Habel
źródło
2

Python 2 , 122 108 103 94 92 bajty

def a(n):
 r=[2];x=2
 while r[-1]<=n:x+=1;r+=[x]*all(x%i for i in r)
 return sum(r[-3:])>3*n

Wypróbuj online!

Wykorzystuje pomysł Pietu ... a następnie zaoszczędził 28 bajtów, grając w golfa w krótszych iteratorach z listami głównymi; następnie 2 więcej zastępując -3*n>0z >3*n(d'oh!)

Chas Brown
źródło
2

Regex (większość smaków), 47 bajtów

^(?=(x*)(?!(x+)(\2\2x)+$)\1)x+(?!(xx+)\4+$)\1\1

Wypróbuj online!

Pobiera dane wejściowe jednoargumentowe. Wyprowadza dopasowanie dla słabych liczb pierwszych, brak dopasowania dla słabych liczb pierwszych. Działa w ECMAScript, Perl, PCRE, Python, Ruby.

Wyjaśnienie:

Niech N będzie wejściem, A najbliższą liczbą pierwszą <N, a B najbliższą liczbą pierwszą> N. Główną trudnością podejścia regularnego do tego wyzwania jest to, że nie możemy reprezentować liczb większych niż dane wejściowe, jak B. Zamiast tego znajdź najmniejsze b, tak że 2b + 1 jest liczbą pierwszą, a 2b + 1> N, co zapewnia 2b + 1 = B.

(?=
  (x*)              # \1 = N - b, tail = b
  (?!(x+)(\2\2x)+$) # Assert 2b + 1 is prime
  \1                # Assert b ≥ \1 (and thus 2b + 1 > N)
)

Następnie zauważ, że tak naprawdę nie musimy znaleźć A. Dopóki dowolna liczba pierwsza <N jest bliższa N niż B, N jest słabą liczbą pierwszą.

x+                  # tail iterates over integers < N
(?!(xx+)\4+$)       # assert tail is prime
\1\1                # assert tail ≥ 2 * \1 (and thus tail + B > 2N)
Ponury
źródło
1

JavaScript ES6, 162 154 bajtów

8 bajtów oszczędności na podstawie sztuczki Jörga Hülsermanna „nie drukuj niczego w jednym przypadku”. Nie trzeba ?"Y":"N"późniejone<two

var isWeak=

a=>{p=[2];i=0;f=d=>{j=p[i];l:while(j++){for(x=0;p[x]*p[x]<=j;x++){if(j%p[x]==0){continue l}}return p[++i]=j}};while(p[i]<a+1){f()};return a*2<p[i]+p[i-2]}

[43,//true
53,//false
7901,//false
7907,//true
1299853,//true
1299869//false
].forEach(n=>{console.log(n,isWeak(n))})

Евгений Новиков
źródło
0

Python 3 , 149 bajtów

f=lambda n,k=1,P=1:n*[0]and P%k*[k]+f(n-P%k,k+1,P*k*k)
def a(n):p=f(n);return p.index(n)in filter(lambda i:p[i]-p[i-1]<p[i+1]-p[i],range(1,len(p)-1))

Wypróbuj online!

Korzystam z funkcji generowania liczb pierwszych (górna linia) wziętej z tej starej odpowiedzi wymiany stosów.

wrymug
źródło
0

JavaScript, 98 bajtów

let test = _=>(o.innerHTML=f(+prime.value))
let f= 

n=>{P=n=>{for(i=n,p=1;--i>1;)p=p&&n%i};a=b=n;for(p=0;!p;P(--a));for(p=0;!p;P(++b));return n-a<b-n}
Enter Prime: <input id="prime">
<button type="button" onclick="test()">test if weak</button>
<pre id="o"></pre>

Mniej Golphed

n=>{
   P=  // is a Prime greater than 1, result in p
       n=>{
           for(i=n,p=1;--i>1;)
               p=p&&n%i
       };

   a=b=n; // initialize lower and upper primes to n
   for(p=0;!p;P(--a)); // find lower,
   for(p=0;!p;P(++b)); // find upper,
   return n-a<b-n // is weak result
}

Zauważ, że kod testowy nie sprawdza, czy wejście „liczba pierwsza” jest w rzeczywistości liczbą pierwszą.

traktor53
źródło
0

braingasm , 23 22 bajtów

Drukuje 1dla słabych liczb pierwszych i 0dla nie słabych.

;>0$+L[->+>2[>q[#:Q]]]

Przewodnik:

;                       Read a number to cell 0
 >0$+                   Go to cell 1 and copy the value of cell 0
     L                  Make the tape wrap around after cell 1
      [              ]  Loop:
       ->+>               Decrease cell 1 and increase cell 0
           2[       ]     Twice do:
             >              Go to the other cell
              q[   ]        If it's prime:
                #:Q         Print the current cell number and quit
daniero
źródło
0

Julia 0.6, 64 bajty

g(x,i)=0∉x%(2:x-1)?1:1+g(x+i,i);x->g(x,1)&(g(x-1,-1)<g(x+1,1))
Tanj
źródło
0

Python 2 , 81 bajtów

n=input()
a=b=c=i=2;p=1
while b<n:
 p*=i;i+=1
 if p*p%i:a,b,c=b,c,i
print a+c>2*b

Wypróbuj online!

Wykorzystuje twierdzenie Wilsona do testu pierwotności.

mile
źródło