Czasami, pisząc program, musisz użyć liczby pierwszej z jakiegoś powodu (np. Kryptografii). Zakładam, że czasami trzeba również użyć liczby złożonej. Czasami, przynajmniej tutaj na PPCG, twój program musi być w stanie poradzić sobie z dowolnymi zmianami. A w okolicznościach dogodnie zaprojektowanych, by zadać interesujące pytanie PPCG, być może nawet liczby, których używasz, muszą być odporne na korupcję…
Definicje
Liczba złożona jest liczbą całkowitą ≥ 4, która nie jest liczbą pierwszą, tzn. Jest iloczynem dwóch mniejszych liczb całkowitych większych niż 1. Liczbę złożoną odporną na bitflip definiuje się w następujący sposób: jest to dodatnia liczba całkowita dodatnia, dla której, jeśli ją napiszesz binarnie w minimalnej możliwej liczbie bitów, możesz zmienić dowolny jeden lub dwa bity z liczby, a liczba jest nadal złożona.
Przykład
Weźmy na przykład liczbę 84. Binarnie, to jest 1010100
. Oto wszystkie liczby, które różnią się o nie więcej niż 2 bity od tego:
0000100 4 2 × 2 0010000 16 4 × 4 0010100 20 4 × 5 0010101 21 3 × 7 0010110 22 2 × 11 0011100 28 4 × 7 0110100 52 4 × 13 1000000 64 8 × 8 1000100 68 4 × 17 1000101 69 3 × 23 1000110 70 7 × 10 1001100 76 4 × 19 1010000 80 8 × 10 1010001 81 9 × 9 1010010 82 2 × 41 1010100 84 7 × 12 1010101 85 5 × 17 1010110 86 2 × 43 1010111 87 3 × 29 1011000 88 8 × 11 1011100 92 4 × 23 1011101 93 3 × 31 1011110 94 2 × 47 1100100 100 10 × 10 1110000 112 8 × 14 1110100 116 4 × 29 1110101 117 9 × 13 1110110 118 2 × 59 1111100 124 4 × 31
Pierwsza kolumna to liczba binarna; druga kolumna to liczba dziesiętna. Jak wskazuje trzecia kolumna, wszystkie te liczby są złożone. Jako taki, 84 jest liczbą kompozytową odporną na bitflipy.
Zadanie
Musisz napisać jeden z następujących trzech programów lub funkcji, w zależności od tego, który z nich jest najbardziej odpowiedni dla twojego języka:
- Program lub funkcja, która przyjmuje nieujemną liczbę całkowitą n jako dane wejściowe i wysyła pierwsze n liczb zespolonych odpornych na bitflip.
- Program lub funkcja, która przyjmuje nieujemną liczbę całkowitą n jako dane wejściowe i wysyła wszystkie liczby zespolone odporne na bitflipy mniejsze niż n (lub, jeśli wolisz, mniejsze lub równe n , tzn. Możesz wybrać, czy n ma być dołączone do wyjścia, jeśli bitflip -odporny).
- Program lub funkcja, która nie pobiera danych wejściowych i wyświetla wszystkie liczby zespolone odporne na bitflipy. (Musi to wykorzystywać mechanizm wyjściowy zdolny do generowania danych wyjściowych podczas działania programu, taki jak drukowanie na standardowe wyjście, leniwa lista lub generator; nie można po prostu obliczyć całej listy, a następnie wydrukować ją.)
Przypadki testowe
Oto kilka pierwszych liczb kompozytowych odpornych na bitflip:
84, 184, 246, 252, 324, 342, 424, 468, 588, 636, 664, 670, 712, 730, 934, 958
Wyjaśnienia
- Tylko liczby, które produkujesz, muszą być odporne na bitflipy. Nie jest to zadanie polegające na uczynieniu programu odpornym na bitflipy; użyj dowolnych liczb w samym programie, które ci się podobają.
- Liczby, które podajesz, nie muszą być odporne na bitflip w „wiodących zerach”; wyobraź sobie, że liczby będą przechowywane w minimalnej możliwej liczbie bitów i tylko te bity muszą być odporne na przerzucanie. Jednak początkowe 1 bity liczb, które wyprowadzasz, muszą być odporne na bitflipy.
- Użyj dowolnego algorytmu, który ci się podoba, który daje właściwy wynik; nie jesteś tutaj oceniany pod względem wydajności.
- Jeśli możesz udowodnić, że istnieje wiele liczb kompozytowych odpornych na bitflipy, a) a) ograniczenia formatu wyjściowego zostaną zniesione, i b) dozwolone będzie twarde kodowanie listy (choć prawdopodobnie bardziej szczegółowe niż tylko obliczanie). Ta zasada służy głównie kompletności; Nie oczekuję, że to będzie istotne.
Warunek zwycięstwa
To jest golf golfowy , więc jak zwykle krótszy jest lepszy. Również, jak zwykle, długość programu będzie mierzona w bajtach.
n
jeślin
jest odporna na bitflip? (tzn. czy „mniej niż lub równa n”?)Odpowiedzi:
Galaretka , 20 lat? 22 bajty
Wypróbuj online!
Daje pierwsze n takich liczb.
Może
;0
może być usunięty (bez niego nie sprawdzamy, czy sama liczba jest złożona - czy są jakieś liczby pierwsze z złożonym bit-flips?)Zauważ, że nie wystarczy wykonać test
not(any(is prime))
na zestawie liczb z odwróconą liczbą bitów. Musimy także przetestować, że0
nie ma go w zestawie.Wynika to z faktu, że
0
nie jest liczbą pierwszą i nie jest złożona (1
jest też, ale patrz poniżej).Konieczność sprawdzenia
0
może być widoczna na przykładzie:131136
( 2 17 +2 6 ) ma następujący zestaw bit-flip:Wszystkie, z wyjątkiem
0
złożonych, ale0
nie są pierwszorzędne.1
jest również niepierwszorzędny i niekompozytowy i może pojawić się w zestawie. Możemy jednak, jeśli chcemy, pozostawić to tak, jakby to był złożony:wszystkie dane wejściowe mniejsze niż lub równe
3
(jeśli są w ogóle brane pod uwagę) zawierają0
mimo to (w rzeczywistości wszystkie mniej niż7
do)aby osiągnąć
1
w jednym bicie odwróć, pierwotna liczba musi mieć postać 2 k +2 0 , a jeśli jest ona większa niż3
, tj. k> 1 , wówczas możemy osiągnąć3
, wyłączając wartość k- bit i ustawiając wartość 1- bit ( 2 1 + 2 0 = 3 ).aby dotrzeć
1
w dwóch bitach, pierwotna liczba musi mieć postać 2 k, a jeśli jest większa niż3
możemy2
w zamian sięgnąć w dwóch rzutach i2
jest liczbą pierwszą.W obecnej formie kod jest obsługa zarówno
0
i1
razem za pomocą „nieznaczne” atomuỊ
.W jaki sposób?
źródło
;0
tam jest -Œċ
pobiera wszystkie nieuporządkowane pary z zamianą indeksów (J
), więc dla 84, które mają 7 bitów, czyli 28 (w tym takie jak [1,1] dla pojedynczych przerzutów bitów (z „z wymianą”), nie 29 (plus bez zmian).Brachylog ,
3238 bajtówWypróbuj online!
Jest to funkcja / predykat,
↰₀
która zwraca generator, który generuje wszystkie takie liczby. (Łącze TIO drukuje tylko pierwszy numer, dzięki czemu coś można zaobserwować. Lokalne uruchomienie spowodowało jednak znacznie więcej.)Teraz zaktualizowano, aby poprawnie obsługiwał liczby, które znajdują się w dwóch bitflipach od 0 lub 1 (które nie są liczbami pierwszymi ani złożonymi).
Wyjaśnienie
Predykat pomocnika
↰₂
(zwraca listę równą wartości wejściowej, z wyjątkiem może jednego elementu)Bardzo by mi się podobało, gdyby istniał szybszy sposób na wykonanie tej stosunkowo prostej rekurencji, ale nie jestem pewien, czy jest jeszcze taka możliwość; w specyfikacji znajduje się kilka obiecujących funkcji, ale są one oznaczone jako niewdrożone.
Główny program
↰₀
źródło
JavaScript (ES6), 96 bajtów
Pełny program, który monituje o liczbę pasujących liczb całkowitych i wyświetla je jeden po drugim, używając
alert()
.O ile Twoja przeglądarka nie jest skonfigurowana do korzystania z funkcji optymalizacji połączenia z ogonem, w końcu ulegnie ona awarii z powodu przepełnienia rekurencji.
Poniżej znajduje się wersja nierekurencyjna (102 bajty).
Założenie
Algorytm ten opiera się na założeniu, że wszystkie liczby zespolone odporne na bitflip są parzyste. Prowadzi to do dość ważnego uproszczenia: zamiast przerzucać każdą możliwą parę bitów, odwracamy tylko bit nr 0 i kolejny (lub żaden inny bit) i sprawdzamy, czy wszystkie wynikowe liczby są złożone.
Jednak nie mogę znaleźć żadnego oczywistego dowodu, że nieparzysta liczba kompozytowa odporna na bitflip tak naprawdę nie istnieje. Tak się nie dzieje w przypadku małych liczb (sprawdziłem do 1 000 000) i wydaje się, że prawdopodobieństwo znalezienia jednego maleje wraz ze wzrostem liczby bitów (ale to w zasadzie moja intuicja na ten temat).
źródło
Galaretka ,
2017 bajtówWypróbuj online!
Jak to działa
źródło
Python 2, 113 bajtów
(Drugi wiersz to nienazwana funkcja, która zwraca listę wszystkich liczb zespolonych odpornych na bitflip, które są mniejsze niż dane wejściowe do funkcji.)
Składnia
all(u%q for q in range(2,u))
będzie oceniać,True
ilekroću
jest albo pierwsza, albo mniejsza, albo równa2
, a w przeciwnym razie -False
. (Jest pusta,True
jeśliu
jest mniejsza lub równa2
.)Innymi słowy,
all(u%q for q in range(2,u))
jest równy0
wtedy i tylko wtedy, gdyu
jest złożony.Jeśli wartość wejściowa funkcji jest mniejsza niż
2
, wówczas funkcja zwraca pustą listę (zgodnie z życzeniem). Załóżmy więc, że dane wejścioweN
są co najmniej2
i załóżmy1 <= n < N
. Dla każdegok
z0
przezn
(włącznie), kod sprawdzi czyn
XOR'd zek
jest złożona, a także sprawdza, czyk
ma co najwyżej dwa1
„s w reprezentacji binarnej. Jeślin^k
jest złożony lubk
ma więcej niż dwa1
, wówczas przechodzi do następnej wartościk
. Jeśli przejdzie przez wszystkie wartościk
z0
wn
ten sposób, to znajdzie sięn
na liście.Z drugiej strony, jeśli istnieje wartość
k
z co najwyżej dwóch1
takich, któran^k
nie jest złożona,n
to nie jest uwzględniona na liście.źródło
Perl 6 ,
8785 bajtówZwraca wszystkie liczby, które są mniejsze lub równe liczbie wejściowej.
Jak to działa
Dla każdej liczby n od 2 do wejścia wykonuje następujące czynności:
Generuje wszystkie nieujemne liczby całkowite, które mają taką samą lub krótszą długość bitu niż n .
Filtruje liczby z tej listy, które mają ustawione mniej niż trzy bity (za pomocą wyrażenia regularnego).
XOR n dla każdej z tych liczb, dając wszystkie ważne „mutacje” n .
Pozwala n znajdować się na liście wyników tylko wtedy, gdy żadna mutacja nie jest złożona (sprawdzane przez przyjęcie każdej mutacji x modulo połączenia wszystkich liczb między 2 a x -1).
źródło
Mathematica, 115 bajtów
14 bajty zapisane dzięki @MartinEnderBardzo nieefektywny, ponieważ generuje wszystkie liczby do 2 ^ ceil (lg (n)).
Drugi kod używa U + F4A1 (
Function
funkcja)źródło
Floroid ,
95109 bajtówZwraca listę liczb odpornych na bitflip do
input - 1
. Obsługuje również trudne sytuacje (0 i 1).Floroid to mój stary język, którego używałem tylko kilka razy. Nie dotykałem go przez długi czas, stąd rozmiar programu.
Przekłada się na następujący kod Python, który moim zdaniem można zmniejszyć za pomocą rekurencji.
Każda użyta tutaj funkcja jest wstępnie zdefiniowana w Floroid. Ta strona zawiera wszystkie funkcje i ich definicje.
źródło
MATL ,
30282726 bajtówWypróbuj online!
Wysyła wszystkie liczby kompozytowe odporne na bitflip do n (włącznie) n. Korzysta z pomysłów obu rozwiązań Jelly - tylko 0 uważa za problematyczne niepierwszorzędne; i generuje najpierw listę liczb w odległości 2, a następnie przyjmuje xor.
Alternatywne rozwiązanie, zapętlając (30 bajtów):
Wysyła wszystkie liczby kompozytowe odporne na bitflip do n (włącznie) n.
źródło
CJam ,
3433 bajtyOblicza wszystkie kompozyty odporne na bitflipa dokładnie mniej niż n .
Podobnie jak Jonathan Allan, nie jestem pewien, czy rzeczywiście konieczne jest sprawdzenie 0 bitflipów. Jeśli okaże się, że żadna liczba pierwsza nie ma wszystkich wyników bitflip w liczbach zespolonych,
0+
można ją usunąć.Wypróbuj online!
Wyjaśnienie
źródło
MATL , 29 bajtów
Dzięki Jonathanowi Allanowi za korektę.
Pobiera to liczbę n i wysyła wszystkie liczby kompozytowe odporne na bitflip do n .
Jak to działa
Wypróbuj w MATL Online!
źródło