最小的覆盖面积,用于二次方性方差测试


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)2 = N,即是否圆形向下的平方根Ñ,平方时,还给Ñ。例如,floor(√123)²=11²= 121,它不是123,所以123不是正方形。但是楼板(√121)²=11²= 121,所以121是正方形。此方法适用于少量数字,特别是在可用硬件平方根运算的情况下。但是对于大量(数百或数千位)的数据,它可能会非常慢。

测试正方形性的另一种方法是使用二次残差表排除非正方形。例如,以10为底的所有平方必须有一个最终的(一位)数字,该数字为0、1、4、5、6或9。这些值构成以10为底的二次残差集。 -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、11、13、16、17、19、23、25、29、31、37}足以确定底角的正方形或非正方形。所有 16位值0到65535。但这不是最小覆盖率,因为至少存在一个15基覆盖率,而且很容易发现。实际上,很可能存在较小的掩护-可能只有6或7个碱基。

但为说明起见,让我们看一下使用此16基覆盖集测试n的样本值。这是上述碱基集的二次残基集:

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} 几乎正确覆盖了n的所有8位值(从0到255),但不是完全。特别是,它错误地将60和240标识为正方形(这些是误报),但会正确标识所有实际正方形(0、1、4、9、16、25、36、49、64、81, 100、121、144、169、196和225),并且没有其他误报。因此,这是一个四集式解决方案,几乎可以成功解决,但最终会失败,因为不完整的封面不是有效的解决方案。

对于8位n,基集{7、8、11、15}是产生4个错误的2组4个基中的一个,而有7个4个基的组仅产生1个错误。实际上,没有4个基数的集合构成8位值的完整而准确的覆盖。您能否找到一组5个不会产生错误的基数,正确覆盖所有8位值?还是需要6个或更多?(我确实知道8位n的答案,但是我不会放弃。我不知道16位,32位或64位的答案,而且我相信16位通过强力搜索无法解决位大小写的情况。解决32位和64位的情况肯定需要遗传,启发式或其他搜索技术。

关于密码大数的评论

除了64位数字(最多成百上千个二进制数字)之外,即使覆盖物不完整(这对于真正的大数字也是如此),这才是最方便快速进行矩形检查的地方。即使这样的测试没有足够的决定性,它怎么仍然有用呢?好吧,假设您对方形度进行了非常快速的测试,该测试在99.9%的时间内正常工作,而在剩余的0.1%的时间内给出假阴性,而从未给出假阳性。通过这样的测试,您将能够立即确定一个数的非平方性,然后在优柔寡断的情况下,您可以采用较慢的方法以另一种方式解决未知数。这样可以节省您很多时间。

例如,集合{8,11,13,15}是正确的时间的8位值99.61%Ñ从0到255,是正确的时间95.98%为16位值Ñ从0到65535,并且对于n的 24位值(从0到16777215 )正确的时间是95.62%。随着n达到无穷大,这组基数的正确性百分比下降,但是它渐近地接近并且永远不会下降到95.5944%以下正确性。

因此,即使是这很小的4个小基数集,也几乎可以立即将23个任意大的数字中的大约22个识别为非平方数,从而无需通过较慢的方法进一步检查这些数字。然后,仅在少数情况下才可以采用较慢的方法,而这种快速测试无法排除这种情况。

有趣的是,有些16位基准本身就可以达到95%以上的性能。实际上,下面的每个底基都能消除掉所有数的97%,直到达到无穷大为止,因为它们不是正方形。可以仅使用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是245044800,只有这样才能正确地淘汰非正方形的99.67%,或大约在它抛出307张随机数的306。你能找到最有影响力的单碱基小于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,与[0,2 ^ 24-1]中所有n的详尽计数结果95.62%非常吻合。
托德·雷曼

Answers:


7

Mathematica

不幸的是,我对数字理论并不了解很多,所以这是一种非常幼稚的方法。我使用的是贪心算法,该算法总是添加剩余数字丢失最多的基数。

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位需要6s,导致下面的6基覆盖:

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

对于较大的情况,此方法显然会耗尽内存。

要超过16位,我需要找出一种方法来检查覆盖是否完整,而无需实际保留所有数字的清单,直到N max(或者去学习数论)。

编辑:通过仅用最有效的基数未排除的数字预先填充数字列表,将16位的运行时间从66s减少到8s。这也应大大改善内存占用量。

编辑:我添加了两个较小的优化,以减少搜索空间。它不是官方类别之一,但是我发现它在9.3个小时内可以覆盖24位的8位基准:

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

至于优化,我现在跳过所有将封面中已有的LCM进行除法的基准,而当我测试一个基准的效率时,我只会针对不超过该新基准的LCM和我已经存在的所有基准的LCM的数字进行测试。有。


1
@ToddLehman我不知道在我用贪婪的方法编辑它之前是否看到了我的第一个方法。(如果您没有,请查看编辑历史记录。)在这里,我只是根据它们的总体命中/未命中率来选择碱基,直到我有了完整的封面。这样就产生了8个8位的碱基和29个16位的碱基。:D
Martin Ender 2014年

1
@ToddLehman感谢您的测试!:)我想知道具有实际数论知识的人会提出什么。我有一些想法可以加快速度,所以我可以达到24位,但是我认为我需要专注于使自己的下一个挑战步入正轨。
马丁·恩德

1
@ToddLehman有一个24位的封面供您选择。我已经想知道是否可以利用主要因素,但是我还没有想到像样的启发式方法。我所能做的就是改善测试基础的顺序,但是我不确定何时可以中止测试。
2014年

1
@ToddLehman您无需在我自己的帖子中标记我,因为无论如何我都会收到通知。这就是为什么SE会禁用自动补全功能,直到有多个用户发表评论,才有可能专门解决OP。
马丁·恩德

1
刚刚找到了9个基数的封面,包含28个位:{15840、15827、16211、12549、14911、15111、9869、14647、16043}。运行时间为36.5分钟,使用经过优化以使用贪心算法进行打包按位运算来评估适用性的C程序。这个9基数的套装非常适合小于2²⁸的数字,对于2⁶⁴范围内的数字,其准确度为99.999983%。
Todd Lehman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.