角型の二次剰余検定のためのベースの最小カバー


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

等しいカーディナリティを持つ2つのセットとの同点の場合、同点は、シーケンスの早い段階で非正方形を検出する能力の高いセットに行きます。

完全なカバーが見つからない場合(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は正方形です。この方法は、特にハードウェアの平方根演算が利用可能な場合に、小さい数でうまく機能します。しかし、大きな数(数百または数千ビット)の場合、非常に遅くなる可能性があります。

直角度をテストする別の方法は、二次剰余表を使用して非正方形を除外することです。たとえば、基数10のすべての正方形には、0、1、4、5、6、または9のいずれかの最終(1桁)桁が必要です。これらの値は、基数10の2次剰余のセットを形成します。 -10の数字は0、1、4、5、6、または9で終わります。正​​方形である可能性があることわかっているため、さらに調査が必要です。しかし、2、3、7、または8でベース10数が終了する場合は、あなたがすることができ、特定のそれがあることではないの正方形。

それでは、別のベースを見てみましょう。基数8のすべての正方形は、0、1、または4で終わる必要があります。これは、8つの可能性のうち3つにすぎないため、乱数が37.5%である可能性があります。これらはベース10が与えるものよりもはるかに良いオッズです。(そして、8を底とするモジュラス演算は、10を剰余とする除算である10を底とするモジュラスとは対照的に、単純に論理AND演算であることに注意してください。)

さらに良い基盤はありますか?まあ、はい、実際に。ベース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です。しかし、少なくとも1つの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次残基と一致しません(これをaと呼びます"お嬢")。数値が非正方形であることを知るのに必要なのは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}は、2つのエラーを生成する4つの基底の2つのセットの1つであり、1つのエラーのみを生成する4つの基底の7つのセットがあります。8ビット値の完全かつ正確なカバーを形成する4つのベースのセットは実際には存在しません。エラーが発生せず、すべての8ビット値を正しくカバーする5つのベースのセットを見つけることができますか?または、6個以上必要ですか?(私は8ビットnの答えを知っていますが、それを譲るつもりはありません。16ビット、32ビット、または64ビットの答えはわかりません。総当たり検索でビットケースを解決することは不可能です。32ビットと64ビットのケースを解決するには、確かに遺伝的、発見的、またはその他の検索手法が必要です。

暗号的に大きな数値に関するコメント

64ビットの数を超えて(数百または数千の2進数まで)、カバーが不完全な場合でも(これは非常に大きな数の場合に最も確実になります)、ここでクイックスクエアネスチェックが最も便利になります。決定が不十分であっても、このようなテストはどのように役立つのでしょうか?さて、あなたは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までの最も影響力のあるベースの1つは(最大ではないにしも)245044800であり、それだけで非正方形の99.67%、または307個の乱数のうち約306個を正しく除去できます。2 ^ 32未満の最も影響力のある単一のベースを見つけることできますか?

関連する

以下の質問には、密接に関連するいくつかの非常に素晴らしいアイデアがあります。また、特定の操作を高速化するためのいくつかのマイクロ最適化のトリックもあります。リンクされた質問は最強の塩基のセットを見つけるために具体的に設定されていませんが、強塩基の概念はそこで使用される最適化手法のいくつかの暗黙的な中心です。


与えられた範囲内のすべての数字をテストし、合計で何回のチェックが行われたかをカウントするタイブレーカーをどのように決定しますか?
マーティンエンダー14

各ベースの2次剰余のセットの基数を見ていきます。たとえば、4を法とする値の半分のみが2次剰余であり、3を法とする値の3分の2は2次剰余であるため、4は3よりも優れた基数です。したがって、4には、より早く数字を取り除く能力があります。最悪のベースは2です。これは数字を除外できないためです。256未満の最良のベースは240であり、数字の90%を除外できます。非常に大きなベースに対しては、モンテカルロサンプリングが必要になる場合があります。
トッドリーマン14

ええ、それは理にかなっています。しかし、確率が異なる最初のベースだけでネクタイを決定しますか、または確率に基づいてセット全体の効率をどのように把握しますか?また、他のベースをチェックすると、確率はもはや独立していないと考えています。
マーティンエンダー14

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%の網羅的なカウント結果と非常によく一致します。
トッドリーマン14

回答:


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ビットは6秒かかり、次の6ベースのカバーになります。

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

大規模な場合、このアプローチでは明らかにメモリ不足になります。

16ビットを超えるためには、N maxまでのすべての数字のリストを実際に保持せずに、カバーが完全であるかどうかを確認する方法を見つける必要があります(または、数字の理論について学びに行きます)。

編集:数値のリストに最も効果的なベースで除外されていないもののみを事前入力することにより、16ビットの実行時間を66秒から8秒に短縮しました。これにより、メモリフットプリントも大幅に改善されます。

編集:検索スペースを削減するために、2つのマイナーな最適化を追加しました。これは公式のカテゴリの1つではありませんが、9.3時間で24ビットの8ベースのカバーを見つけました。

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

最適化に関しては、すでにカバーにあるベースのLCMを分割するすべてのベースをスキップしています。持ってる。


1
@ToddLehman私は貪欲なものでそれを編集する前に私の最初の解決策を見たかどうかわかりません。(編集履歴をご覧になっていない場合は、ご覧ください。)そこで、完全なカバーができるまで、一般的なヒット/ミス率でベースを選択していました。これにより、8ビットで8塩基、16ビットで29塩基が得られました。:D
マーティンエンダー14

1
@ToddLehmanテストをありがとう!:)実際の数論の知識を持っている人は何を思い付くのだろうか。私はそれをスピードアップするためのいくつかのアイデアを持っているので、24ビットに行くことができますが、自分の次の挑戦を軌道に乗せることに集中する必要があると思います。
マーティンエンダー14

1
@ToddLehmanあなたのために24ビットのカバーがあります。私はすでに素因数を利用できるかどうか疑問に思っていましたが、まともな発見的手法はまだ思いつきませんでした。できることは、ベースがテストされる順序を改善することだけですが、いつそれを中止できるかはまだわかりません。
マーティンエンダー14

1
@ToddLehmanとにかく通知されるので、自分の投稿にタグを付ける必要はありません。そのため、SEは複数のユーザーからコメントがあるまでオートコンプリートを無効にします。この場合、OPに具体的に対処するのが理にかなっています。
マーティンエンダー14

1
28ビットの9ベースのカバーが見つかりました:{15840、15827、16211、12549、14911、15111、9869、14647、16043}。実行時間は36.5分で、貪欲なアルゴリズムを使用したパックビット演算を使用してフィットネスを評価するために最適化されたCプログラムを使用しました。この9ベースのセットは、2²⁸未満の数字の完璧なカバーであり、2⁶⁴の範囲を超える数字の99.999983%の精度です。
トッドリーマン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.