ฝาครอบฐานที่เล็กที่สุดสำหรับการทดสอบกำลังสองตกค้างของฉากสี่เหลี่ยม


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เป็นตารางคือการทดสอบไม่ว่าจะเป็นชั้น (√n) ² = n, ที่อยู่, ไม่ว่าจะโค้งมนลงรากที่สองของnเมื่อยืดให้กลับ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 ซึ่งสะดวกเพียง 3 จาก 8 โอกาสซึ่งหมายถึงโอกาส 37.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-base cover {3, 4, 5, 7, 8, 9, 11, 13, 16, 17, 19, 23, 25, 29, 31, 37} เพียงพอที่จะกำหนดฉากหรือไม่ใช่ฉากของค่า 16 บิตทั้งหมด 0 ถึง 65535 แต่มันไม่ได้เป็นปกที่น้อยที่สุดเพราะมีอย่างน้อย 15 ฐานที่มีอยู่ที่สามารถค้นพบได้ง่าย ในความเป็นจริงเป็นไปได้ว่ามีผ้าคลุมขนาดเล็กกว่าอยู่อาจจะมีเพียงแค่ 6 หรือ 7 ฐานเท่านั้น

แต่สำหรับภาพประกอบลองดูที่การทดสอบค่าตัวอย่างของnโดยใช้ชุดฝาครอบ 16 ฐานนี้ นี่คือเซตของการตกค้างกำลังสองสำหรับชุดฐานด้านบน:

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 ฐานเหล่านี้ส่วนที่เหลือไม่ตรงกับส่วนที่เหลือกำลังสองที่รู้จักกัน "นางสาว"). ทั้งหมดนี้ใช้เวลาแค่ 1 พลาดที่จะรู้ว่ามีจำนวนที่ไม่ใช่สแควร์ดังนั้นเราสามารถหยุดที่ 11 แต่เพื่อวัตถุประสงค์ในการอธิบายเราได้ตรวจสอบทั้ง 16 ฐานที่นี่

ตัวอย่างของใบปะหน้าที่ไม่สมบูรณ์

ในทางเทคนิคฝาปิดที่ไม่สมบูรณ์ไม่ได้เป็นฝาครอบ แต่อยู่ข้างจุด ชุดฐาน {7, 8, 11, 15} เกือบจะครอบคลุมค่า 8 บิตทั้งหมดของnจาก 0 ถึง 255 อย่างถูกต้อง แต่ไม่มาก โดยเฉพาะอย่างยิ่งมันระบุอย่างไม่ถูกต้อง 60 และ 240 เป็นสี่เหลี่ยมจัตุรัส (นี่คือผลบวกปลอม) - แต่มันจะระบุสี่เหลี่ยมจริงทั้งหมดได้อย่างถูกต้อง (0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 81, 100, 121, 144, 169, 196 และ 225) และทำให้ไม่มีผลบวกปลอมอื่น ๆ ดังนั้นนี่คือชุดที่ 4 ซึ่งเกือบจะประสบความสำเร็จในการแก้ปัญหา แต่ล้มเหลวในที่สุดเพราะฝาปิดที่ไม่สมบูรณ์ไม่ใช่โซลูชันที่ถูกต้อง

สำหรับ 8 บิตnชุดฐาน {7, 8, 11, 15} เป็นหนึ่งในสองชุดฐาน 4 ที่สร้างข้อผิดพลาดสองและมีเจ็ดชุดฐาน 4 ที่สร้างข้อผิดพลาดเดียวเท่านั้น ไม่มีชุดฐาน 4 จริงซึ่งเป็นรูปแบบที่สมบูรณ์และถูกต้องของค่า 8 บิต คุณสามารถหาชุด 5 ฐานที่ไม่มีข้อผิดพลาดครอบคลุมค่า 8 บิตทั้งหมดอย่างถูกต้องหรือไม่ หรือคุณต้องการ 6 หรือมากกว่า? (ฉันรู้คำตอบสำหรับ 8 บิตnแต่ฉันจะไม่แจกมันฉันไม่ทราบคำตอบสำหรับ 16 บิต 32 บิตหรือ 64 บิตและฉันเชื่อว่าแม้แต่ 16 - กรณีบิตเป็นไปไม่ได้ที่จะแก้ไขผ่านการค้นหาแบบ brute-force การแก้กรณีแบบ 32 บิตและ 64 บิตจะต้องใช้วิธีพันธุกรรมการแก้ปัญหาหรือการค้นหาอื่น ๆ อย่างแน่นอน)

ความคิดเห็นเกี่ยวกับตัวเลขที่มีขนาดใหญ่เข้ารหัส

นอกเหนือจากตัวเลข 64 บิต - เป็นเลขฐานสองหลักร้อยหรือหลักพัน - นี่คือที่การตรวจสอบฉากอย่างรวดเร็วเข้ามามีประโยชน์มากที่สุดแม้ว่าฝาจะไม่สมบูรณ์ (ซึ่งแน่นอนที่สุดจะเป็นตัวเลขขนาดใหญ่) การทดสอบเช่นนี้จะมีประโยชน์อย่างไรถึงจะเป็นการชี้ขาดที่ไม่เพียงพอ? ลองจินตนาการว่าคุณมีการทดสอบที่รวดเร็วอย่างมากสำหรับฉากที่ทำงานอย่างถูกต้อง 99.9% ของเวลาและให้ค่าลบที่ผิดพลาด 0.1% ของเวลาและไม่เคยให้ผลบวกปลอม ด้วยการทดสอบเช่นนี้คุณจะสามารถกำหนดจำนวนที่ไม่ได้เป็นเลขสัมผัสได้เกือบจะทันทีและจากนั้นในกรณีที่มีความไม่เด็ดขาดคุณสามารถหันไปใช้วิธีที่ช้าลงเพื่อแก้ไขสิ่งที่ไม่รู้จักในแบบที่ต่างออกไป สิ่งนี้จะช่วยให้คุณประหยัดเวลาได้มาก

ตัวอย่างเช่นชุด {8, 11, 13, 15} ถูกต้อง 99.61% ของเวลาสำหรับค่า 8 บิตของnจาก 0 ถึง 255 ถูกต้อง 95.98% ของเวลาสำหรับค่า 16 บิตของnจาก 0 ถึง 65535 และถูกต้อง 95.62% ของเวลาสำหรับค่า 24 บิตของnจาก 0 ถึง 16777215 ขณะที่nไปไม่มีที่สิ้นสุดเปอร์เซ็นต์ของความถูกต้องสำหรับชุดฐานนี้จะลดลง ความถูกต้อง

ดังนั้นแม้แต่ชุดเล็ก ๆ 4 ฐานขนาดเล็กนี้ก็ยังมีประโยชน์ในการระบุจำนวนประมาณ 22 จาก 23 ในขณะที่ไม่ใช่สแควร์สได้โดยทันที วิธีการที่ช้ากว่านั้นจะต้องใช้ในกรณีที่ไม่สามารถตัดออกได้ด้วยการทดสอบด่วนนี้

เป็นที่น่าสนใจที่จะทราบว่าฐาน 16 บิตบางแห่งสามารถทำได้ดีกว่า 95% ทั้งหมดด้วยตนเอง ในความเป็นจริงแต่ละฐานด้านล่างสามารถกำจัดวัชพืชได้ดีกว่า 97% ของจำนวนทั้งหมดจนถึงจำนวนไม่ จำกัด ชุดกำลังสองตกค้างสำหรับแต่ละฐานเหล่านี้สามารถแสดงเป็นอาร์เรย์ที่บรรจุบิตโดยใช้เพียง 8192 ไบต์

นี่คือ 10 ฐานที่ทรงพลังที่สุดเดียวที่น้อยกว่า 2 ^ 16:

 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% ของสี่เหลี่ยมไม่ใช่หรือประมาณ 306 307 ตัวเลขสุ่มโยนไปที่มัน คุณสามารถหาที่มีอิทธิพลมากที่สุดฐานเดียวน้อยกว่า 2 ^ 32?

ที่เกี่ยวข้อง

มีแนวคิดที่ดีมากในคำถามต่อไปนี้ที่เกี่ยวข้องอย่างใกล้ชิดรวมถึงเทคนิคการเพิ่มประสิทธิภาพขนาดเล็กหลายประการเพื่อให้การดำเนินการบางอย่างรวดเร็วขึ้น แม้ว่าคำถามที่เชื่อมโยงนั้นไม่ได้กำหนดไว้เป็นพิเศษเพื่อค้นหาชุดฐานที่แข็งแกร่งที่สุด แต่แนวคิดของฐานที่แข็งแกร่งนั้นเป็นศูนย์กลางของเทคนิคการปรับให้เหมาะสมบางอย่างที่ใช้


คุณจะพิจารณา tie-breaker สั้น ๆ ของการทดสอบทุกหมายเลขเดียวในช่วงที่กำหนดและการนับจำนวนเช็ครวมทั้งหมดได้อย่างไร
Martin Ender

ฉันจะดูความสำคัญของเซตของเศษตกค้างกำลังสองสำหรับแต่ละฐาน ตัวอย่างเช่น 4 เป็นฐานที่ดีกว่า 3 เนื่องจากค่าโมดูโล 4 มีเพียงครึ่งเดียวที่เหลือเป็นกำลังสองในขณะที่สองในสามของค่าโมดูโล 3 เป็นเศษกำลังสอง ดังนั้น 4 มีความสามารถมากขึ้นในการกำจัดหมายเลขก่อนหน้านี้ ฐานที่เลวร้ายที่สุดคือ 2 เพราะไม่สามารถแยกแยะตัวเลขใด ๆ ได้และฐานที่ดีที่สุดที่น้อยกว่า 256 คือ 240 ซึ่งสามารถพิจารณาจำนวน 90% ได้ อาจต้องทำการสุ่มตัวอย่าง Monte Carlo สำหรับฐานขนาดใหญ่จริงๆ
ทอดด์เลห์แมน

ใช่มันสมเหตุสมผลแล้ว แต่คุณจะตัดสินความเสมอกันโดยฐานแรกที่ความน่าจะเป็นต่างกันหรือคุณจะหาประสิทธิภาพของเซตทั้งหมดตามความน่าจะเป็นได้อย่างไร ฉันยังคิดว่าความน่าจะเป็นไม่ได้เป็นอิสระอีกต่อไปเมื่อคุณตรวจสอบฐานอื่น ๆ
Martin Ender

2
ในกรณีที่มีขนาดใหญ่nช่องว่างผมคิดว่าผมจะต้องตัดสินใจผูกอยู่บนพื้นฐานของประสิทธิภาพการประมาณโดยรวมคำนวณโดยคูณความน่าจะเป็นที่คาดการณ์โดยแต่ละชุดตกค้าง ตัวอย่างเช่นฐาน {8,11,13,15} มีความน่าจะเป็น 0.375, 0.545455, 0.538462 และ 0.4 ตามลำดับซึ่งคูณด้วย 0.044056 การลบออกจาก 1 จะให้ 0.955944 ซึ่งเห็นด้วยอย่างใกล้ชิดกับผลการนับอย่างละเอียดถึง 95.62% ซึ่งวัดได้จากnทั้งหมดใน [0,2 ^ 24-1]
ทอดด์เลห์แมน

คำตอบ:


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
 ]

มันแก้ปัญหา 8 บิตในเวลาไม่นานด้วย 6 ฐานต่อไปนี้:

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

16 บิตใช้เวลา 6s และให้ผลลัพธ์ในฝาครอบฐาน 6 ต่อไปนี้:

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

สำหรับกรณีที่มีขนาดใหญ่กว่าวิธีนี้เห็นได้ชัดว่าหน่วยความจำไม่เพียงพอ

หากต้องการไปเกิน 16 บิตฉันจะต้องหาวิธีตรวจสอบฝาปิดให้สมบูรณ์โดยไม่ต้องเก็บรายการตัวเลขทั้งหมดไม่เกิน N max (หรือไปเรียนรู้เกี่ยวกับทฤษฎีตัวเลข)

แก้ไข:ลดจำนวนรันไทม์สำหรับ 16 บิตจาก 66s เป็น 8s โดยการเติมรายการตัวเลขด้วยการเตรียมเฉพาะตัวเลขที่ไม่ได้ตัดออกโดยฐานที่มีประสิทธิภาพมากที่สุด สิ่งนี้ควรปรับปรุงรอยเท้าหน่วยความจำอย่างมีนัยสำคัญ

แก้ไข:ฉันได้เพิ่มการเพิ่มประสิทธิภาพย่อยสองประการเพื่อลดพื้นที่การค้นหา ไม่ใช่หมวดหมู่อย่างเป็นทางการ แต่จากที่ฉันพบปก 8 ฐานสำหรับ 24 บิตใน 9.3 ชั่วโมง:

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

สำหรับการปรับให้เหมาะสมตอนนี้ฉันกำลังข้ามฐานทั้งหมดซึ่งแบ่ง LCM ของฐานที่มีอยู่แล้วในหน้าปกและเมื่อฉันทดสอบประสิทธิภาพของฐานฉันจะทดสอบเฉพาะกับตัวเลขจนถึง LCM ของฐานใหม่นั้นและฐานทั้งหมดที่ฉันมีอยู่แล้ว มี.


1
@ToddLehman ฉันไม่ทราบว่าคุณเห็นทางออกแรกของฉันก่อนที่จะแก้ไขด้วยความโลภ (ดูที่ประวัติการแก้ไขหากคุณไม่ได้) ที่นั่นฉันเพิ่งจะเลือกเบสตามอัตราส่วน Hit / miss ทั่วไปของพวกเขาจนกว่าฉันจะได้ปกที่สมบูรณ์ นั่นให้ผล 8 ฐานสำหรับ 8 บิตและ 29 ฐานสำหรับ 16 บิต : D
Martin Ender

1
@ToddLehman ขอบคุณสำหรับการทดสอบ! :) ฉันสงสัยว่าคนที่มีความรู้ทฤษฎีจำนวนจริงอาจเกิดขึ้นได้อย่างไร ฉันมีความคิดสองสามข้อในการเร่งความเร็วดังนั้นฉันจึงสามารถไปที่ 24 บิต แต่ฉันคิดว่าฉันต้องมุ่งเน้นไปที่การท้าทายครั้งต่อไปของตัวเองในการติดตาม
Martin Ender

1
@ToddLehman มีหน้าปก 24 บิตให้คุณ ฉันสงสัยแล้วว่าฉันจะสามารถใช้ประโยชน์จากปัจจัยที่สำคัญ แต่ฉันยังไม่ได้มากับการแก้ปัญหาที่เหมาะสม ทั้งหมดที่ฉันทำได้คือปรับปรุงลำดับที่ฐานทดสอบ แต่ฉันยังไม่แน่ใจเมื่อฉันสามารถยกเลิกได้
Martin Ender

1
@ToddLehman คุณไม่จำเป็นต้องติดแท็กฉันในโพสต์ของฉันเพราะฉันจะได้รับการแจ้งเตือนต่อไป นั่นเป็นสาเหตุที่ SE ปิดใช้งานการเติมข้อความอัตโนมัติจนกว่าจะมีความคิดเห็นจากผู้ใช้หลายคนซึ่งมันอาจสมเหตุสมผลในการจัดการ OP โดยเฉพาะ
Martin Ender

1
เพิ่งพบฝาครอบ 9 ฐานสำหรับ 28 บิต: {15840, 15827, 16211, 12549, 14911, 15111, 9869, 14647, 16043} เวลาในการทำงานคือ 36.5 นาทีโดยใช้โปรแกรม C ที่ได้รับการปรับปรุงเพื่อประเมินความเหมาะสมโดยใช้การทำงานระดับบิตที่บรรจุโดยใช้อัลกอริทึมโลภ ชุดฐาน 9 ตัวนี้เป็นฝาปิดที่สมบูรณ์แบบสำหรับตัวเลขที่น้อยกว่า2²⁸และถูกต้อง 99.999983% สำหรับตัวเลขที่อยู่ในช่วง2⁶⁴
ทอดด์เลห์แมน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.