Quadratische Reste machen so viel Spaß!


13

Definitionen

Quadratische Reste

Eine ganze Zahl r heißt quadratisches Residuum Modulo n wenn eine ganze Zahl x so dass:

x2r(modn)

Die Menge der quadratischen Reste modulo kann einfach berechnet werden, indem die Ergebnisse von für 0 \ le x \ le \ lfloor n / 2 \ rfloor betrachtet werden .nx2modn0xn/2

Die Challenge-Sequenz

Wir definieren an als die minimale Anzahl von Vorkommen mit demselben Wert (r0r1+n)modn für alle Paare (r0,r1) von quadratischen Resten modulo n .

Die ersten 30 Begriffe sind:

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

Dies ist A316975 (von mir eingereicht).

Beispiel: n=10

Die quadratischen Reste modulo 10 sind 0 , 1 , 4 , 5 , 6 und 9 .

Für jedes Paar (r0,r1) dieser quadratischen Reste berechnen wir (r0r1+10)mod10 , was zu der folgenden Tabelle führt (wobei r0 links und r1 oben ist):

014569009654111076524430985554109666521079985430

Die Mindestanzahl der Vorkommen mit demselben Wert in der obigen Tabelle beträgt 2 (für 2 , 3 , 7 und 8 ). Daher ist a10=2 .

Deine Aufgabe

  • Sie können entweder:

    • nimm eine ganze Zahl und gib odernan (entweder 0-indiziert oder 1-indiziert)
    • nimm eine ganze Zahl und gib das odernn ersten Terme der Sequenz aus oder geben Sie sie zurück
    • Nehmen Sie keine Eingabe und drucken Sie die Sequenz für immer
  • Ihr Code muss in der Lage sein, einen der 50 ersten Werte der Sequenz in weniger als 1 Minute zu verarbeiten.
  • Bei genügend Zeit und Speicher muss Ihr Code theoretisch für jede positive Ganzzahl funktionieren, die von Ihrer Sprache unterstützt wird.
  • Das ist .

9
Danke, dass Sie eine Sequenz auf OEIS veröffentlicht haben!
AdmBorkBork

@AdmBorkBork Danke. :) (Eigentlich vermeide ich es normalerweise, eine OEIS-Sequenz so wie sie ist als Herausforderung zu veröffentlichen, aber ich denke, das ist in diesem Fall in Ordnung.)
Arnauld,

6
Hat das +nInnere (...)mod nkeine Wirkung? Wenn ja, ist es sehr seltsam, dass dies Teil der Definition ist.
Jonathan Allan

3
@ JonathanAllan Eigentlich machte ich eine ähnliche Bemerkung im Entwurf der Sequenz und schlug vor, dass sie entfernt wurde. Aber ich habe keinen klaren Konsens gefunden und auch kein Feedback dazu erhalten. (Und ich scheine mich zu erinnern, andere Sequenzen mit gesehen zu haben (some_potentially_negative_value + n) mod n.) Ich denke, es ist besser, es in einer Programmierherausforderung zu haben, da das Vorzeichen des Ergebnisses von der Sprache abhängt .
Arnauld

1
Ich habe versucht, eine direkte Formel zu finden, ohne Erfolg. Die Folge ist multiplikativ und bei Primzahlen gleich a_p = round(p/4), was uns die Werte für alle quadrierten Zahlen gibt. Bei Primzahlen scheint die Situation jedoch kompliziert zu sein, und die Fälle 3 mod 4 und 1 mod 4 müssen separat behandelt werden.
Xnor

Antworten:



4

Japt -g , 22 20 Bytes

Zu lange gebraucht, um herauszufinden, worum es bei der Herausforderung eigentlich ging, hatte ich keine Zeit mehr für weiteres Golfen: \

Gibt den ndritten Term in der Sequenz aus. Fängt bei der Eingabe an zu kämpfen >900.

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

Probieren Sie es aus oder überprüfen Sie die Ergebnisse für 0-50


Erläuterung

                  :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

Jelly ,  13  10 Bytes

-1 dank Dennis (Erzwingen einer dyadischen Interpretation mit einem führenden ð)
-2 mehr auch dank Dennis (da die Paare möglicherweise de-dupliziert werden, können wir ein Rund ein vermeiden 2)

ðp²%QI%ĠẈṂ

Eine monadische Verknüpfung, die eine positive Ganzzahl akzeptiert, die eine nicht negative Ganzzahl ergibt.

Probieren Sie es online! Oder sehen Sie sich die ersten 50 Begriffe an .

Wie?

ð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 dank @Mr. Xcoder .

Probieren Sie es online aus oder überprüfen Sie die ersten 99 Testfälle (in ca. 3 Sekunden) . (HINWEIS: Die Python-Legacy-Version wird unter TIO anstelle des neuen Elixir-Umschreibens verwendet. Sie ist etwa 10-mal schneller, erfordert jedoch ein abschließendes ¬(head), da .meine Liste anstelle eines einzelnen Elements zurückgegeben wird, das ich der Fußzeile hinzugefügt habe.)

Erläuterung:

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¢. (Nicht im Vermächtnis, in der neuen Version)
Mr. Xcoder

@ Mr.Xcoder Ah, ich bin ein Idiot, den man benutzen kann, anstatt ã...>.> Und wusste nicht, dass sich das .mbeim Elixir-Rewrite anders verhält. Ich hatte ursprünglich die neue Version, wechselte aber zu dem Erbe, nachdem ich bemerkte, dass das ¥nicht funktionierte (was Sie mit dem behoben haben Æ). Ich verwende das Erbe immer noch auf TIO, weil es für diese Herausforderung viel schneller ist.
Kevin Cruijssen

3

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

  • Gespeichert zwei zwölf vierzehn fünfzehn Bytes dank ceilingcat .
  • Ein Byte gespeichert.
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;}

Probieren Sie es online!


@ceilingcat Cool; Wenn Sie eine andere Ganzzahl deklarieren, können Sie ein weiteres Byte speichern.
Jonathan Frech

@ceilingcat Ich denke, diese Ausdrücke sind nicht äquivalent, da ich den kleinsten positiven Modulo-Rest brauche.
Jonathan Frech


1

K (ngn / k) , 29 Bytes

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

Probieren Sie es online!

{ } Funktion mit Argument x

!xganze Zahlen von 0bisx-1

i: zuweisen i

x! mod x

? einzigartig

r: zuweisen r

-\: subtrahieren von jedem links

r-\:r Matrix aller Unterschiede

x! mod x

,/ Verketten Sie die Zeilen der Matrix

= group, gibt ein Wörterbuch von eindeutigen Werten zu Listen von Ereignisindizes zurück

#:' Länge jedes Wertes im Wörterbuch

&/ Minimum




1

APL (Dyalog Unicode) , 28 24 Bytes

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

Probieren Sie es online!

Präfix Direktfunktion. Verwendet ⎕IO←0.

Danke an Cows Quack für 4 Bytes!

Wie:

{⌊/⊢∘≢⌸∊⍵|∘.-⍨∪⍵|×⍨⍳⍵+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
Ein 2*⍨×⍨r←¨⊂r∘.-⍨{≢⍵}⊢∘≢
paar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.