Kwadratowe pozostałości są świetną zabawą!

13

Definicje

Kwadratowe pozostałości

Liczbą całkowitą r nazywany jest reszta kwadratowa modulo n , jeśli istnieje całkowita x takie, że:

x2r(modn)

Zbiór kwadratowych reszt modulo można łatwo obliczyć, patrząc na wyniki dla 0 \ le x \ le \ lfloor n / 2 \ rfloor .nx2modn0xn/2

Sekwencja wyzwań

Definiujemy an jako minimalną liczbę wystąpień o tej samej wartości (r0r1+n)modn dla wszystkich par (r0,r1) reszt kwadratowych modulo n .

Pierwsze 30 warunków to:

1,2,1,1,1,2,2,1,1,2,3,1,3,4,1,1,4,2,5,1,2,6,6,1,2,6,2,2,7,2

To jest A316975 (przesłane przeze mnie).

Przykład: n=10

Kwadratowe reszty modulo 10 wynoszą 0 , 1 , 4 , 5 , 6 i 9 .

Dla każdej pary (r0,r1) tych kwadratowych reszt obliczamy (r0r1+10)mod10 , co prowadzi do następującej tabeli (gdzie r0 jest po lewej stronie, a r1 jest na górze):

014569009654111076524430985554109666521079985430

Minimalna liczba wystąpień tej samej wartości w powyższej tabeli wynosi (dla , , i ). Dlatego .22378a10=2

Twoje zadanie

  • Możesz:

    • weź liczbę całkowitą i wydrukuj lub zwróć (indeksowane 0 lub indeksowane 1)nan
    • weź liczbę całkowitą i wydrukuj lub zwróć pierwsze warunki sekwencjinn
    • nie przyjmuj żadnych danych i drukuj sekwencję na zawsze
  • Twój kod musi być w stanie przetworzyć dowolną z 50 pierwszych wartości sekwencji w mniej niż 1 minutę.
  • Biorąc pod uwagę wystarczającą ilość czasu i pamięci, Twój kod musi teoretycznie działać dla każdej dodatniej liczby całkowitej obsługiwanej przez Twój język.
  • To jest .
Arnauld
źródło
9
Graty o opublikowanie sekwencji w OEIS!
AdmBorkBork
@AdmBorkBork Dzięki. :) (W rzeczywistości zwykle unikam zamieszczania sekwencji OEIS w stanie obecnym jako wyzwanie, ale myślę, że to jest w porządku w tym przypadku.)
Arnauld
6
Czy +nwnętrze (...)mod nnie ma żadnego efektu? Jeśli tak, to bardzo dziwne, że jest to część definicji.
Jonathan Allan,
3
@JonathanAllan Właściwie zrobiłem podobną uwagę w wersji roboczej sekwencji i zasugerowałem, że została usunięta. Ale nie znalazłem żadnego wyraźnego konsensusu, ani nie otrzymałem żadnej opinii na ten temat. (Wydaje mi się, że pamiętam inne sekwencje (some_potentially_negative_value + n) mod n.) Myślę, że lepiej jest mieć to w wyzwaniu programistycznym, ponieważ znak wyniku zależy od języka .
Arnauld,
1
Próbowałem znaleźć bezpośrednią formułę bez powodzenia. Sekwencja jest multiplikatywna, a na a_p = round(p/4)liczbach pierwszych jest równa , co daje nam wartości dla wszystkich liczb bez kwadratów. Ale sytuacja wydaje się skomplikowana w przypadku liczb pierwszych, a przypadki 3 mod 4 i 1 mod 4 należy rozpatrywać osobno.
xnor

Odpowiedzi:

5

MATL , 14 bajtów

:UG\u&-G\8#uX<

Wypróbuj online! Lub sprawdź pierwsze 30 wartości .

Wyjaśnienie

:      % Implicit input. Range
U      % Square, element-wise
G      % Push input again
\      % Modulo, element-wise
u      % Unique elements
&-     % Table of pair-wise differences
G      % Push input
\      % Modulo, element-wise
8#u    % Number of occurrences of each element
X<     % Minimum. Implicit display
Luis Mendo
źródło
4

Japt -g , 22 20 bajtów

Zbyt długo zastanawiałem się, na czym właściwie polega wyzwanie, zabrakło czasu na dalszą grę w golfa: \

Wysyła nth termin w sekwencji. Zaczyna walczyć, gdy dane wejściowe >900.

õ_²uUÃâ ïÍmuU
£è¥XÃn

Wypróbuj lub sprawdź wyniki dla 0-50


Wyjaśnienie

                  :Implicit input of integer U
õ                 :Range [1,U]
 _                :Map
  ²               :  Square
   uU             :  Modulo U
     Ã            :End map
      â           :Deduplicate
        ï         :Cartesian product of the resulting array with itself
         Í        :Reduce each pair by subtraction
          m       :Map
           uU     :  Absolute value of modulo U
\n                :Reassign to U
£                 :Map each X
 è                :  Count the elements in U that are
  ¥X              :   Equal to X
    Ã             :End map
     n            :Sort
                  :Implicitly output the first element in the array
Kudłaty
źródło
4

Galaretka ,  13  10 bajtów

-1 dzięki Dennis (zmuszając interpretacji dwójkowym z wiodącym ð)
-2 więcej także dzięki Dennis (od pary może być deduplikowane możemy uniknąć Ra 2)

ðp²%QI%ĠẈṂ

Łącze monadyczne przyjmujące dodatnią liczbę całkowitą, która daje nieujemną liczbę całkowitą.

Wypróbuj online! Lub zobacz pierwsze 50 warunków .

W jaki sposób?

ðp²%QI%ĠẈṂ - Link: integer, n                   e.g. 6
ð          - start a new dyadic chain - i.e. f(Left=n, Right=n)
 p         - Cartesian product of (implicit ranges)  [[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[4,1],[4,2],[4,3],[4,4],[4,5],[4,6],[5,1],[5,2],[5,3],[5,4],[5,5],[5,6],[6,1],[6,2],[6,3],[6,4],[6,5],[6,6]]
  ²        - square (vectorises)                     [[1,1],[1,4],[1,9],[1,16],[1,25],[1,36],[4,1],[4,4],[4,9],[4,16],[4,25],[4,36],[9,1],[9,4],[9,9],[9,16],[9,25],[9,36],[16,1],[16,4],[16,9],[16,16],[16,25],[16,36],[25,1],[25,4],[25,9],[25,16],[25,25],[25,36],[36,1],[36,4],[36,9],[36,16],[36,25],[36,36]]
   %       - modulo (by Right) (vectorises)          [[1,1],[1,4],[1,3],[1,4],[1,1],[1,0],[4,1],[4,4],[4,3],[4,4],[4,1],[4,0],[3,1],[3,4],[3,3],[3,4],[3,1],[3,0],[4,1],[4,4],[4,3],[4,4],[4,1],[4,0],[1,1],[1,4],[1,3],[1,4],[1,1],[1,0],[0,1],[0,4],[0,3],[0,4],[0,1],[0,0]]
    Q      - de-duplicate                            [[1,1],[1,4],[1,3],[1,0],[4,1],[4,4],[4,3],[4,0],[3,1],[3,4],[3,3],[3,0],[0,1],[0,4],[0,3],[0,0]]
     I     - incremental differences (vectorises)    [0,3,2,-1,-3,0,-1,-4,-2,1,0,-3,1,4,3,0]
      %    - modulo (by Right) (vectorises)          [0,3,2,5,3,0,5,2,4,1,0,3,1,4,3,0]
       Ġ   - group indices by value                  [[1,6,11,16],[10,13],[3,8],[2,5,12,15],[9,14],[4,7]]
        Ẉ  - length of each                          [3,2,2,4,2,2]
         Ṃ - minimum                                 2
Jonathan Allan
źródło
3

05AB1E , 22 20 15 13 bajtów

LnI%êãÆI%D.m¢

-2 bajty dzięki @Mr. Xcoder .

Wypróbuj online lub sprawdź pierwsze 99 przypadków testowych (w około 3 sekundy) . (UWAGA: Starsza wersja Pythona jest używana w TIO zamiast nowego przepisywania Elixir. Jest około 10 razy szybsza, ale wymaga trailing ¬(head), ponieważ .mzwraca listę zamiast pojedynczego elementu, który dodałem do stopki.)

Wyjaśnienie:

L       # Create a list in the range [1, (implicit) input]
 n      # Square each
  I%    # And then modulo each with the input
    ê   # Sort and uniquify the result (faster than just uniquify apparently)
 ã      # Create pairs (cartesian product with itself)
  Æ     # Get the differences between each pair
   I%   # And then modulo each with the input
D.m     # Take the least frequent number (numbers in the legacy version)
   ¢    # Take the count it (or all the numbers in the legacy version, which are all the same)
        # (and output it implicitly)
Kevin Cruijssen
źródło
Ýns%ÙãÆI%D.m¢. (nie w starszej wersji, w nowej wersji)
Pan Xcoder,
@ Mr.Xcoder Ah, jestem idiotą do użycia zamiast ã..>.> I nie wiedziałem, że .mdziałał inaczej w przepisywaniu Elixiru. Pierwotnie miałem nową wersję, ale przełączyłem się na starszą wersję po tym, jak zauważyłem, że ¥nie działa (co naprawiłeś za pomocą Æ). Nadal jednak korzystam ze spuścizny TIO, ponieważ jest o wiele szybsza w przypadku tego wyzwania.
Kevin Cruijssen
3

C (gcc) , 202 200 190 188 187 186 bajtów

  • Zaoszczędził dwa dwanaście czternaście piętnaście bajtów dzięki pułapce cat .
  • Zapisano bajt.
Q(u,a){int*d,*r,A[u],t,i[a=u],*c=i,k;for(;a--;k||(*c++=a*a%u))for(k=a[A]=0,r=i;r<c;)k+=a*a%u==*r++;for(r=c;i-r--;)for(d=i;d<c;++A[(u+*r-*d++)%u]);for(t=*A;++a<u;t=k&&k<t?k:t)k=A[a];u=t;}

Wypróbuj online!

Jonathan Frech
źródło
@ceilingcat Cool; zadeklarowanie kolejnej liczby całkowitej pozwala na zapisanie innego bajtu.
Jonathan Frech,
@ceilingcat Myślę, że te wyrażenia nie są równoważne, ponieważ potrzebuję najmniejszej dodatniej reszty modulo.
Jonathan Frech,
1

Python 2 , 97 bajtów

def f(n):r={i*i%n for i in range(n)};r=[(s-t)%n for s in r for t in r];return min(map(r.count,r))

Wypróbuj online!

Chas Brown
źródło
1

K (ngn / k) , 29 bajtów

{&/#:'=,/x!r-\:r:?x!i*i:!x}

Wypróbuj online!

{ } funkcja z argumentem x

!xliczby całkowite od 0dox-1

i: Przypisać do i

x! mod x

? wyjątkowy

r: Przypisać do r

-\: odejmij od każdego lewego

r-\:r macierz wszystkich różnic

x! mod x

,/ połącz wiersze macierzy

= grupa zwraca słownik z unikatowych wartości na listy indeksów występowania

#:' długość każdej wartości w słowniku

&/ minimum

ngn
źródło
1

APL (Dyalog Unicode) , 28 24 bajtów

{⌊/⊢∘≢⌸∊⍵|∘.-⍨∪⍵|×⍨⍳⍵+1}

Wypróbuj online!

Funkcja bezpośredniego prefiksu. Zastosowania ⎕IO←0.

Dzięki krakowi krakowi za 4 bajty!

W jaki sposób:

{⌊/⊢∘≢⌸∊⍵|∘.-⍨∪⍵|×⍨⍳⍵+1}  Dfn, argument 

                   ⍳⍵+1  Range [0..⍵]
                 ×⍨      Squared
               ⍵|        Modulo 
                        Unique
          ∘.-⍨           Pairwise subtraction table
       ∊⍵|               Modulo ⍵, flattened
                        Key; groups indices (in its ⍵) of values (in its ⍺).
   ⊢∘≢                   Tally (≢) the indices. This returns the number of occurrences of each element.
 ⌊/                       Floor reduction; returns the smallest number.
J. Sallé
źródło
1
Kilka małych wiórów bajtowych, 2*⍨×⍨, r←¨⊂r∘.-⍨, {≢⍵}⊢∘≢
41805