Мінімальне покриття підстав для квадратичного випробування залишків квадратності


11

Виклик

Знайдіть найменшу кришку баз (наприклад, модулів), набори квадратичних залишків яких можна перевірити за допомогою табличного пошуку, щоб остаточно визначити, чи є дане невід’ємне ціле число n ідеальним квадратом. Усі основи повинні бути меншими або рівними квадратному кореню максимального значення n .

Відповідь з найменшим набором підстав для даної категорії n виграє виклик. (Це означає, що потенційно може бути більше одного переможця.) Категоріями n є:

         Category       Maximum allowed n    Maximum allowed modulus/base
    -------------    --------------------    ----------------------------
     8-bit values                     255                              15
    16-bit values                   65535                             255
    32-bit values              4294967295                           65535
    64-bit values    18446744073709551615                      4294967295

У випадку, якщо краватка з двома множинами має рівну кардинальність, краватка перейде до безлічі, що має більшу здатність виявляти неквадрати раніше в послідовності.

У випадку, якщо не знайдеться повних обкладинок (що цілком вірогідно для 32-розрядної та 64-розрядної категорій), переможцем буде набір баз, які статистично чи доказово виключають найвищий відсоток неквадратів (без помилки звітування квадратів як неквадрати). Дивіться нижче для обговорення неповних обкладинок.

Фон

У багатьох додатках теорії чисел виникає питання, чи є якесь число n досконалим квадратом (0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 тощо). Один із способів перевірити, чи n є квадратним, - це перевірити, чи поверхня (√n) ² = n, тобто чи округлий квадратний корінь з n у квадратній формі повертає n . Наприклад, підлога (√123) ² = 11² = 121, що не 123, тому 123 не є квадратним; але підлога (√121) ² = 11² = 121, тому 121 - квадрат. Цей метод добре працює в невеликих кількостях, особливо коли доступна апаратна операція квадратного корінця. Але для великої кількості (сотні чи тисячі біт) це може бути дуже повільним.

Інший спосіб перевірити на квадратність - виключити неквадрати, використовуючи квадратичні таблиці залишків. Наприклад, усі квадрати в базі 10 повинні мати остаточну цифру (one-place), яка дорівнює 0, 1, 4, 5, 6 або 9. Ці значення утворюють набір квадратичного залишку для бази 10. Отже, якщо база -10 число закінчується на 0, 1, 4, 5, 6 або 9, ви знаєте, що воно може бути квадратним, і потрібно буде додаткове обстеження. Але якщо число базового 10 закінчується на 2, 3, 7 або 8, то ви можете бути впевнені, що воно не є квадратним.

Тож давайте подивимось на іншу базу. Усі квадрати в базі 8 повинні закінчуватися на 0, 1 або 4, що за зручністю становить лише 3 з 8 можливостей, тобто 37,5% шансу випадкового числа можливо квадратного, або 62,5% шансу випадкового числа точно не бути квадратним. Це набагато кращі шанси, ніж те, що дає база 10. (І зауважте, що операція з модулем base-8 - це просто логічна операція, на відміну від модуля base-10, що є поділом на 10 із залишком.)

Чи є ще кращі бази? Ну так, насправді. База 120 має 18 можливостей (0, 1, 4, 9, 16, 24, 25, 36, 40, 49, 60, 64, 76, 81, 84, 96, 100 і 105), що становить лише 15% ймовірність бути квадратною. А база 240 ще краща, лише 24 можливості, що становить лише 10% шансу можливо бути квадратним.

Але жодна окрема база не може остаточно визначити квадратність (якщо тільки вона не перевищує максимальну кількість, що тестується, що, очевидно, недоцільно). Одна база може виключити виключно квадратність; він не може остаточно перевірити прямоту. Тільки ретельно підібраний набір баз, працюючи разом, може остаточно перевірити квадратність у діапазоні цілих чисел.

Отже, виникає питання: Який набір баз утворює мінімальне покриття, яке разом дозволяє остаточне виведення квадратності чи неквадратності?

Приклад правильної, але не мінімальної обкладинки

Кришка 16-основної кришки {3, 4, 5, 7, 8, 9, 11, 13, 16, 17, 19, 23, 25, 29, 31, 37} достатня для остаточного визначення квадратності чи неквадратичності всі 16-бітні значення від 0 до 65535. Але це не мінімальне покриття, оскільки існує принаймні одна 15-базова кришка, яку також легко знайти. Насправді, ймовірно, є набагато менші обкладинки - можливо, з 6 та 7 базами.

Але для ілюстрації давайте подивимось на тестування вибіркового значення n за допомогою цього 16-базового набору кришки. Ось набори квадратичних залишків для вищевказаного набору баз:

Base m   Quadratic residue table specific to base m
------   ----------------------------------------------------
   3     {0,1}
   4     {0,1}
   5     {0,1,4}
   7     {0,1,2,4}
   8     {0,1,4}
   9     {0,1,4,7}
  11     {0,1,3,4,5,9}
  13     {0,1,3,4,9,10,12}
  16     {0,1,4,9}
  17     {0,1,2,4,8,9,13,15,16}
  19     {0,1,4,5,6,7,9,11,16,17}
  23     {0,1,2,3,4,6,8,9,12,13,16,18}
  25     {0,1,4,6,9,11,14,16,19,21,24}
  29     {0,1,4,5,6,7,9,13,16,20,22,23,24,25,28}
  31     {0,1,2,4,5,7,8,9,10,14,16,18,19,20,25,28}
  37     {0,1,3,4,7,9,10,11,12,16,21,25,26,27,28,30,33,34,36}

Тепер перевіримо число n = 50401 за допомогою цього набору баз, перетворивши його в кожну базу. (Це не найефективніший спосіб обстеження залишків, але його достатньо для пояснювальних цілей.) Нас тут цікавить 1 місце (позначене нижче в дужках):

 Base                               "Digits" in base m
   m          m^9   m^8   m^7   m^6   m^5   m^4   m^3   m^2   m^1  ( m^0 )
 ----      -----------------------------------------------------------------
   3           2     1     2     0     0     1     0     2     0   (  1 ) ✓
   4                       3     0     1     0     3     2     0   (  1 ) ✓
   5                             3     1     0     3     1     0   (  1 ) ✓
   7                                   2     6     6     6     4   (  1 ) ✓
   8                                   1     4     2     3     4   (  1 ) ✓
   9                                         7     6     1     2   (  1 ) ✓
  11                                         3     4     9     5   ( 10 )
  13                                         1     9    12     3   (  0 ) ✓
  16                                              12     4    14   (  1 ) ✓
  17                                              10     4     6   ( 13 ) ✓
  19                                               7     6    11   ( 13 )
  23                                               4     3     6   (  8 ) ✓
  25                                               3     5    16   (  1 ) ✓
  29                                               2     1    26   ( 28 ) ✓
  31                                               1    21    13   ( 26 )
  37                                                    36    30   (  7 ) ✓

Отже, ми можемо бачити, що в 13 з цих підстав залишок відповідає відомому квадратичному залишку (в таблиці називаємо це "ударом"), а в 3 з цих підстав залишок не відповідає відомому квадратичному залишку (називаємо це a "міс"). Все, що потрібно, - це 1 промах, щоб знати, що число не є квадратним, тому ми можемо зупинитися на 11, але для ілюстративних цілей ми розглянули всі 16 підстав тут.

Приклад неповного обкладинки

Технічно неповна обкладинка не є обкладинкою, але це вже не в питанні. Набір баз {7, 8, 11, 15} майже охоплює всі 8-бітні значення n від 0 до 255 правильно, але не зовсім. Зокрема, він неправильно ідентифікує 60 і 240 як квадратні (це помилкові позитиви), але він ідентифікує всі фактичні квадрати (0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196 та 225) і не дає жодних помилкових позитивних результатів. Таким чином, це 4-х набір, який майже вдається як рішення, але в кінцевому підсумку не вдається, оскільки неповне покриття не є правильним рішенням.

Для 8-бітових n множина баз {7, 8, 11, 15} є одним з двох наборів з 4 баз, які створюють дві помилки, і є сім наборів з 4 баз, які створюють лише одну помилку. Фактично не існує наборів з 4 баз, які б формували повне та точне покриття 8-бітних значень. Чи можете ви знайти набір із 5 баз, які не створюють помилок, правильно покриваючи всі 8-бітні значення? Або вам потрібно 6 і більше? (Я знаю відповідь на 8-бітну n , але я не збираюсь її видавати. Я не знаю відповіді для 16-розрядних, 32-розрядних або 64-бітних, і я вірю навіть 16- випадок біт неможливо вирішити шляхом грубої сили пошуку. Для вирішення 32-бітних та 64-бітних випадків, безумовно, потрібні генетичні, евристичні та інші методи пошуку.

Коментар до криптографічно великої кількості

Крім 64-розрядних чисел - в сотнях чи тисячах двійкових цифр - саме тут швидка перевірка квадратності дійсно стає найбільш зручною, навіть якщо обкладинка неповна (що, безумовно, буде для дійсно великої кількості). Як такий тест може бути корисним, навіть якщо він недостатньо визначальний? Ну, уявіть, у вас був надзвичайно швидкий тест на квадратність, який працював коректно 99,9% часу і давав помилкові негативи решту 0,1% часу і ніколи не давав помилкових позитивних результатів. За допомогою такого тесту ви зможете визначити неквадратичність числа майже миттєво, і тоді у виняткових випадках нерішучості ви можете вдатися до більш повільного методу розв'язання невідомого іншим способом. Це дозволить заощадити зовсім небагато часу.

Наприклад, множина {8, 11, 13, 15} відповідає правильному 99,61% часу для 8-бітних значень n від 0 до 255, є правильним 95,98% часу для 16-бітних значень n від 0 до 65535, і є правильним 95,62% часу для 24-бітних значень n від 0 до 16777215. Оскільки n переходить до нескінченності, відсоток правильності для цього набору баз знижується, але він асимптотично наближається і ніколи не опускається нижче 95,5944% правильність.

Тож навіть цей дуже крихітний набір із 4 невеликих підстав корисний майже негайно визначити приблизно 22 з 23 довільно великих чисел як неквадрати, що усуває необхідність подальшого огляду цих чисел повільнішими методами. Тоді повільніші методи потрібно застосовувати лише в невеликому відсотку випадків, які не вдалося виключити цим швидким тестом.

Цікаво зауважити, що деякі 16-бітні бази самостійно досягають 95%. Насправді, кожна з нижчих підстав може викорінювати краще, ніж 97% усіх чисел до нескінченності, як не квадратних. Набір квадратичного залишку для кожної з цих баз може бути представлений у вигляді упакованого бітового масиву, використовуючи лише 8192 байти.

Ось 10 найпотужніших одиночних баз менше 2 ^ 16:

 Rank   Base    Prime factorization       Weeds out
 ----   ------------------------------    ---------
  1.    65520 = 2^4 x 3^2 x 5 x 7 x 13      97.95%
  2.    55440 = 2^4 x 3^2 x 5 x 7 x 11      97.92%
  3.    50400 = 2^5 x 3^2 x 5^2 x 7         97.56%
  4.    52416 = 2^6 x 3^2 x 7 x 13          97.44%
  5.    61200 = 2^4 x 3^2 x 5^2 x 17        97.41%
  6.    44352 = 2^6 x 3^2 x 7 x 11          97.40%
  7.    63360 = 2^7 x 3^2 x 5 x 11          97.39%
  8.    60480 = 2^6 x 3^3 x 5 x 7           97.38%
  9.    63840 = 2^5 x 3 x 5 x 7 x 19        97.37%
 10.    54720 = 2^6 x 3^2 x 5 x 19          97.37%

Бачите щось цікаве, що всі ці бази мають спільне? Немає підстав вважати, що вони можуть бути корисними в поєднанні разом (можливо, вони є, можливо, їх немає), але тут є кілька хороших підказок щодо того, які бази можуть бути найбільш впливовими для більших категорій чисел.

Бічний виклик: Один з найвпливовіших баз (якщо не більшість) до 2 ^ 28 є 245044800, яка одна може правильно сапати 99.67% Не квадрати, або близько 306 307 випадкових чисел , кинутих в нього. Ви можете знайти в найбільш впливову єдину базу менш ніж 2 ^ 32?

Пов'язані

У наступних питаннях є кілька дуже приємних ідей, які тісно пов'язані, а також декілька прийомів мікрооптимізації для швидшого виконання певних операцій. Хоча пов'язані запитання конкретно не ставлять для пошуку найсильнішого набору баз, ідея про міцні основи неявно є центральною частиною використовуваних там методів оптимізації.


Як ви визначите короткий вимикач тестування кожного окремого числа у заданому діапазоні та підрахунку, скільки перевірок було зроблено загалом?
Мартін Ендер

Подивлюся на кардинальність наборів квадратичних залишків для кожної бази. Наприклад, 4 є кращою базою, ніж 3, оскільки лише половина значень модуля 4 є квадратичними залишками, тоді як дві третини значень модуля 3 є квадратичними залишками. Таким чином, 4 має більшу здатність відрізати числа раніше. Найгірша база - 2, оскільки вона не може виключати жодне число, а найкраща база менше 256 - 240, яка здатна виключати 90% чисел. Можливо, слід зробити вибірку Монте-Карло для дійсно великих баз.
Тодд Леман

Так, це має сенс. Але чи будете ви вирішувати зрівноваження лише за першою базою, ймовірність якої відрізняється, або як ви будете з'ясовувати ефективність всього набору на основі ймовірностей? Я також думаю, що ймовірності вже не є незалежними, як тільки ви перевіряли інші бази.
Мартін Ендер

2
У випадку великих n просторів, я думаю, що мені доведеться визначити рівний результат, виходячи із загальної оціночної ефективності, обчисленої шляхом множення ймовірностей, передбачених кожним набором залишків. Наприклад, бази {8,11,13,15} мають ймовірність 0,375, 0,545455, 0,538462 та 0,4 відповідно, що помножуються на 0,044056. Віднімаючи від 1, це дає 0.955944, що дуже узгоджується з вичерпним результатом підрахунку 95,62%, виміряним по всіх n в [0,2 ^ 24-1].
Тодд Леман

Відповіді:


7

Математика

Я насправді мало знаю про теорію чисел (на жаль), тому це досить наївний підхід. Я використовую жадібний алгоритм, який завжди додає базу, яка має найбільше пропусків для решти цифр.

bits = 8
Timing[
 maxN = 2^bits - 1;
 maxBase = 2^(bits/2) - 1;
 bases = {
     #,
     Union[Mod[Range[0, Floor[#/2]]^2, #]]
     } & /@ Range[3, maxBase];
 bases = SortBy[bases, Length@#[[2]]/#[[1]] &];
 numbers = {};
 For[i = 0, i <= Quotient[maxN, bases[[1, 1]]], ++i,
  AppendTo[numbers, # + i*bases[[1, 1]]] & /@ bases[[1, 2]]
  ];
 While[numbers[[-1]] > maxN, numbers = Most@numbers];
 numbers = Rest@numbers;
 i = 0;
 cover = {bases[[1, 1]]};
 lcm = cover[[-1]];
 Print@cover[[1]];
 While[Length@numbers > maxBase,
  ++i;
  bases = DeleteCases[bases, {b_, r_} /; b\[Divides]lcm];
  (*bases=SortBy[bases,(Print[{#,c=Count[numbers,n_/;MemberQ[#[[2]],
  Mod[n,#[[1]]]]]}];c)&];*)
  bases = SortBy[
    bases,
    (
      n = Cases[numbers, n_ /; n < LCM[#[[1]], lcm]];
      Count[n, n_ /; MemberQ[#[[2]], Mod[n, #[[1]]]]]/Length@n
      ) &
    ];
  {base, residues} = bases[[1]];
  numbers = Cases[numbers, n_ /; MemberQ[residues, Mod[n, base]]];
  AppendTo[cover, base];
  lcm = LCM[lcm, base];
  Print@base
  ];
 cover
 ]

Він вирішує 8 біт за один раз із наступними 6 базами:

{12, 13, 7, 11, 5, 8}

16 біт займає 6s і призводить до отримання 6-базової кришки:

{240, 247, 253, 119, 225, 37}

Для більших випадків цей підхід очевидно втрачає пам'ять.

Щоб вийти за рамки 16 бітів, мені потрібно знайти спосіб перевірити, чи обкладинка є повною, фактично не ведучи список усіх чисел до N max (або перейти та дізнатися про теорію чисел).

Редагувати: Скорочення часу виконання на 16 біт від 66 до 8 секунд шляхом попереднього заміщення списку чисел лише тими, які не виключаються найбільш ефективною базою. Це також повинно значно покращити слід пам’яті.

Редагувати: я додав дві незначні оптимізації, щоб зменшити пошуковий простір. Це не одна з офіційних категорій, але я знайшов 8-базова обкладинка на 24 біти за 9,3 години:

{4032, 3575, 4087, 3977, 437, 899, 1961, 799}

Що стосується оптимізацій, то зараз я пропускаю всі бази, які розділяють LCM баз вже в обкладинці, і коли я перевіряю ефективність бази, я лише перевіряю її на номери до LCM цієї нової бази та всіх баз, які вже є мати.


1
@ToddLehman Я не знаю, чи ти бачив моє перше рішення до того, як я його відредагував із жадібним. (Погляньте на історію редагування, якщо ви цього не зробили.) Там я лише збирав бази за загальним співвідношенням хіт / промах, поки не отримав повну обкладинку. Це дало 8 баз для 8 біт і 29 баз для 16 біт. : D
Мартін Ендер

1
@ToddLehman Дякую за тести! :) Цікаво, що можуть придумати люди з фактичними теоріями чисел. У мене є декілька ідей, щоб пришвидшити це, тому я міг би перейти до 24 біт, але, думаю, мені потрібно зосередитись на тому, щоб зробити свій власний наступний виклик на шляху.
Мартін Ендер

1
@ToddLehman Для вас є 24-бітна обкладинка. Мені вже було цікаво, чи можу я використати основні фактори, але я ще не придумав гідної евристики. Все, що я міг зробити, - це покращити порядок тестування баз, але я ще не впевнений, коли я міг би скасувати це.
Мартін Ендер

1
@ToddLehman Вам не потрібно позначати мене у своїх власних дописах, оскільки про мене все одно буде повідомлено. Ось чому SE відключає автоматичне завершення, поки не з’являться коментарі від багатьох користувачів, де може бути сенсом звертатися до ОП.
Мартін Ендер

1
Щойно знайдено 9-базове покриття на 28 біт: {15840, 15827, 16211, 12549, 14911, 15111, 9869, 14647, 16043}. Тривалість тривалості 36,5 хвилин, використовуючи програму C, оптимізовану для оцінки придатності, використовуючи пакетні операції з побітними операціями з використанням жадного алгоритму. Цей 9-базовий набір є ідеальним покриттям для чисел менше 2 кв. ⁸ і на 99,999983% точний для чисел у діапазоні 2⁶⁴.
Тодд Леман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.