Kareliğin ikinci dereceden kalıntı testi için tabanların minimum kaplaması


11

Meydan okuma

İkinci dereceden kalıntı setleri belirli bir negatif olmayan tamsayı n'ın mükemmel bir kare olup olmadığını kesin olarak belirlemek için tablo arama yoluyla test edilebilen bazların en küçük kapağını (örn., Modüller) bulun . Bazların tümü, maksimum n değerinin kare kökünden küçük veya ona eşit olmalıdır .

Belirli bir n kategorisi için en küçük baz setine verilen cevap bu mücadeleyi kazanır. (Bu, potansiyel olarak birden fazla kazanan olabileceği anlamına gelir.) N kategorileri :

         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

Eşit kardinaliteye sahip iki sete sahip bir kravat durumunda, kravat dizinin başlarında kareler olmayanları tespit etme kabiliyetine sahip olan sete gidecektir.

Tam kapak bulunmaması durumunda (32-bit ve 64-bit kategoriler için tamamen olasıdır), kazanan, istatistiksel olmayan veya muhtemelen en yüksek kareler olmayan yüzdeyi (yanlış olmadan) dışlayan temeller kümesi olacaktır. kareleri karesiz olarak bildirme). Eksik kapakların tartışılması için aşağıya bakın.

Arka fon

Birçok sayı teorisi uygulamasında, soru n sayısının mükemmel bir kare olup olmadığı ortaya çıkar (0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, vb.). Olmadığını test etmek için bir yolu n kare kat (√N) ² = n olduğunu, yuvarlak aşağı karekökü olsun ister testine olan n karesi zaman geri verir n . Örneğin, kat (√123) ² = 11² = 121, bu 123 değil, bu yüzden 123 kare değildir; ancak kat (√121) ² = 11² = 121, yani 121 kare. Bu yöntem, özellikle donanım karekök işlemi varsa, küçük sayılar için iyi çalışır. Ancak çok sayıda (yüzlerce veya binlerce bit) için çok yavaş olabilir.

Kareliği test etmenin bir başka yolu, karesel olmayan kalıntı tabloları kullanarak kareler olmayanları dışlamaktır. Örneğin, taban 10'daki tüm kareler 0, 1, 4, 5, 6 veya 9 olan bir son (tek basamaklı) rakama sahip olmalıdır. Bu değerler, taban 10 için ikinci dereceden kalıntı kümesini oluşturur. -10 sayı 0, 1, 4, 5, 6 veya 9 ile biter, bunun kare olabileceğini bilirsiniz ve daha fazla inceleme gerekecektir. Ancak, bir taban-10 sayısı 2, 3, 7 veya 8 ile biterse , bunun kare olmadığından emin olabilirsiniz .

O zaman başka bir tabana bakalım. Taban 8'deki tüm kareler 0, 1 veya 4 ile bitmelidir, bu da 8 olasılıktan sadece 3'ünde olmalıdır, yani rastgele bir sayının% 37,5 olasılıkla kare olma olasılığı veya rastgele bir sayının kesinlikle kare olma şansı% 62,5'tir. Bunlar, taban 10'un verdiğinden çok daha iyi oranlardır. (Ve bir baz-8 modül işleminin, geriye kalan 10'a bölünen baz-10 modülünün aksine, sadece mantıksal ve işlem olduğunu unutmayın.)

Daha iyi bazlar var mı? Evet, aslında. Baz 120, sadece% 15'i temsil eden 18 olasılık (0, 1, 4, 9, 16, 24, 25, 36, 40, 49, 60, 64, 76, 81, 84, 96, 100 ve 105) içerir. muhtemelen kare olma şansı. Ve taban 240 henüz daha iyidir, sadece 24 olasılıkla, sadece% 10 kare olma şansını temsil eder.

Ancak tek bir baz tek başına kareliği kesin olarak belirleyemez (test edilen maksimum sayıdan daha büyük değilse, ki bu oldukça pratik değildir). Yalnız tek bir baz sadece olabilir ekarte kareliğini; kare şeklini kesin olarak doğrulayamaz . Sadece dikkatle seçilmiş bir dizi baz, birlikte çalışarak, bir dizi tamsayı üzerindeki kareliği kesin olarak doğrulayabilir.

Böylece, soru şu olur: Hangi bazlar, birlikte kare veya kare olmayanlığın kesin olarak çıkarılmasına izin veren minimal bir örtü oluşturur?

Doğru ancak minimal olmayan bir kapak örneği

Kapak 16-temelli kapak {3, 4, 5, 7, 8, 9, 11, 13, 16, 17, 19, 23, 25, 29, 31, 37}, tüm 16 bit değerleri 65535 0 Ama değildir az en az bir 15-baz kapak zamanda kolaylıkla keşfedilebilir bulunduğundan, kapak. Aslında, muhtemelen 6 veya 7 baz kadar daha az kapsama alanı olması muhtemeldir.

Ancak gösterim amacıyla, bu 16 tabanlı kapak setini kullanarak n'nin örnek değerini test etmeye bakalım . Yukarıdaki bazlar için ikinci dereceden kalıntı setleri şunlardır:

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}

Şimdi bu baz setini kullanarak her bir tabana dönüştürerek n = 50401 sayısını test edelim . (Bu, kalıntıları incelemenin en etkili yolu değildir, ancak açıklayıcı amaçlar için yeterlidir.) Burada ilgilendiğimiz 1'in yeri (aşağıda parantez içinde belirtilmiştir):

 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 ) ✓

Bu nedenle, bu bazların 13'ünde tortunun bilinen bir kuadratik kalıntıyla eşleştiğini (buna tabloda "isabet" deyin) ve bu bazların 3'ünde tortunun bilinen bir kuadratik kalıntıyla eşleşmediğini (buna a "Özlemek"). Tek gereken bir sayının kare olmadığını bilmek için 1 özledim, bu yüzden 11'de durabiliriz, ancak açıklayıcı amaçlar için, buradaki 16 üsün tamamını inceledik.

Eksik kapak örneği

Teknik olarak, eksik bir kapak bir kapak değildir, ama bu noktanın yanındadır. {7, 8, 11, 15} baz kümesi, 0 ile 255 arasındaki n'nin tüm 8 bit değerlerini neredeyse doğru bir şekilde kapsar, ancak tam olarak değil. Özellikle, 60 ve 240'ı yanlış olarak kare olarak tanımlar (bunlar yanlış pozitiflerdir) - ancak gerçek karelerin tümünü (0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196 ve 225) ve başka yanlış pozitifler yapmaz. Bu, neredeyse bir çözüm olarak başarılı olan, ancak sonuçta başarısız olan 4 settir, çünkü eksik bir kapak geçerli bir çözüm değildir.

8-bit n için , {7, 8, 11, 15} baz seti, iki hata üreten 4 bazdan oluşan iki setten biridir ve sadece bir hata üreten 4 bazdan oluşan yedi set vardır. 8 bitlik değerlerin tam ve doğru bir kapağını oluşturan 4 baz kümesi yoktur. Tüm 8 bit değerlerini doğru şekilde kapsayan, hata vermeyen 5 taban seti bulabilir misiniz? Yoksa 6 veya daha fazlasına mı ihtiyacınız var? (8-bit n'nin cevabını biliyorum , ama vermeyeceğim. 16-bit, 32-bit veya 64-bit için cevabı bilmiyorum ve hatta 16- bit büyüklüğünün kaba kuvvet aramasıyla çözülmesi imkansızdır. 32 bit ve 64 bit kasaları çözmek kesinlikle genetik, sezgisel veya diğer arama tekniklerini gerektirecektir.)

Kriptografik olarak büyük sayılar hakkında yorum

64 bit sayıların ötesinde - yüzlerce veya binlerce ikili basamaktan - bu, kapak eksik olsa bile (kesinlikle çok büyük sayılar için olacak) hızlı bir kare denetiminin en kullanışlı olduğu yerdir. Böyle bir test, yeterince belirleyici olmasa bile yine de nasıl faydalı olabilir? Zamanın% 99.9'unda doğru çalışan ve zamanın% 0.1'inde yanlış negatifler veren ve asla yanlış pozitif vermeyen son derece hızlı bir karelik testi yaptığınızı düşünün. Böyle bir testle, bir sayının karesini neredeyse anında belirleyebilir ve daha sonra istisnai kararsızlık durumlarında, bilinmeyeni farklı bir şekilde çözmek için daha yavaş bir yönteme başvurabilirsiniz. Bu size biraz zaman kazandırır.

Örneğin, sabitlenmiş {8, 11, 13, 15} ve 8-bit değerleri için zaman% 99.61 doğru n 0 ile 255 arasında, 16-bit değerleri için zaman 95.98% doğru n 0 ila 65535 ve 24 bit değerleri için zamanın 95,62% doğrudur n den 0 16777215. As n sonsuza gider, üsleri bu set için doğruluğu yüzdesi iner, ama asimptotik yaklaşımlar ve 95,5944% altına düştüğünde asla doğruluğu.

Bu nedenle, bu çok küçük 4 küçük taban seti bile, büyük olasılıkla 23 büyük sayıdan yaklaşık 22'sini karesiz olarak tanımlamak için yararlıdır - bu sayıların daha yavaş yöntemlerle daha fazla denetlenmesi ihtiyacını ortadan kaldırır. Bu durumda, daha yavaş yöntemlerin, yalnızca bu hızlı testle göz ardı edilemeyen vakaların küçük yüzdesinde uygulanması gerekir.

Bazı 16 bitlik tabanların kendi başlarına% 95'ten daha iyi olduğunu belirtmek ilginçtir. Aslında, aşağıdaki bazların her biri, kare olmayan sonsuzluğa kadar tüm sayıların% 97'sinden daha iyi bir şekilde ayıklanabilir. Bu bazların her biri için ayarlanan kuadratik tortu, sadece 8192 bayt kullanılarak paketlenmiş bir bit dizisi olarak temsil edilebilir.

İşte 2 ^ 16'dan daha az 10 en güçlü tek baz:

 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%

Bu üslerin ortak noktası olan ilginç bir şey görüyor musunuz? Birlikte kombinasyon halinde yararlı olabileceklerini düşünmek için hiçbir neden yoktur (belki de öyledir, belki de değildir), ancak burada daha büyük sayı kategorileri için hangi tabanların en etkili olabileceğine dair bazı iyi ipuçları vardır.

Yan zorluk: en etkili üslerinden biri (yoksa 2 ^ 28'e çoğu) kadar yalnız doğru olmayan kareler 99.67% ayıklamak veya ona atılan 307 rasgele sayı 306 hakkında edebilir 245044800 vardır. Eğer bulabilir az 2 ^ 32 den en etkili tek tabanını?

İlişkili

Aşağıdaki sorularda yakından ilişkili bazı çok güzel fikirler ve belirli işlemleri daha hızlı hale getirmek için birkaç mikro optimizasyon hilesi var. Bağlantılı sorular en güçlü bazları bulmak için özel olarak ortaya çıkmamasına rağmen, güçlü bazlar fikri, orada kullanılan optimizasyon tekniklerinin bazılarının dolaylı olarak merkezindedir.


Belirli bir aralıktaki her bir sayıyı test etmek ve toplamda kaç kontrol yapıldığını saymak için tie-breaker'ı nasıl belirleyeceksiniz?
Martin Ender

Her bir üs için ikinci dereceden kalıntı setlerinin temeline bakacağım. Örneğin, 4, 3'ten daha iyi bir temeldir, çünkü modulo 4 değerlerinin sadece yarısı kuadratik kalıntılar iken, modulo 3 değerlerinin üçte ikisi kuadratik kalıntılardır. Böylece, 4 sayıları daha önce ayıklamak için daha büyük bir yeteneğe sahiptir. En kötü taban 2'dir, çünkü herhangi bir sayıyı ekarte edemez ve 256'dan az olan en iyi taban, sayıların% 90'ını dışlayabilen 240'tır. Gerçekten büyük üsler için Monte Carlo örneklemesi yapmak gerekebilir.
Todd Lehman

Evet, bu mantıklı. Ancak, kravata sadece olasılığı farklı olan ilk bazdan mı karar vereceksiniz, yoksa tüm setin verimliliğini olasılıklara göre nasıl anlayacaksınız? Ayrıca diğer üsleri kontrol ettikten sonra olasılıkların artık bağımsız olmadığını düşünüyorum.
Martin Ender

2
Büyük n boşluklar söz konusu olduğunda, her bir kalıntı setinin öngördüğü olasılıkları çarparak hesapladığımız gibi, toplam tahmini verimliliğe dayalı olarak kravata karar vermem gerekeceğini düşünüyorum. Örneğin, bazlar {8,11,13,15}, sırasıyla 0.375, 0.545455, 0.538462 ve 0.4 olasılıklarına sahiptir ve bu 0.044056 ile çarpılmaktadır. 1'den çıkarıldığında, [0,2 ^ 24-1] 'deki n'nin hepsinde ölçüldüğü gibi% 95.62'lik kapsamlı sayım sonucuna çok yakın olan 0.955944 elde edilir .
Todd Lehman

Yanıtlar:


7

Mathematica

Sayı teorisi hakkında pek bir şey bilmiyorum (ne yazık ki), bu yüzden bu oldukça naif bir yaklaşım. Her zaman kalan sayılar için en fazla özlüyor olan tabanı ekler açgözlü bir algoritma kullanıyorum.

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
 ]

Aşağıdaki 6 baz ile 8 biti anında çözer:

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

16 bit 6s alır ve aşağıdaki 6 tabanlı kapakla sonuçlanır:

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

Daha büyük vakalarda bu yaklaşımın belleği yetersiz.

16 bitin ötesine geçmek için, N max'a kadar olan tüm sayıların bir listesini tutmadan bir kapağın eksiksiz olup olmadığını kontrol etmenin bir yolunu bulmam gerekecek (veya git ve sayı teorisi hakkında bilgi edin).

Düzenleme: Sadece en etkili baz tarafından dışlanmayan numaralar listesiyle önceden doldurarak 66 bit 8s 16 bit için çalışma zamanı azaltıldı. Bu, bellek kapladığı alanı da önemli ölçüde geliştirmelidir.

Düzenleme: Arama alanını azaltmak için iki küçük optimizasyon ekledim. Resmi kategorilerden biri değil, ancak bununla 9.3 saatte 24 bitlik 8 tabanlık bir kapak buldum:

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

Optimizasyonlara gelince, zaten kapakta bulunan bazların LCM'sini bölen tüm bazları atlıyorum ve bir bazın verimliliğini test ettiğimde, sadece o yeni bazın LCM'sine kadar olan sayılara ve zaten tüm bazlara kadar test ediyorum Sahip olmak.


1
@ToddLehman Açgözlü ile düzenlemeden önce ilk çözümümü görüp görmediğinizi bilmiyorum. (Eğer yapmadıysanız düzenleme geçmişine bir göz atın.) Tam bir kapak elde edene kadar üsleri genel hit / miss oranına göre seçiyordum. Bu, 8 bit için 8 baz ve 16 bit için 29 baz verdi. : D
Martin Ender

1
@ToddLehman Testler için teşekkürler! :) Gerçek sayı teorisi bilgisine sahip insanların neler getirebileceğini merak ediyorum. Hızlandırmak için birkaç fikrim var, bu yüzden 24 bit'e gidebilirim, ancak sanırım yolda bir sonraki zorluğumu almaya odaklanmam gerekiyor.
Martin Ender

1
@ToddLehman 24 bitlik bir kapak var. Asal faktörlerden faydalanıp yararlanamayacağımı merak ediyordum, ama henüz iyi bir buluşsal yöntem bulamadım. Tek yapabileceğim, üslerin test edildiği sırayı iyileştirmek, ancak bunu ne zaman iptal edebileceğimden henüz emin değilim.
Martin Ender

1
@ToddLehman Yine de haberdar edileceğim için beni kendi yayınlarımda etiketlemenize gerek yok. Bu nedenle SE, OP'yi özel olarak ele almanın mantıklı olabileceği birden fazla kullanıcıdan gelen yorumlar bulunana kadar otomatik tamamlamayı devre dışı bırakır.
Martin Ender

1
28 bit için 9 tabanlı bir kapak buldum: {15840, 15827, 16211, 12549, 14911, 15111, 9869, 14647, 16043}. Çalışma süresi, açgözlü algoritma kullanarak paketlenmiş bitsel işlemleri kullanarak uygunluğu değerlendirmek için optimize edilmiş bir C programı kullanılarak 36.5 dakika idi. Bu 9 tabanlı set, 2²⁸'den küçük sayılar için mükemmel bir kapaktır ve 2⁶⁴ aralığındaki sayılar için% 99.999983 doğrudur.
Todd Lehman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.