¡Los residuos cuadráticos son muy divertidos!


13

Definiciones

Residuos cuadráticos

Un número entero r se llama módulo de residuo cuadrático n si existe un número entero x tal que:

x2r(modn)

El conjunto de residuos cuadráticos módulo puede calcularse simplemente observando los resultados de para 0 \ le x \ le \ lfloor n / 2 \ rfloor .nx2modn0xn/2

La secuencia del desafío

Definimos an como el número mínimo de ocurrencias del mismo valor (r0r1+n)modn para todos los pares (r0,r1) de residuos cuadráticos módulo n .

Los primeros 30 términos son:

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

Este es A316975 (presentado por mí mismo).

Ejemplo: norte=10

Los residuos cuadráticos módulo 10 son 0 0 , 1 , 4 4 , 5 5 , 6 6 y 9 9 .

Para cada par (r0 0,r1) de estos residuos cuadráticos, calculamos (r0 0-r1+10)modificación10 , que lleva a la siguiente tabla (donde r0 0 está a la izquierda y r1 está en la parte superior):

0 014 45 56 69 90 00 09 96 65 54 41110 07 76 65 524 44 430 09 985 55 55 54 410 09 96 66 66 65 5210 07 79 99 985 54 430 0

El número mínimo de ocurrencias del mismo valor en la tabla anterior es (para , , y ). Por lo tanto .2237 78un10=2

Tu tarea

  • Usted puede:

    • tome un entero e imprima o devuelva (ya sea 0 indexado o 1 indexado)norteunnorte
    • tome un entero e imprima o devuelva los primeros términos de la secuencianortenorte
    • no ingrese nada e imprima la secuencia para siempre
  • Su código debe poder procesar cualquiera de los 50 primeros valores de la secuencia en menos de 1 minuto.
  • Dado el tiempo y la memoria suficientes, su código debe funcionar teóricamente para cualquier número entero positivo admitido por su idioma.
  • Este es el .

99
¡Felicitaciones por publicar una secuencia en OEIS!
AdmBorkBork

@AdmBorkBork Gracias. :) (De hecho, generalmente evito publicar una secuencia OEIS tal como es como un desafío, pero supongo que está bien para esta.)
Arnauld

66
¿No tiene efecto el +ninterior (...)mod n? Si es así, es muy extraño que sea parte de la definición.
Jonathan Allan

3
@ JonathanAllan En realidad, hice un comentario similar en la versión borrador de la secuencia y sugerí que se eliminara. Pero no encontré ningún consenso claro, ni recibí ningún comentario al respecto. (Y creo recordar haber visto otras secuencias con (some_potentially_negative_value + n) mod n). Sin embargo, creo que es mejor tenerlo en un desafío de programación, ya que el signo del resultado depende del lenguaje .
Arnauld

1
Traté de encontrar una fórmula directa sin éxito. La secuencia es multiplicativa y en números primos es igual a_p = round(p/4), lo que nos da los valores para todos los números libres de cuadrados. Pero la situación parece complicada en los poderes de los primos, y los casos de 3 mod 4 y 1 mod 4 deben manejarse por separado.
xnor

Respuestas:


5

MATL , 14 bytes

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

Pruébalo en línea! O verifique los primeros 30 valores .

Explicación

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

Pasé demasiado tiempo averiguando de qué se trataba el desafío, se acabó el tiempo para seguir jugando al golf: \

Emite el ntérmino th en la secuencia. Comienza a luchar cuando la entrada >900.

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

Pruébalo o comprueba los resultados para 0-50


Explicación

                  :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

Jalea ,  13  10 bytes

-1 gracias a Dennis (forzando la interpretación diádica con un líder ð)
-2 más también gracias a Dennis (dado que los pares pueden ser duplicados podemos evitar una Ry a 2)

ðp²%QI%ĠẈṂ

Un enlace monádico que acepta un número entero positivo que produce un número entero no negativo.

Pruébalo en línea! O vea los primeros 50 términos .

¿Cómo?

ð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 bytes

LnI%êãÆI%D.m¢

-2 bytes gracias a @Mr. Xcoder .

Pruébelo en línea o verifique los primeros 99 casos de prueba (en aproximadamente 3 segundos) . (NOTA: La versión heredada de Python se usa en TIO en lugar de la nueva reescritura de Elixir. Es aproximadamente 10 veces más rápida, pero requiere un final ¬(encabezado) porque .mdevuelve una lista en lugar de un solo elemento, que he agregado al pie de página).

Explicación:

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¢. (no en legado, en la nueva versión)
Sr. Xcoder

@ Mr.Xcoder Ah, soy un idiota para usar en lugar de ã..>.> Y no sabía que .mactuaba de manera diferente en la reescritura de Elixir. Originalmente tenía la nueva versión, pero cambié al legado después de que noté que ¥no funcionaba (lo que solucionó con el Æ). Sin embargo, todavía uso el legado en TIO, porque es mucho más rápido para este desafío.
Kevin Cruijssen

3

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

  • Salvó dos doce catorce quince bytes gracias a ceilingcat .
  • Guardado 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;}

Pruébalo en línea!


@ceilingcat Cool; declarar otro entero realmente permite guardar otro byte.
Jonathan Frech

@ceilingcat Creo que esas expresiones no son equivalentes, ya que necesito el residuo de módulo positivo más pequeño.
Jonathan Frech


1

K (ngn / k) , 29 bytes

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

Pruébalo en línea!

{ } funcionar con argumento x

!xenteros de 0ax-1

i: asignar a i

x! modificación x

? único

r: asignar a r

-\: restar de cada izquierda

r-\:r matriz de todas las diferencias

x! modificación x

,/ concatenar las filas de la matriz

= grupo, devuelve un diccionario de valores únicos a listas de índices de ocurrencia

#:' longitud de cada valor en el diccionario

&/ mínimo




1

APL (Dyalog Unicode) , 28 24 bytes

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

Pruébalo en línea!

Función directa de prefijo. Usos ⎕IO←0.

¡Gracias a Cows quack por 4 bytes!

Cómo:

{⌊/⊢∘≢⌸∊⍵|∘.-⍨∪⍵|×⍨⍳⍵+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
Par de pequeñas virutas de bytes, 2*⍨×⍨, r←¨⊂r∘.-⍨, {≢⍵}⊢∘≢
Kritixi Lithos
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.