チャレンジ
与えられた非負整数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未満の最も影響力のある単一のベースを見つけることができますか?
関連する
以下の質問には、密接に関連するいくつかの非常に素晴らしいアイデアがあります。また、特定の操作を高速化するためのいくつかのマイクロ最適化のトリックもあります。リンクされた質問は最強の塩基のセットを見つけるために具体的に設定されていませんが、強塩基の概念はそこで使用される最適化手法のいくつかの暗黙的な中心です。