직각도의 2 차 잔류 물 테스트를위한 최소베이스 덮개


11

도전

주어진 음이 아닌 정수 n 이 완벽한 제곱 인지 아닌지를 결정하기 위해 2 차 잔류 물 세트를 테이블 조회를 통해 테스트 할 수있는 가장 작은 염기 (예 : 모듈러스)의 덮개를 찾으십시오 . 밑은 모두 최대 값 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 . 예를 들어, floor (√123) ² = 11² = 121은 123이 아니므로 123은 정사각형이 아닙니다. 그러나 floor (√121) ² = 11² = 121이므로 121은 정사각형입니다. 이 방법은 특히 하드웨어 제곱근 작업을 사용할 수있는 경우 소수에 적합합니다. 그러나 많은 수 (수백 또는 수천 비트)의 경우 속도가 매우 느릴 수 있습니다.

제곱을 테스트하는 또 다른 방법은 2 차 잔차 테이블을 사용하여 비 제곱을 배제하는 것입니다. 예를 들어 10 진법의 모든 제곱은 0, 1, 4, 5, 6 또는 9 인 최종 (한 자리) 숫자 여야합니다.이 값은 10 진법에 대한 2 차 잔차 세트를 형성합니다. -10 숫자는 0, 1, 4, 5, 6 또는 9로 끝납니다. 정사각형 일 있으므로 추가 검사가 필요합니다. 그러나 밑이 10 인 숫자가 2, 3, 7 또는 8로 끝나는 경우 제곱 이 아닌 것을 확신 할 수 있습니다 .

다른 기지를 봅시다. 기수 8의 모든 제곱은 0, 1 또는 4로 끝나야합니다. 편리하게는 8 개 중 3 개의 가능성에 불과합니다. 이는 임의의 숫자가 제곱 일 가능성이 37.5 %이거나 임의의 숫자가 정확히 제곱이 아닐 가능성이 62.5 % 일 가능성을 의미합니다. 베이스 10이 제공하는 것보다 훨씬 좋은 확률입니다. (기본 8 모듈러스 연산은 나머지 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 개 정도의베이스로 훨씬 작은 커버가 존재할 가능성이 높습니다.

그러나 설명 을 위해이 16-베이스 커버 세트를 사용하여 샘플 값 n 을 테스트 해 봅시다 . 위의 염기 세트에 대한 2 차 잔류 물 세트는 다음과 같습니다.

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 개에서 잔류 물이 알려진 2 차 잔류 물 (표에서 "히트"라고 함)과 일치하고이 염기들 중 3 개에서 잔류 물이 알려진 2 차 잔류 물과 일치하지 않음을 알 수 있습니다. "미스"). 숫자가 정사각형이 아님을 아는 것은 1 미스입니다. 따라서 11시에 멈출 수 있습니다. 그러나 설명을 위해 여기에서는 16 개의 기본을 모두 조사했습니다.

불완전한 표지의 예

기술적으로 불완전한 표지는 표지가 아니라 요점입니다. 기본 집합 {7, 8, 11, 15} 은 0에서 255까지 의 n의 모든 8 비트 값을 거의 정확하게 다루지 만 그다지 정확하지는 않습니다. 특히 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 개의 염기가 7 개 있습니다. 실제로 8 비트 값을 완전하고 정확하게 커버하는 4 개의베이스 세트는 존재하지 않습니다. 모든 8 비트 값을 올바르게 포함하여 오류를 발생시키지 않는 5 개의 염기 세트를 찾을 수 있습니까? 아니면 6 이상이 필요합니까? (나는 8 비트 n에 대한 답을 알고 있지만 그것을 포기하지는 않을 것이다. 나는 16 비트, 32 비트 또는 64 비트에 대한 답을 모른다. 32 비트 및 64 비트 사례를 해결하려면 유전 적, 휴리스틱 또는 기타 검색 기술이 필요합니다.)

암호로 큰 숫자에 대한 의견

수백 또는 수천 개의 이진수로 된 64 비트 숫자를 넘어 서면, 커버가 불완전하더라도 (사실적으로 큰 숫자 일 것임) 빠른 제곱 검사가 가장 편리합니다. 이와 같은 테스트가 불충분하게 결정된 경우에도 어떻게 유용 할 수 있습니까? 음, 99.9 %의 시간 동안 올바르게 작동하고 나머지 0.1 %의 시간 동안 허위 음수를 제공하고 허위 양성을하지 않은 직각도에 대해 매우 빠른 테스트를 받았다고 상상해보십시오. 이러한 테스트를 통해 거의 직각이 아닌 숫자의 직각도를 파악할 수 있으며 예외적 인 예외적 인 경우에는 다른 방법으로 알 수없는 느린 방법을 사용할 수 있습니다. 이렇게하면 시간을 상당히 절약 할 수 있습니다.

예를 들어, 세트 {8, 11, 13, 15}의 8 비트 값에 대한 시간의 99.61 % 정확 N 0부터 255까지의 16 비트 값에 대한 시간의 95.98 % 정확 N 0 내지 65535, 및 24 비트 값에 대한 시간의 95.62 % 정확 N 0 16777215.로 N 무한대, 염기의 세트에 대한 정확성의 비율이 내려가는하지만 점근 적 접근법과 95.5944 % 아래로 떨어질 때 결코 단정.

따라서이 4 개의 작은베이스로 구성된이 매우 작은 세트조차도 임의로 23 개 중 22 개가 정사각형이 아닌 것으로 거의 즉시 식별하는 데 유용합니다. 더 느린 방법으로 해당 숫자를 추가로 검사 할 필요가 없습니다. 느린 방법은이 빠른 테스트로 배제 할 수없는 적은 비율의 경우에만 적용하면됩니다.

일부 16 비트베이스는 자체적으로 95 % 이상을 달성한다는 점이 흥미 롭습니다. 실제로, 아래의 각 염기는 모든 숫자의 97 % 이상을 정사각형이 아닌 무한대까지 제거 할 수 있습니다. 이러한 각 염기에 대해 2 차 잔차 세트는 8192 바이트 만 사용하여 압축 비트 배열로 표시 될 수 있습니다.

다음은 2 ^ 16보다 적은 10 개의 가장 강력한 단일 기지입니다.

 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이 가장)까지 혼자 올바르게 비 사각형의 99.67 %를 걸러, 또는 그것을 던져 307 개 임의의 숫자 306에 대한 수 245,044,800입니다. 당신은 찾을 수 적은 2 ^ 32에 비해 가장 영향력있는 하나의 기반을?

관련

다음 질문에는 밀접하게 관련된 몇 가지 훌륭한 아이디어와 특정 작업을 더 빠르게 수행하기위한 몇 가지 마이크로 최적화 트릭이 있습니다. 링크 된 질문이 가장 강력한베이스 세트를 찾기 위해 구체적으로 제시되지는 않았지만, 강한베이스의 아이디어는 암시 적으로 여기에 사용 된 일부 최적화 기술의 핵심입니다.


주어진 범위의 모든 단일 숫자를 테스트하지 않고 총 점검 횟수를 세는 타이 브레이커를 어떻게 결정할 것입니까?
Martin Ender

각 염기에 대한 2 차 잔차 세트의 카디널리티를 살펴 보겠습니다. 예를 들어, 모듈로 4 값의 절반 만이 2 차 잔기 인 반면 모듈로 3 값의 2/3는 2 차 잔기이기 때문에, 4는 3보다 나은 염기입니다. 따라서 4는 더 일찍 숫자를 제거하는 더 큰 능력을 가지고 있습니다. 그것은 배제 할 수 없기 때문에 최악의베이스는 2, 임의의 숫자, 숫자의 90 %를 배제 할 수 미만 256 240 최고의 기반을. 실제로 큰 염기에 대해 Monte Carlo 샘플링을 수행해야 할 수도 있습니다.
토드 리먼

그래, 그 말이 맞아 그러나 확률이 다른 첫 번째 염기만으로 동점을 결정할 것입니까, 아니면 확률을 기반으로 전체 세트의 효율성을 어떻게 알 수 있습니까? 또한 다른 기지를 확인하면 확률이 더 이상 독립적이지 않다고 생각합니다.
Martin Ender

2
n 공간 이 큰 경우에는 각 잔차 세트로 예측 된 확률을 곱하여 계산 한 전체 추정 효율을 기준으로 동점을 결정해야한다고 생각합니다. 예를 들어, 염기 {8,11,13,15}는 각각 0.375, 0.545455, 0.538462 및 0.4의 확률을 가지며 0.044056으로 곱합니다. 1에서 빼면 0.955944가되는데, 이는 [0,2 ^ 24-1]의 모든 n 에 대해 측정 된 95.62 %의 총 계산 결과와 매우 일치합니다 .
Todd Lehman

답변:


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
 ]

다음 6 개의베이스로 8 비트를 한 번에 해결합니다.

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

16 비트는 6 초가 걸리며 다음과 같은 6베이스 커버가됩니다.

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

더 큰 경우에는이 방법에 메모리가 부족합니다.

16 비트를 넘어가려면 실제로 모든 숫자의 목록을 최대 Nmax 까지 유지하지 않고 덮개가 완전한지 확인하는 방법을 찾아야합니다 (또는 숫자 이론에 대해 배우십시오).

편집 : 가장 효과적인 기준으로 배제되지 않은 숫자 목록 만 미리 채워서 16 비트의 런타임을 66 초에서 8 초로 줄였습니다. 또한 메모리 풋 프린트를 크게 개선해야합니다.

편집 : 검색 공간을 줄이기 위해 두 가지 작은 최적화를 추가했습니다. 공식 카테고리 중 하나는 아니지만 9.3 시간 동안 24 비트 8 비트 커버를 찾았습니다.

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

최적화에 관해서는, 나는 이미 표지에있는 기본 LCM을 나누는 모든 기본을 건너 뜁니다. 기본의 효율성을 테스트 할 때 새 기본의 LCM까지의 숫자와 이미 모든 기본에 대해서만 테스트합니다 있다.


1
@ToddLehman 탐욕스러운 솔루션으로 편집하기 전에 첫 번째 솔루션을 보았는지 모르겠습니다. (그렇지 않으면 편집 히스토리를 살펴보십시오.) 거기에서 나는 완전한 커버를 가질 때까지 일반적인 적중 / 미스 비율로베이스를 선택했습니다. 그 결과 8 비트의 경우 8 개, 16 비트의 경우 29 개가 생성되었습니다. : D
Martin Ender

1
@ToddLehman 테스트 주셔서 감사합니다! :) 나는 실제 숫자 이론 지식을 가진 사람들이 무엇을 생각해 낼지 궁금합니다. 속도를 높일 수있는 몇 가지 아이디어가 있으므로 24 비트로 이동할 수는 있지만 다음 번 도전에 집중해야한다고 생각합니다.
Martin Ender

1
@ToddLehman 24 비트 커버가 있습니다. 나는 주요한 요소를 활용할 수 있는지 이미 궁금했지만, 아직 괜찮은 휴리스틱을 찾지 못했습니다. 내가 할 수있는 것은베이스가 테스트되는 순서를 개선하는 것입니다. 그러나 언제 중단 할 수 있는지 확실하지 않습니다.
Martin Ender

1
@ToddLehman 어쨌든 알림을 받으므로 내 게시물에 나를 태그 할 필요가 없습니다. 이것이 바로 여러 사용자의 의견이있을 때까지 SE가 자동 완성 기능을 비활성화하는 이유입니다.
Martin Ender

1
28 비트에 대한 9-베이스 커버를 찾았습니다 : {15840, 15827, 16211, 12549, 14911, 15111, 9869, 14647, 16043}. 욕심 알고리즘을 사용하여 압축 비트 단위 연산을 사용하여 적합성을 평가하도록 최적화 된 C 프로그램을 사용하여 런타임은 36.5 분이었습니다. 이 9-베이스 세트는 2²⁸ 미만의 숫자를 완벽하게 커버하며 2⁶⁴ 범위의 숫자에 대해서는 99.999983 % 정확도입니다.
Todd Lehman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.