Les résidus quadratiques sont tellement amusants!

13

Définitions

Résidus quadratiques

Un nombre entier r est appelé un résidu quadratique modulo n s'il existe un entier x tel que:

x2r(modn)

L'ensemble des résidus quadratiques modulo peut être simplement calculé en regardant les résultats de x ^ 2 \ bmod n pour 0 \ le x \ le \ lfloor n / 2 \ rfloor .n0 x n / 2 x2modn0xn/2

La séquence du défi

Nous définissons an comme le nombre minimum d'occurrences de la même valeur (r0r1+n)modn pour toutes les paires (r0,r1) de résidus quadratiques modulo n .

Les 30 premiers termes sont:

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

C'est l' A316975 (soumis par moi-même).

Exemple: n=10

Les résidus quadratiques modulo 10 sont 0 , 1 , 4 , 5 , 6 et 9 .

Pour chaque paire (r0,r1) de ces résidus quadratiques, nous calculons (r0r1+10)mod10 , ce qui conduit au tableau suivant (où r0 est à gauche et r1 est en haut):

014569009654111076524430985554109666521079985430

Le nombre minimum d'occurrences de la même valeur dans le tableau ci-dessus est de (pour , , et ). Donc .22378a10=2

Ta tâche

  • Vous pouvez soit:

    • prendre un entier et imprimer ou retournernan (indexé 0 ou indexé 1)
    • prendre un entier et imprimer ou retourner lenn premiers termes de la séquence
    • ne prenez aucune entrée et imprimez la séquence pour toujours
  • Votre code doit pouvoir traiter l'une des 50 premières valeurs de la séquence en moins d'une minute.
  • Avec suffisamment de temps et de mémoire, votre code doit théoriquement fonctionner pour tout entier positif pris en charge par votre langage.
  • C'est du .
Arnauld
la source
9
Merci d'avoir publié une séquence sur OEIS!
AdmBorkBork
@AdmBorkBork Merci. :) (En fait, j'évite généralement de poster une séquence OEIS telle quelle comme un défi, mais je suppose que c'est OK pour celui-ci.)
Arnauld
6
L' +nintérieur (...)mod nn'a-t-il pas d'effet? Si c'est le cas, c'est très bizarre qui fait partie de la définition.
Jonathan Allan
3
@JonathanAllan En fait, j'ai fait une remarque similaire dans la version préliminaire de la séquence et suggéré qu'elle a été supprimée. Mais je n'ai trouvé aucun consensus clair, et je n'ai reçu aucun commentaire à ce sujet. (Et je semble me souvenir d'avoir vu d'autres séquences avec (some_potentially_negative_value + n) mod n.) Je pense que c'est mieux de l'avoir dans un défi de programmation, car le signe du résultat dépend du langage .
Arnauld
1
J'ai essayé de trouver une formule directe sans succès. La séquence est multiplicative et sur les nombres premiers, elle est égale a_p = round(p/4), ce qui nous donne les valeurs de tous les nombres sans carré. Mais la situation semble compliquée sur les puissances des nombres premiers, et les 3 cas mod 4 et 1 cas mod 4 doivent être traités séparément.
xnor

Réponses:

5

MATL , 14 octets

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

Essayez-le en ligne! Ou vérifiez les 30 premières valeurs .

Explication

:      % 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
la source
4

Japt -g , 22 20 octets

J'ai passé trop de temps à comprendre en quoi consistait le défi, a manqué de temps pour continuer à jouer au golf: \

Génère le ne terme dans la séquence. Commence à se débattre lors de la saisie >900.

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

Essayez-le ou vérifiez les résultats pour 0-50


Explication

                  :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
Hirsute
la source
4

Gelée ,  13  10 octets

-1 grâce à Dennis (forçant l'interprétation dyadique avec un interligne ð)
-2 plus aussi grâce à Dennis (puisque les paires peuvent être dédoublées on peut éviter un Ret un 2)

ðp²%QI%ĠẈṂ

Un lien monadique acceptant un entier positif qui donne un entier non négatif.

Essayez-le en ligne! Ou consultez les 50 premiers termes .

Comment?

ð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
la source
3

05AB1E , 22 20 15 13 octets

LnI%êãÆI%D.m¢

-2 octets grâce à @Mr. Xcoder .

Essayez-le en ligne ou vérifiez les 99 premiers cas de test (en environ 3 secondes) . (REMARQUE: la version héritée de Python est utilisée sur TIO au lieu de la nouvelle réécriture d'Elixir. Elle est environ 10 fois plus rapide, mais nécessite une fin ¬(tête) car .mrenvoie une liste au lieu d'un seul élément, que j'ai ajouté au pied de page.)

Explication:

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
la source
Ýns%ÙãÆI%D.m¢. (pas dans l'héritage, dans la nouvelle version)
M. Xcoder
@ Mr.Xcoder Ah, je suis un idiot à utiliser à la place de ã..>.> Et je ne savais pas que cela .magissait différemment dans la réécriture d'Elixir. J'avais à l'origine la nouvelle version, mais je suis passé à l'héritage après avoir remarqué que cela ¥ne fonctionnait pas (que vous avez corrigé avec le Æ). J'utilise toujours l'héritage sur TIO, car c'est beaucoup plus rapide pour ce défi.
Kevin Cruijssen
3

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

  • Enregistré deux douze quatorze quinze octets grâce au plafond .
  • Enregistré un octet.
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;}

Essayez-le en ligne!

Jonathan Frech
la source
@ceilingcat Cool; déclarer un autre entier permet en fait de sauvegarder un autre octet.
Jonathan Frech
@ceilingcat Je pense que ces expressions ne sont pas équivalentes car j'ai besoin du plus petit résidu modulo positif.
Jonathan Frech
1

Python 2 , 97 octets

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))

Essayez-le en ligne!

Chas Brown
la source
1

K (ngn / k) , 29 octets

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

Essayez-le en ligne!

{ } fonction avec argument x

!xentiers de 0àx-1

i: affecter à i

x! mod x

? unique

r: affecter à r

-\: soustraire de chaque gauche

r-\:r matrice de toutes les différences

x! mod x

,/ concaténer les lignes de la matrice

= groupe, renvoie un dictionnaire de valeurs uniques à des listes d'indices d'occurrence

#:' longueur de chaque valeur dans le dictionnaire

&/ le minimum

ngn
la source
1

APL (Dyalog Unicode) , 28 24 octets

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

Essayez-le en ligne!

Fonction directe de préfixe. Utilise ⎕IO←0.

Merci à Cows Quack pour 4 octets!

Comment:

{⌊/⊢∘≢⌸∊⍵|∘.-⍨∪⍵|×⍨⍳⍵+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é
la source
1
Quelques petits copeaux d'octets, 2*⍨×⍨, r←¨⊂r∘.-⍨, {≢⍵}⊢∘≢
user41805