Minimalne pokrycie zasad dla kwadratowego badania pozostałości kwadratowości

11

Wyzwanie

Znajdź najmniejszą osłonę zasad (np. Moduły), których zestawy kwadratowych reszt można przetestować poprzez przeglądanie tabeli, aby ostatecznie ustalić, czy dana nieujemna liczba całkowita n jest idealnym kwadratem. Wszystkie zasady muszą być mniejsze lub równe pierwiastkowi kwadratowemu z maksymalnej wartości n .

Odpowiedź z najmniejszym zestawem podstaw dla danej kategorii n wygrywa wyzwanie. (Oznacza to, że potencjalnie może być więcej niż jeden zwycięzca.) Kategorie n to:

         Category       Maximum allowed n    Maximum allowed modulus/base
    -------------    --------------------    ----------------------------
     8-bit values                     255                              15
    16-bit values                   65535                             255
    32-bit values              4294967295                           65535
    64-bit values    18446744073709551615                      4294967295

W przypadku remisu z dwoma zestawami mającymi jednakową liczność, remis trafi do zestawu mającego większą zdolność wykrywania wcześniejszych kwadratów w sekwencji.

W przypadku, gdy nie zostaną znalezione pełne okładki (co jest całkowicie prawdopodobne w przypadku kategorii 32-bitowych i 64-bitowych), zwycięzcą zostanie zestaw baz, który statystycznie lub możliwy do udowodnienia wyklucza najwyższy odsetek kwadratów (bez niepoprawnych błędów) zgłaszanie kwadratów jako niekwadratowych). Poniżej znajduje się omówienie niepełnych okładek.

tło

W wielu zastosowaniach teorii liczb pojawia się pytanie, czy jakaś liczba n jest kwadratem idealnym (0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 itd.). Jednym ze sposobów sprawdzenia, czy n jest kwadratem, jest sprawdzenie, czy floor (√n) ² = n, to znaczy, czy zaokrąglony w dół pierwiastek kwadratowy n , gdy jest kwadratem, zwraca n . Na przykład podłoga (√123) ² = 11² = 121, która nie jest 123, więc 123 nie jest kwadratowe; ale podłoga (√121) ² = 11² = 121, więc 121 jest kwadratowe. Ta metoda działa dobrze w przypadku małych liczb, zwłaszcza gdy dostępna jest sprzętowa operacja pierwiastka kwadratowego. Ale w przypadku dużych liczb (setek lub tysięcy bitów) może być bardzo wolny.

Innym sposobem sprawdzenia kwadratowości jest wykluczenie kwadratów za pomocą kwadratowych tabel reszt. Na przykład wszystkie kwadraty w podstawie 10 muszą mieć ostatnią cyfrę (jedno miejsce), która wynosi 0, 1, 4, 5, 6 lub 9. Te wartości tworzą zbiór kwadratowej reszty dla zasady 10. Więc jeśli zasada -10 liczba kończy się na 0, 1, 4, 5, 6 lub 9, wiesz, że może być kwadratowa i konieczne będzie dalsze sprawdzenie. Ale jeśli base-10 końce numer w 2, 3, 7 lub 8, wówczas można mieć pewność, że to nie kwadrat.

Spójrzmy więc na inną bazę. Wszystkie kwadraty w bazie 8 muszą kończyć się na 0, 1 lub 4, co dogodnie stanowi tylko 3 z 8 możliwości, co oznacza 37,5% szansy, że liczba losowa będzie prawdopodobnie kwadratowa, lub 62,5% szansy, że liczba losowa zdecydowanie nie będzie kwadratowa. Są to znacznie lepsze kursy niż daje podstawa 10. (I zauważ, że operacja modułu podstawy 8 jest po prostu logiczną operacją, w przeciwieństwie do modułu podstawy 10, który jest dzieleniem przez 10 z resztą.)

Czy są jeszcze lepsze bazy? Właściwie to tak. Baza 120 ma 18 możliwości (0, 1, 4, 9, 16, 24, 25, 36, 40, 49, 60, 64, 76, 81, 84, 96, 100 i 105), co stanowi tylko 15% szansa bycia kwadratem. A baza 240 jest jeszcze lepsza, z jedynie 24 możliwościami, co stanowi jedynie 10% szansy na bycie kwadratem.

Ale żadna pojedyncza zasada sama w sobie nie może definitywnie określić kwadratowości (chyba że jest większa niż maksymalna testowana liczba, co jest wyjątkowo niepraktyczne). Sama pojedyncza podstawa może jedynie wykluczyć kwadratowość; nie może jednoznacznie zweryfikować kwadratowości. Tylko starannie dobrany zestaw zasad, współpracujących ze sobą, może jednoznacznie zweryfikować kwadratowość w zakresie liczb całkowitych.

Powstaje zatem pytanie: jaki zestaw zasad tworzy minimalną osłonę, która łącznie pozwala na ostateczne odjęcie kwadratowości lub niekwadratowości?

Przykład poprawnej, ale nie minimalnej ochrony

Pokrywa 16-podstawowa pokrywa {3, 4, 5, 7, 8, 9, 11, 13, 16, 17, 19, 23, 25, 29, 31, 37} jest wystarczająca do ostatecznego określenia kwadratowości lub niekwadratności wszystkie 16-bitowe wartości od 0 do 65535. Ale nie jest to minimalna ochrona, ponieważ istnieje co najmniej jedna 15-bazowa ochrona, którą można łatwo wykryć. W rzeczywistości jest prawdopodobne, że istnieją znacznie mniejsze osłony - być może z zaledwie 6 lub 7 bazami.

Ale dla ilustracji przyjrzyjmy się testowaniu wartości próbki n przy użyciu tego 16-podstawowego zestawu okładek. Oto zestawy reszt kwadratowych dla powyższego zestawu zasad:

Base m   Quadratic residue table specific to base m
------   ----------------------------------------------------
   3     {0,1}
   4     {0,1}
   5     {0,1,4}
   7     {0,1,2,4}
   8     {0,1,4}
   9     {0,1,4,7}
  11     {0,1,3,4,5,9}
  13     {0,1,3,4,9,10,12}
  16     {0,1,4,9}
  17     {0,1,2,4,8,9,13,15,16}
  19     {0,1,4,5,6,7,9,11,16,17}
  23     {0,1,2,3,4,6,8,9,12,13,16,18}
  25     {0,1,4,6,9,11,14,16,19,21,24}
  29     {0,1,4,5,6,7,9,13,16,20,22,23,24,25,28}
  31     {0,1,2,4,5,7,8,9,10,14,16,18,19,20,25,28}
  37     {0,1,3,4,7,9,10,11,12,16,21,25,26,27,28,30,33,34,36}

Teraz przetestujmy liczbę n = 50401 przy użyciu tego zestawu zasad, przekształcając je w każdą bazę. (To nie jest najskuteczniejszy sposób badania pozostałości, ale jest wystarczający do celów wyjaśniających.) Interesuje nas miejsce 1 (zaznaczone poniżej w nawiasach):

 Base                               "Digits" in base m
   m          m^9   m^8   m^7   m^6   m^5   m^4   m^3   m^2   m^1  ( m^0 )
 ----      -----------------------------------------------------------------
   3           2     1     2     0     0     1     0     2     0   (  1 ) ✓
   4                       3     0     1     0     3     2     0   (  1 ) ✓
   5                             3     1     0     3     1     0   (  1 ) ✓
   7                                   2     6     6     6     4   (  1 ) ✓
   8                                   1     4     2     3     4   (  1 ) ✓
   9                                         7     6     1     2   (  1 ) ✓
  11                                         3     4     9     5   ( 10 )
  13                                         1     9    12     3   (  0 ) ✓
  16                                              12     4    14   (  1 ) ✓
  17                                              10     4     6   ( 13 ) ✓
  19                                               7     6    11   ( 13 )
  23                                               4     3     6   (  8 ) ✓
  25                                               3     5    16   (  1 ) ✓
  29                                               2     1    26   ( 28 ) ✓
  31                                               1    21    13   ( 26 )
  37                                                    36    30   (  7 ) ✓

Widzimy więc, że w 13 z tych zasad reszta pasuje do znanej reszty kwadratowej (nazwij to „trafieniem” w tabeli), a w 3 z tych zasad reszta nie pasuje do znanej reszty kwadratowej (nazwij to "chybienie"). Wystarczy jedna chybić, aby wiedzieć, że liczba nie jest kwadratowa, więc moglibyśmy zatrzymać się na 11, ale dla celów ilustracyjnych zbadaliśmy tutaj wszystkie 16 baz.

Przykład niepełnej ochrony

Z technicznego punktu widzenia niepełna ochrona nie jest ochroną, ale to nie ma znaczenia. Zbiór zasad {7, 8, 11, 15} prawie obejmuje wszystkie 8-bitowe wartości n od 0 do 255 poprawnie, ale nie do końca. W szczególności niepoprawnie identyfikuje 60 i 240 jako kwadratowe (są to wyniki fałszywie dodatnie) - ale poprawnie identyfikuje wszystkie rzeczywiste kwadraty (0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196 i 225) i nie czyni innych fałszywych trafień. Jest to więc zestaw 4, który prawie odnosi sukces jako rozwiązanie, ale ostatecznie zawodzi, ponieważ niepełna ochrona nie jest prawidłowym rozwiązaniem.

Dla 8-bitów n zbiór zasad {7, 8, 11, 15} jest jednym z dwóch zestawów 4 zasad, które powodują dwa błędy, i jest siedem zestawów 4 zasad, które powodują tylko jeden błąd. W rzeczywistości nie istnieją zestawy 4 zasad, które stanowią pełne i dokładne pokrycie wartości 8-bitowych. Czy potrafisz znaleźć zestaw 5 zasad, które nie powodują błędów, poprawnie pokrywając wszystkie 8-bitowe wartości? A może potrzebujesz 6 lub więcej? (Znam odpowiedź na 8-bitowe n , ale nie zamierzam jej zdradzić. Nie znam odpowiedzi na 16-bitowe, 32-bitowe lub 64-bitowe i uważam, że nawet 16- przypadku bitów nie da się rozwiązać za pomocą przeszukiwania metodą brute-force. Rozwiązanie 32-bitowych i 64-bitowych przypadków z pewnością będzie wymagać genetycznych, heurystycznych lub innych technik wyszukiwania.)

Komentarz do kryptograficznie dużych liczb

Poza liczbami 64-bitowymi - w setkach lub tysiącach cyfr binarnych - w tym przypadku bardzo przydatna jest szybka kontrola kwadratowości, nawet jeśli okładka jest niepełna (co z pewnością będzie w przypadku naprawdę dużych liczb). Jak taki test może być nadal przydatny, nawet jeśli nie jest wystarczająco decydujący? Cóż, wyobraź sobie, że miałeś wyjątkowo szybki test prostopadłości, który działał poprawnie przez 99,9% czasu i dawał fałszywe negatywy przez pozostałe 0,1% czasu i nigdy nie dawał fałszywych wyników pozytywnych. Dzięki takiemu testowi byłbyś w stanie niemal natychmiast określić niekwadratowość liczby, a następnie w wyjątkowych przypadkach niezdecydowania można zastosować wolniejszą metodę rozwiązania nieznanego w inny sposób. Zaoszczędziłoby to sporo czasu.

Na przykład zestaw {8, 11, 13, 15} jest poprawny 99,61% czasu dla 8-bitowych wartości n od 0 do 255, jest poprawny 95,98% czasu dla 16-bitowych wartości n od 0 do 65535, i jest poprawny 95,62% czasu dla 24-bitowych wartości n od 0 do 16777215. Gdy n idzie w nieskończoność, procent poprawności dla tego zestawu zasad spada, ale asymptotycznie się zbliża i nigdy nie spada poniżej 95,5944% poprawność.

Tak więc nawet ten bardzo mały zestaw 4 małych baz jest przydatny do niemal natychmiastowego zidentyfikowania około 22 spośród 23 dowolnie dużych liczb jako niekwadratowych - eliminując potrzebę dalszej kontroli tych liczb wolniejszymi metodami. Wolniejsze metody należy wówczas zastosować tylko w niewielkim odsetku przypadków, których nie można wykluczyć za pomocą tego szybkiego testu.

Warto zauważyć, że niektóre 16-bitowe bazy same osiągają lepsze niż 95%. W rzeczywistości każda z poniższych baz jest w stanie wyeliminować lepiej niż 97% wszystkich liczb do nieskończoności, ponieważ nie są kwadratowe. Kwadratowy zestaw reszt dla każdej z tych zasad może być reprezentowany jako tablica upakowanych bitów z wykorzystaniem tylko 8192 bajtów.

Oto 10 najpotężniejszych pojedynczych baz mniejszych niż 2 ^ 16:

 Rank   Base    Prime factorization       Weeds out
 ----   ------------------------------    ---------
  1.    65520 = 2^4 x 3^2 x 5 x 7 x 13      97.95%
  2.    55440 = 2^4 x 3^2 x 5 x 7 x 11      97.92%
  3.    50400 = 2^5 x 3^2 x 5^2 x 7         97.56%
  4.    52416 = 2^6 x 3^2 x 7 x 13          97.44%
  5.    61200 = 2^4 x 3^2 x 5^2 x 17        97.41%
  6.    44352 = 2^6 x 3^2 x 7 x 11          97.40%
  7.    63360 = 2^7 x 3^2 x 5 x 11          97.39%
  8.    60480 = 2^6 x 3^3 x 5 x 7           97.38%
  9.    63840 = 2^5 x 3 x 5 x 7 x 19        97.37%
 10.    54720 = 2^6 x 3^2 x 5 x 19          97.37%

Widzisz coś interesującego, co łączy wszystkie te bazy? Nie ma powodu, aby sądzić, że mogą być przydatne w połączeniu razem (może są, może nie są), ale jest tu kilka dobrych wskazówek, które podstawy mogą mieć największy wpływ na większe kategorie liczb.

Wyzwaniem boczny: Jedna z najbardziej znaczących zasad (jeśli nie najbardziej) do 2 ^ 28 wynosi 245044800, który sam może prawidłowo wyeliminować 99,67% niż kwadratów, lub od około 306 do 307 liczb losowych rzucane na niego. Można znaleźć na najbardziej wpływowych pojedynczą bazę mniej niż 2 ^ 32?

Związane z

Istnieje kilka bardzo fajnych pomysłów w poniższych pytaniach, które są ze sobą ściśle powiązane, a także kilka sztuczek mikrooptymalizacyjnych, które przyspieszają niektóre operacje. Chociaż powiązane pytania nie mają na celu znalezienia najsilniejszego zestawu zasad, idea silnych zasad jest w sposób dorozumiany kluczowa dla niektórych stosowanych tam technik optymalizacji.

Todd Lehman
źródło
W jaki sposób określisz remis bez testowania każdej liczby w danym zakresie i licząc, ile kontroli zostało w sumie wykonanych?
Martin Ender
Przyjrzę się liczności zbiorów kwadratowych reszt dla każdej zasady. Na przykład 4 jest lepszą zasadą niż 3, ponieważ tylko połowa wartości modulo 4 to reszty kwadratowe, podczas gdy dwie trzecie wartości modulo 3 to reszty kwadratowe. Zatem 4 ma większą zdolność do wcześniejszego usunięcia liczb. Najgorsza podstawa to 2, ponieważ nie można wykluczyć żadnej liczby, a najlepsza podstawa mniejsza niż 256 to 240, co jest w stanie wykluczyć 90% liczb. Może trzeba zrobić próbkowanie Monte Carlo dla naprawdę dużych baz.
Todd Lehman
Tak, to ma sens. Ale czy zdecydujesz o remisie tylko na podstawie pierwszej bazy, której prawdopodobieństwo różni się, czy jak obliczysz efektywność całego zestawu na podstawie prawdopodobieństwa? Myślę również, że prawdopodobieństwa nie są już niezależne po sprawdzeniu innych zasad.
Martin Ender
2
W przypadku dużych n przestrzeni myślę, że będę musiał zdecydować o powiązaniu na podstawie ogólnej oszacowanej wydajności, obliczonej przez pomnożenie prawdopodobieństw przewidywanych przez każdy zestaw reszt. Na przykład zasady {8,11,133,15} mają prawdopodobieństwa odpowiednio 0,375, 0,545455, 0,538462 i 0,4, które mnożą się do 0,044056. Odejmując od 1, daje to 0,955944, co bardzo ściśle zgadza się z wyczerpującym wynikiem zliczania wynoszącym 95,62%, mierzonym dla wszystkich nw [0,2 ^ 24-1].
Todd Lehman

Odpowiedzi:

7

Matematyka

Tak naprawdę niewiele wiem o teorii liczb (niestety), więc jest to dość naiwne podejście. Używam chciwego algorytmu, który zawsze dodaje bazę, która ma najwięcej błędów dla pozostałych liczb.

bits = 8
Timing[
 maxN = 2^bits - 1;
 maxBase = 2^(bits/2) - 1;
 bases = {
     #,
     Union[Mod[Range[0, Floor[#/2]]^2, #]]
     } & /@ Range[3, maxBase];
 bases = SortBy[bases, Length@#[[2]]/#[[1]] &];
 numbers = {};
 For[i = 0, i <= Quotient[maxN, bases[[1, 1]]], ++i,
  AppendTo[numbers, # + i*bases[[1, 1]]] & /@ bases[[1, 2]]
  ];
 While[numbers[[-1]] > maxN, numbers = Most@numbers];
 numbers = Rest@numbers;
 i = 0;
 cover = {bases[[1, 1]]};
 lcm = cover[[-1]];
 Print@cover[[1]];
 While[Length@numbers > maxBase,
  ++i;
  bases = DeleteCases[bases, {b_, r_} /; b\[Divides]lcm];
  (*bases=SortBy[bases,(Print[{#,c=Count[numbers,n_/;MemberQ[#[[2]],
  Mod[n,#[[1]]]]]}];c)&];*)
  bases = SortBy[
    bases,
    (
      n = Cases[numbers, n_ /; n < LCM[#[[1]], lcm]];
      Count[n, n_ /; MemberQ[#[[2]], Mod[n, #[[1]]]]]/Length@n
      ) &
    ];
  {base, residues} = bases[[1]];
  numbers = Cases[numbers, n_ /; MemberQ[residues, Mod[n, base]]];
  AppendTo[cover, base];
  lcm = LCM[lcm, base];
  Print@base
  ];
 cover
 ]

Rozwiązuje 8 bitów w krótkim czasie dzięki następującym 6 zasadom:

{12, 13, 7, 11, 5, 8}

16 bitów zajmuje 6 sekund i daje następującą 6-bazową osłonę:

{240, 247, 253, 119, 225, 37}

W większych przypadkach w podejściu tym oczywiście brakuje pamięci.

Aby przekroczyć 16 bitów, muszę wymyślić sposób sprawdzenia kompletności okładki bez faktycznego utrzymywania listy wszystkich liczb do Nmax (lub przejdź i poznaj teorię liczb).

Edycja: Skrócono czas działania 16 bitów z 66 do 8 sekund, wypełniając listę liczb tylko tymi, które nie są wykluczone przez najbardziej efektywną bazę. Powinno to również znacznie poprawić zużycie pamięci.

Edycja: Dodałem dwie niewielkie optymalizacje w celu zmniejszenia przestrzeni wyszukiwania. To nie jest jedna z oficjalnych kategorii, ale dzięki temu znalazłem 8-bazową osłonę na 24 bity w 9,3 godziny:

{4032, 3575, 4087, 3977, 437, 899, 1961, 799}

Jeśli chodzi o optymalizacje, pomijam teraz wszystkie bazy, które dzielą LCM baz już znajdujących się w pokrywie, a kiedy testuję wydajność bazy, testuję ją tylko na liczbach do LCM tej nowej bazy i wszystkich baz już mieć.

Martin Ender
źródło
1
@ToddLehman Nie wiem, czy widziałeś moje pierwsze rozwiązanie, zanim zredagowałem je z chciwym. (Spójrz na historię edycji, jeśli nie zrobiłeś.) Po prostu wybrałem bazy według ogólnego współczynnika trafień / chybień, dopóki nie uzyskałem pełnej osłony. To dało 8 zasad dla 8 bitów i 29 zasad dla 16 bitów. : D
Martin Ender
1
@ToddLehman Dzięki za testy! :) Zastanawiam się, co mogą wymyślić ludzie z faktyczną znajomością teorii liczb. Mam kilka pomysłów na przyspieszenie, więc mogłem przejść do 24 bitów, ale myślę, że muszę się skupić na stawianiu sobie nowego wyzwania na torze.
Martin Ender,
1
@ToddLehman Jest dla Ciebie 24-bitowa okładka. Już się zastanawiałem, czy mógłbym wykorzystać czynniki pierwsze, ale jeszcze nie wymyśliłem przyzwoitej heurystyki. Wszystko, co mogłem zrobić, to poprawić kolejność testowania zasad, ale nie jestem jeszcze pewien, kiedy mogę to przerwać.
Martin Ender,
1
@ToddLehman Nie musisz oznaczać mnie tagiem we własnych postach, ponieważ i tak otrzymam powiadomienie. Właśnie dlatego SE wyłącza autouzupełnianie, dopóki nie pojawią się komentarze od wielu użytkowników, w których sensowne może być adresowanie PO.
Martin Ender
1
Właśnie znalazłem 9-podstawową pokrywę dla 28 bitów: {15840, 15827, 16211, 12549, 14911, 15111, 9869, 14647, 16043}. Czas działania wynosił 36,5 minuty, przy użyciu programu C zoptymalizowanego do oceny kondycji za pomocą upakowanych operacji bitowych przy użyciu chciwego algorytmu. Ten 9-bazowy zestaw jest idealną przykrywką dla liczb mniejszych niż 2²⁸ i ma dokładność 99,999983% dla liczb w zakresie 2⁶⁴.
Todd Lehman,