Liczba pierwsza Pillai jest liczbą pierwszą dla której istnieje pewna liczba dodatnia taka że
Innymi słowy, całkowita jest liczbą pierwszą Pillai jeśli jest liczbą pierwszą , czy istnieje inny dodatnią liczbą całkowitą tak, że czynnikowe z plus jest podzielna przez i jeśli nie jest podzielna przez .
Biorąc pod uwagę dodatnią liczbę całkowitą jako dane wejściowe, zdecyduj, czy jest to liczba pierwsza Pillai. Sekwencja liczb pierwszych Pillai to OEIS A063980 .
Na przykład jest liczbą pierwszą Pillai, ponieważ:
- Jest to liczba pierwsza, mająca tylko 2 czynniki.
- i spełniają powyższe warunki: i nie dzieli ; i również nie dzielą .
Przypadki testowe
Prawda:
23 59 83 109 139 593
Falsy:
5 7 8 73 89 263 437
W przypadkach truthy, odpowiednich M „s są [(23, [14, 18]), (59, [15, 40, 43]), (83, [13, 36, 69]), (109, [86]), (139, [16]), (593, [274])]
.
Możesz postępować zgodnie ze standardowym formatem wyjściowym problemu decyzyjnego (tj. Wartościami prawda / fałsz) lub mieć spójną wartość liczb pierwszych Pillai i niespójną wartość w przeciwnym razie lub odwrotnie .
Możesz konkurować w dowolnym języku programowania i możesz przyjmować dane wejściowe i generować dane wyjściowe za pomocą dowolnej standardowej metody , zwracając uwagę, że te luki są domyślnie zabronione. To jest golf golfowy , więc wygrywa najkrótsze przesłanie (w bajtach) dla każdego języka .
źródło
[(23, 14), (23, 18), (59, 15), (59, 40), (59, 43), (83, 13), (83, 36), (83, 69), (109, 86), (139, 16), (593, 274)]
. Dodałem je również do wyzwania.Odpowiedzi:
Python 2 ,
115111110109 bajtów-6 bajtów dzięki Mr. Xcoder
Wypróbuj online!
Funkcje składają się z dwóch części,
~-n%x<1or~f(x)%n>0
które weryfikują, czyn
nie spełniają „warunków Pillai”, in%x>0
dla pierwszej weryfikacji.Następnie
all
nakłada się obu elementów, pierwszy element będzie zawieraćFalse
/0
jeżeli nie jest poprawny „numer Pillai”, a druga będzie zawierałaTrue
/1
jeślin
jest pierwszorzędna.Są one przekazywane, aby
cmp
powrócić-1
w tym cenario (jest prawidłową liczbą pierwszą Pillai). Inne kombinacje[[0, 0], [1, 0], [1, 1]]
powrócą0
lub1
źródło
Galaretka ,
118 bajtówZwraca 0 dla liczby pierwszej Pillai, w przeciwnym razie 1 .
Wypróbuj online!
Jak to działa
źródło
Pari / GP , 44 bajty
Wypróbuj online!
źródło
Brachylog , 19 bajtów
Wypróbuj online!
Dość proste tłumaczenie pytania:
źródło
J ,
3026 bajtów-4 bajty dzięki FrownyFrog
Wypróbuj online!
Wyjaśnienie:
źródło
1~:|
zapisanie 2 bajtów.(]|1+!@[)
jest po prostu(|1+!)~
~
i robi to z twoim poprzednim komentarzem.Python 2 ,
65645352 bajtyWyjście odbywa się przez obecność lub brak błędu.
Wypróbuj online!
źródło
Python 2 ,
109107 bajtówWypróbuj online!
Wyjaśnienie
l
Znajdzie silnię liczby przyjętej w, tak5
jak zwrotów wejściowych120
.Do
all(p%i for i in range(2,p-1))
sprawdza, czy liczba jest pierwsza, ignorujemy 0 i 1 jak inne nasze warunki już wykluczyć te out.Wreszcie, używamy
any(~-p%m>-~l(m)%p==0for m in range(2,p))
do iteracji przez wszystkie potencjalne strony, aby sprawdzić, czy którekolwiek spełniają nasze potrzeby.~-p
środkip+1
. Następnie sprawdzamy, czy jest on większy niż-~l(m)%p
(co tłumaczy(m!-1)%p
, a następnie porównujemy0
. Zasadniczo~-p%m
musi być większy niż 0 i-~l(m)%p
musi wynosić 0.Źródła
Ulepszenia
źródło
jak zapewne widać na łączu tio, nie wszystkie przypadki przebiegają pomyślnie, to dlatego, że js nie może obsłużyć dużych liczb, jeśli takie wymagania istnieją, spróbuj go wdrożyć :)
istnieje podwójna kontrola,
F%n>n-2&(F+1)%n<1
aby zapobiec fałszywie dodatnim (ale nie na odwrót w przypadku problemów z dużą liczbą js, naprawdę potrzebujemy(F+1)%n<1
mniejszych liczb, które zmniejszają liczbę bajtów rozwiązania do 60JavaScript (Node.js) ,
9088867268 bajtówWypróbuj online!
źródło
Brachylog , 13 bajtów
Wypróbuj online!
Udaje się w przypadku liczb pierwszych Pillai, zapewniając najmniejsze m poprzez zmienną wyjściową, i kończy się niepowodzeniem dla czegokolwiek innego. Ponieważ duża część tego, jak oszczędza to bajty w porównaniu z rozwiązaniem sundarowym, polega na tym, że wielokrotnie oblicza podstawowe faktoryzacje niektórych dość dużych liczb, jest dość niewiarygodnie powolny przy większych wejściach. (Prawdopodobnie uruchomię te przypadki na mojej lokalnej instalacji Brachylog, gdy mój laptop nie będzie zasilany z baterii).
źródło
[Perl], 45 bajtów
Moduł teorii liczb ma predykaty jako funkcje wbudowane (is_pillai faktycznie zwraca 0 lub najmniejsze m, więc rozwiązuje również A063828). Podstawowy kod C i Perl nie jest golfem (oczywiście). Kod C wygląda następująco:
(generalnie zamień UV na uint64_t lub podobny, a HALF_WORD decyduje, czy możemy zoptymalizować mulmod do prostych natywnych operacji).
Czysty kod Perla jest podobny do:
źródło
C (gcc) , 64 bajty
Wypróbuj online!
źródło
Whispers v2 , 230 bajtów
Wypróbuj online!
Zwraca to pustą listę liczb pierwszych niepobranych w Pillai, aw przeciwnym razie niepustą listę.
Jak to działa
Szepty zostały zaprojektowane do manipulowania liczbami rzeczywistymi / złożonymi, z niewielką ilością poleceń tablicowych dodanych dla dobrego pomiaru, stąd wielokrotne użycie
Each
iteracji po wygenerowanych listach.Trochę tła na temat szeptów:
Szepty różnią się nieco ścieżką wykonania od większości innych języków. Zamiast pracować liniowo nad każdą linią, tylko rozgałęziając się w warunkach, Szepty zaczynają się od ostatniej linii w pliku zaczynając od
>
(reguły są nieco bardziej skomplikowane, ale to wszystko, co na razie musimy wiedzieć) i znaczenie liczb różnią się w zależności od tego, czy linia zaczyna się od,>
czy>>
.Jeśli linia zaczyna się od
>
, na przykład> 1
lub> Input
, jest to linia stała - za każdym razem zwraca tę samą wartość. Tutaj liczby reprezentują ich postać liczbową, więc pierwsza linia zawsze zwraca 1, gdy zostanie wywołana.Jeśli linia zaczyna się od
>>
, liczby są traktowane jako odniesienia do innych linii, podobnie jak wywołania funkcji, jeśli chcesz. Na przykład w wierszu>> 1…2
nie wykonuje…
polecenia na liczbach całkowitych 1 i 2 , ale na wartościach zwracanych z wierszy 1 i 2 . W tym przypadku tymi wartościami są liczba całkowita 1 i dowolna liczba całkowita, którą przekazujemy jako dane wejściowe.W tym przykładzie rozważmy dane wejściowe 23 . Należy pamiętać, że z powodu przetwarzania wstępnego Szeptów druga linia (
> Input
) jest konwertowana na> 23
.Nasza pierwsza komenda jest na linii 3:
>> 1…2
.…
oznacza zakres dynamiczny, w tym przypadku od 1 do 23 , dając {1, 2, ... 22, 23} . Następnie przechodzimy do linii od 9 do 12 :Tutaj mamy 4 kolejne
Each
instrukcje, z których każda iteruje w stosunku do poprzedniego wyniku, zasadniczo mapując 4 polecenia na tablicę w linii 3 : zakres. Pierwsze trzy stwierdzenia to proste mapy z wierszami 4 , 5 i 6 :Te trzy polecenia powyżej liczby całkowitej n dają (n! +1) ∣x , gdzie ! oznacza silnię , ∣ oznacza podzielność, a x oznacza dane wejściowe. Wreszcie linia 12 ma mapę diadadową strukturę .
Dwójkowym mapa struktura zajmuje trzy liczby całkowite: cel, w lewo iw prawo, każdy indeksów na innych liniach. Tutaj spakowujemy w lewo i w prawo, aby utworzyć listę par, a następnie zmniejszamy każdą parę za pomocą polecenia dyadic (celu). Tutaj, jeśli wartością wejściową jest 23 , listy to {1, 2, ... 22, 23} i {0, 0, ... 1, 0}, a polecenie to
co zwielokrotnia lewy argument przez prawy. W ten sposób powstaje tablica liczb całkowitych, gdzie 0 przy indeksach liczb całkowitych, których silni przyrosty nie są podzielne przez dane wejściowe, i pierwotny indeks tam, gdzie są. Zadzwonimy tej tablicy A . Następnie usuwamy 0 z A , biorąc ustaloną różnicę między {0} a A :
Przy naszym przykładowym wprowadzeniu tworzy to zestaw {14, 18, 22} . Następnie bierzemy pozostałą część danych wejściowych dzieloną przez każdą wartość w zestawie i sprawdzamy, czy ta reszta nie jest równa 1 :
Ponownie mamy listę 0 lub 1 s i musimy usunąć 0 i zastąpić je 1 oryginalnymi wartościami. Tutaj powtarzamy kod, który widzieliśmy powyżej, ale
>> 18∖13
zamiast12
. Na koniec rzutujemy ten wynikowy zestaw na listę w celu ostatecznego sprawdzenia. Niestety nasz kod musi również odrzucać liczby zespolone spełniające wszystkie te kryteria, takie jak 437 . Więc dodajemy naszą ostatnią kontrolę, mnożąc naszą ostateczną listę przez pierwotność danych wejściowych. Ze względu na to, jak działa mnożenie Pythona na listach, 0 zastępuje je pustą listą, a 1 nie ma wpływu. Obliczamy więc pierwotność danych wejściowych, pomnóż ją przez listę ms dla danych wejściowych i wyjściowych:źródło
APL (NARS), 65 znaków, 130 bajtów
Tutaj 23x oznaczałoby to 23r1, a więc ułamek 23/1, czyli wszystkie pozostałe; test:
źródło
C # (interaktywny kompilator Visual C #) , 138 + 22 = 160 bajtów
TIO nie wdrożyło biblioteki System.Numerics w swoim wydaniu Mono, więc możesz zobaczyć wyniki
Wypróbuj online!Tutaj zamiast tego.Wyjaśnienie:
źródło
CJam , 37 bajtów
Wyjścia
11
jeśli wejście jest najlepszym Pillai, poza00
,01
lub10
Wyjaśnienie:
Wypróbuj online!
źródło