Квадратичні залишки - це так весело!


13

Визначення

Квадратичні залишки

Ціле число називається квадратичним модулем залишку якщо існує ціле число таке, що:rn xnx

x2r(modn)

Набір квадратичних залишків за модулем n можна просто обчислити, переглянувши результати x2modn за 0xn/2 .

Послідовність виклику

Ми визначаємо an як мінімальну кількість (r0r1+n)modn однакового значення (r_0-r_1 + n) \ bmod n для всіх пар (r0,r1) квадратичних залишків за модулем n .

Перші 30 термінів:

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

Це A316975 (подано власноруч).

Приклад: n=10

Квадратичні залишки за модулем 10 дорівнюють 0 , 1 , 4 , 5 , 6 і 9 .

Для кожної пари (r0,r1) цих квадратичних залишків обчислюємо (r0r1+10)mod10 , що веде до наступної таблиці (де r0 зліва, а r1 вгорі):

014569009654111076524430985554109666521079985430

Мінімальна кількість випадків одного і того ж значення у наведеній вище таблиці - (для , , та ). Тому .22378a10=2

Ваше завдання

  • Ви можете:

    • візьміть ціле число та надрукуйте або поверніть (або 0-індексований, або 1-індексований)nan
    • візьміть ціле число та роздрукуйте або поверніть перших доданків послідовностіnn
    • не беруть жодного вводу і друкують послідовність назавжди
  • Ваш код повинен мати можливість обробити будь-яке з 50 перших значень послідовності менше ніж за 1 хвилину.
  • Враховуючи достатньо часу та пам'яті, ваш код теоретично повинен працювати для будь-якого додатного цілого числа, підтримуваного вашою мовою.
  • Це .

9
Зрозуміло для отримання послідовності, опублікованої на OEIS!
AdmBorkBork

@AdmBorkBork Дякую :) (Власне кажучи, я зазвичай уникаю розміщення послідовності OEIS як - є викликом, але, мабуть, це нормально для цього.)
Арнольд,

6
Хіба +nвсередині це (...)mod nне впливає? Якщо так, це дуже дивно, що є частиною визначення.
Джонатан Аллан

3
@JonathanAllan Власне, я зробив аналогічне зауваження у проекті версії послідовності і запропонував її видалити. Але я не знайшов чіткого консенсусу і не отримав відгуків про це. (І я, здається, пригадую, що бачив інші послідовності з (some_potentially_negative_value + n) mod n.) Я думаю, що краще це мати в програмуванні, проте, оскільки ознака результату залежить від мови .
Арнольд

1
Я намагався знайти пряму формулу без успіху. Послідовність є мультиплікативною, а на простих a_p = round(p/4)рівнях вона дорівнює , що дає нам значення для всіх квадратних вільних чисел. Але ситуація здається складною для повноважень простих ліній, і 3 випадки 4 та 1 мод 4 випадки потрібно обробляти окремо.
xnor

Відповіді:



4

Japt -g , 22 20 байт

Занадто довго витратившись на з'ясування того, у чому полягає насправді проблема, не вистачило часу для подальшого гольфу: \

Виводить цей nдодаток у послідовності. Починає боротися при введенні >900.

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

Спробуйте або перевірте результати на 0-50


Пояснення

                  :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

Желе ,  13  10 байт

-1 завдяки Деннісу (змушує діадичну інтерпретацію з ведучими ð)
-2 ще більше завдяки Деннісу (оскільки пари можуть бути дублюються, ми можемо уникати Rі а 2)

ðp²%QI%ĠẈṂ

Монадична посилання, що приймає додатне ціле число, яке дає невід'ємне ціле число.

Спробуйте в Інтернеті! Або подивіться перші 50 термінів .

Як?

ð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 байт

LnI%êãÆI%D.m¢

-2 байти завдяки @Mr. Xcoder .

Спробуйте в Інтернеті або перевірте перші 99 тестових випадків (приблизно за 3 секунди) . (ПРИМІТКА. Спадкова версія Python використовується в TIO замість нового перезапису Elixir. Це приблизно в 10 разів швидше, але потрібен трейлінг ¬(голова), оскільки .mповертає список замість одного елемента, який я додав у колонтитул.)

Пояснення:

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¢. (не в спадщині, у новій версії)
Містер Xcoder

@ Mr.Xcoder Ах, я ідіот використовувати замість ã..>.> І не знав, як .mдіяв по-іншому в переписуванні Elixir. Спочатку у мене була нова версія, але я перейшов до спадщини після того, як я помітив, що ¥не працює (що ви виправили за допомогою Æ). Я все ще використовую спадщину на TIO, тому що це швидше для цього завдання.
Kevin Cruijssen

3

C (gcc) , 202 200 190 188 187 186 байт

  • Збережені дві книги формату в дванадцятій частці аркуша 14 п'ятнадцять байти завдяки ceilingcat .
  • Збережено байт.
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;}

Спробуйте в Інтернеті!


@ceilingcat Cool; оголошення іншого цілого числа фактично дозволяє зберегти інший байт.
Джонатан Фрех

@ceilingcat Я думаю, що ці вирази не еквівалентні, оскільки мені потрібен найменший позитивний залишок модуля.
Джонатан Фрех


1

К (нг / к) , 29 байт

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

Спробуйте в Інтернеті!

{ } функція з аргументом x

!xцілі числа від 0доx-1

i: призначити i

x! мод x

? унікальний

r: призначити r

-\: відняти з кожного зліва

r-\:r матриця всіх відмінностей

x! мод x

,/ з'єднати рядки матриці

= група, повертає словник з унікальних значень до списків індексів виникнення

#:' довжина кожного значення в словнику

&/ мінімум




1

APL (Dyalog Unicode) , 28 24 байти

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

Спробуйте в Інтернеті!

Пряма функція префікса. Використання ⎕IO←0.

Завдяки кряканню корів на 4 байти!

Як:

{⌊/⊢∘≢⌸∊⍵|∘.-⍨∪⍵|×⍨⍳⍵+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
Пара дрібних стружок у байтах, 2*⍨×⍨, r←¨⊂r∘.-⍨, {≢⍵}⊢∘≢
user41805
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.