I residui quadratici sono così divertenti!


13

definizioni

Residui quadratici

Un numero intero r è chiamato un residuo quadratico modulo n se esiste un intero x tale che:

x2r(modn)

L'insieme dei residui quadratici modulo n può essere semplicemente calcolato osservando i risultati di x2modn per 0xn/2 .

La sequenza della sfida

Definiamo an il numero minimo di occorrenze dello stesso valore (r0r1+n)modn per tutte le coppie (r0,r1) di residui quadratici modulo n .

I primi 30 termini sono:

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

Questo è A316975 (inviato da me stesso).

Esempio: n=10

I residui quadratici modulo 10 sono 0 , 1 , 4 , 5 , 6 e 9 .

Per ogni coppia (r0,r1) di questi residui quadratici, calcoliamo (r0r1+10)mod10 , che porta alla seguente tabella (dove r0 è a sinistra e r1 è in alto):

014569009654111076524430985554109666521079985430

Il numero minimo di occorrenze con lo stesso valore nella tabella sopra è (per , , e ). Pertanto .22378a10=2

Il tuo compito

  • Puoi:

    • accetta un numero intero e stampa o restituisce (indicizzato 0 o indicizzato 1)nan
    • prende un numero intero e stampa o restituisce i primi termini della sequenzann
    • non inserire input e stampare la sequenza per sempre
  • Il codice deve essere in grado di elaborare uno dei primi 50 valori della sequenza in meno di 1 minuto.
  • Dato tempo e memoria sufficienti, il codice deve teoricamente funzionare per qualsiasi numero intero positivo supportato dalla tua lingua.
  • Questo è .

9
Grazie per aver pubblicato una sequenza su OEIS!
AdmBorkBork,

@AdmBorkBork Grazie. :) (È un dato di fatto, di solito evito di pubblicare una sequenza OEIS così com'è come una sfida, ma immagino che sia OK per questo.)
Arnauld

6
L' +ninterno (...)mod nnon ha alcun effetto? In tal caso è molto strano che faccia parte della definizione.
Jonathan Allan,

3
@JonathanAllan In realtà, ho fatto un'osservazione simile nella bozza della sequenza e ho suggerito che fosse stata rimossa. Ma non ho trovato alcun chiaro consenso, né ho ricevuto alcun feedback al riguardo. (E mi sembra di ricordare di aver visto altre sequenze con (some_potentially_negative_value + n) mod n.) Penso che sia meglio averlo in una sfida di programmazione, poiché il segno del risultato dipende dal linguaggio .
Arnauld,

1
Ho provato a trovare una formula diretta senza successo. La sequenza è moltiplicativa e sui numeri primi è uguale a_p = round(p/4), il che ci dà i valori per tutti i numeri quadrati liberi. Ma la situazione sembra complicata dai poteri dei numeri primi e i casi 3 mod 4 e 1 mod 4 devono essere gestiti separatamente.
xnor

Risposte:


5

MATL , 14 byte

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

Provalo online! Oppure verifica i primi 30 valori .

Spiegazione

:      % 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

4

Japt -g , 22 20 byte

Trascorse troppo tempo a capire di cosa si trattava in realtà la sfida, a corto di tempo per ulteriori golf: \

Emette il ntermine th nella sequenza. Inizia a lottare quando viene immesso >900.

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

Provalo o controlla i risultati per 0-50


Spiegazione

                  :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

4

Gelatina ,  13  10 byte

-1 grazie a Dennis (forzando l'interpretazione diadica con un leader ð)
-2 ancora grazie a Dennis (poiché le coppie possono essere deduplicate possiamo evitare un Re a 2)

ðp²%QI%ĠẈṂ

Un collegamento monadico che accetta un numero intero positivo che produce un numero intero non negativo.

Provalo online! O vedi i primi 50 termini .

Come?

ð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

3

05AB1E , 22 20 15 13 byte

LnI%êãÆI%D.m¢

-2 byte grazie a @Mr. Xcoder .

Provalo online o verifica i primi 99 casi di test (in circa 3 secondi) . (NOTA: la versione legacy di Python viene utilizzata su TIO invece della nuova riscrittura dell'Elisir. È circa 10 volte più veloce, ma richiede un trailing ¬(head) perché .mrestituisce un elenco anziché un singolo elemento, che ho aggiunto al piè di pagina.)

Spiegazione:

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)

Ýns%ÙãÆI%D.m¢. (non legacy, nella nuova versione)
Mr. Xcoder

@ Mr.Xcoder Ah, sono un idiota da usare al posto di ã..>.> E non sapevo che si .mcomportasse diversamente nella riscrittura dell'Elisir. Inizialmente avevo la nuova versione, ma sono passato all'eredità dopo aver notato che ¥non funzionava (cosa che hai risolto con Æ). Uso ancora l'eredità su TIO, perché è molto più veloce per questa sfida.
Kevin Cruijssen,

3

C (gcc) , 202 200 190 188 187 186 byte

  • Risparmiato due dodici quattordici quindici byte grazie a plafoniera .
  • Salvato un byte.
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;}

Provalo online!


@ceilingcat Cool; la dichiarazione di un altro numero intero in realtà consente di salvare un altro byte.
Jonathan Frech,

@ceilingcat Penso che quelle espressioni non siano equivalenti in quanto ho bisogno del più piccolo residuo positivo del modulo.
Jonathan Frech,


1

K (ngn / k) , 29 byte

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

Provalo online!

{ } funzione con argomento x

!xnumeri interi da 0ax-1

i: assegnato a i

x! mod x

? unico

r: assegnato a r

-\: sottrarre da ogni sinistra

r-\:r matrice di tutte le differenze

x! mod x

,/ concatenare le righe della matrice

= gruppo, restituisce un dizionario da valori univoci a elenchi di indici di occorrenza

#:' lunghezza di ciascun valore nel dizionario

&/ minimo




1

APL (Dyalog Unicode) , 28 24 byte

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

Provalo online!

Prefisso funzione diretta. usi⎕IO←0 .

Grazie a Cows quack per 4 byte!

Come:

{⌊/⊢∘≢⌸∊⍵|∘.-⍨∪⍵|×⍨⍳⍵+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.

1
Coppia di piccoli trucioli di byte, 2*⍨×⍨, r←¨⊂r∘.-⍨, {≢⍵}⊢∘≢
Kritixi Lithos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.