non-divisor ที่น้อยที่สุดอาจมีขนาดใหญ่เท่ากับ N log C แต่ถ้าจำนวน N กระจายแบบสุ่มแล้ว non-divisor ทั่วไปที่น้อยที่สุดน่าจะเล็กกว่ามากอาจน้อยกว่า N มากฉันจะสร้างตารางที่ ช่วงเวลาเป็นตัวหารของตัวเลข
สำหรับแต่ละหมายเลขเฉพาะ p เรามีดัชนีซึ่งหมายความว่าตัวเลขทั้งหมดจนถึงดัชนีนั้นได้รับการตรวจสอบการหารด้วย p และเรามีรายการตัวเลขทั้งหมดที่หารด้วยkp
จากนั้นสำหรับ d = 2, 3, 4, ... เราพยายามหาตัวเลขหารด้วย d หรือแสดงว่าไม่มี เราใช้ค่าตัวประกอบเฉพาะ p ที่ใหญ่ที่สุดของ d จากนั้นเราตรวจสอบตัวเลขทั้งหมดที่หารด้วย p ไม่ว่าพวกมันหารด้วย d หรือไม่ หากไม่พบเราจะตรวจสอบตัวเลขเพิ่มเติมด้วยดัชนี>สำหรับการหารด้วย p อัปเดตและรายการตัวเลขที่หารด้วย p และตรวจสอบว่าแต่ละตัวเลขหารด้วย d หรือไม่kpkp
ในการตรวจสอบว่ามีตัวเลขหารด้วย p หรือไม่เราจะตรวจสอบหมายเลข p โดยเฉลี่ย ในภายหลังหากเราตรวจสอบว่ามีตัวเลขหารด้วย 2p มีโอกาส 50% ที่เราต้องตรวจสอบเพียงหมายเลขเดียว (ตัวเลขที่หารด้วย p) และมีโอกาส 50% สำหรับการตรวจสอบโดยเฉลี่ยอีก 2p การหาจำนวนที่หารด้วย 3p นั้นค่อนข้างเร็วและต่อไปและเราไม่เคยตรวจสอบตัวเลข N มากกว่าสำหรับการหารด้วย p เพราะมีเพียงตัวเลข N เท่านั้น
ฉันหวังว่าสิ่งนี้จะได้ผลโดยใช้การตรวจสอบการแบ่งแยกเกี่ยวกับN2/logN
PS ผลลัพธ์จะมีขนาดใหญ่เท่าใดสำหรับตัวเลขสุ่ม
สมมติว่าฉันมีตัวเลขสุ่ม N ตัว ความน่าจะเป็นที่ตัวเลข N ตัวใดตัวหนึ่งหารด้วย d ได้คือ 1 - (1 - 1 / d) ^ N ฉันถือว่าความน่าจะเป็นที่ตัวเลขแต่ละตัว 1 ≤ d ≤ k เป็นปัจจัยหนึ่งของตัวเลขสุ่มที่คำนวณโดยการคูณความน่าจะเป็นเหล่านี้ (โอเคนั่นเป็นบิตที่ค่อนข้างหลบเพราะความน่าจะเป็นเหล่านี้ไม่ค่อยอิสระ
ด้วยสมมติฐานดังกล่าวด้วย N = 1,000 มีโอกาส 50% ที่หนึ่งในตัวเลข 1..244 ไม่ได้หารตัวเลขใด ๆ และหนึ่งในพันล้านที่ทุก ๆ ตัวเลขที่มากถึง 507 จะหารตัวเลขหนึ่งตัว ด้วย N = 10,000 มีโอกาส 50% ที่หนึ่งในตัวเลข 1..1726 ไม่ได้หารตัวเลขใด ๆ และหนึ่งในพันล้านที่ทุก ๆ ตัวเลขที่มากถึง 2979 หารตัวเลขหนึ่งตัว
ฉันจะเสนอว่าสำหรับอินพุตแบบสุ่มของ N ขนาดของผลลัพธ์นั้นใหญ่กว่า N / ln N เล็กน้อย อาจจะเป็นอะไรที่เหมือน N / ln N * (ln ln N) ^ 2 นี่คือเหตุผล:
น่าจะเป็นที่อย่างน้อยหนึ่งของตัวเลขสุ่ม N คือหารด้วยสุ่ม d เป็น N ถ้า d มีค่าประมาณ N ดังนั้นจะมีค่าประมาณ 1 - exp (-1) ≈ 0.6321 สำหรับตัวหารเดียว โอกาสที่แต่ละหมายเลขหลายตัว d d N เป็นตัวหารอย่างน้อยหนึ่งหมายเลข N นั้นค่อนข้างผอมดังนั้นค่า d สูงสุดจะเล็กกว่า N อย่างมาก1−(1−1/d)N1−(1−1/d)N
หาก d << N แล้วD)1−(1−1/d)N≈1−exp(−N/d)
หาก d ≈ N / LN N แล้วกด N1−exp(−N/d)≈1−exp(−lnN)=1−1/N
เราจะเพิ่มความน่าจะเป็นเหล่านี้สำหรับค่า N / ln N แต่สำหรับ d ส่วนใหญ่ผลลัพธ์จะใหญ่ขึ้นอย่างมีนัยสำคัญดังนั้นค่า d ที่ใหญ่ที่สุดจะมีขนาดใหญ่กว่า N / ln N อย่างใดอย่างหนึ่ง แต่เล็กกว่า N อย่างมาก
PS การหาจำนวนหารด้วย d:
เราเลือกไพร์มแฟคเตอร์ p ที่ใหญ่ที่สุดจากนั้นเราตรวจสอบตัวเลขที่รู้กันแล้วว่าหารด้วย p พูด d = kp จากนั้นโดยเฉลี่ยเราจะตรวจสอบตัวเลข k ที่หารด้วย p ในขณะที่ตรวจสอบ d นี้โดยเฉพาะและเราตรวจสอบค่า N ทั้งหมดสำหรับการหารด้วย p โดยรวมแล้วสำหรับทั้งหมด d หารด้วย p ที่จริงแล้วเราน่าจะตรวจสอบน้อยกว่าค่า N สำหรับช่วงเวลาส่วนใหญ่ p เพราะหลังจากการตรวจสอบค่า N ทั้งหมดอัลกอริทึมที่น่าจะสิ้นสุด ดังนั้นหากผลลัพธ์คือ R ดังนั้นฉันคาดว่าค่า N น้อยกว่าจะถูกหารด้วยนายกแต่ละตัวน้อยกว่า R สมมติว่า R ≤ N นั่นคือประมาณ N ^ 2 / log N การตรวจสอบ
PS ใช้การทดสอบบางอย่าง
ฉันใช้อัลกอริธึมนี้สองสามครั้งโดยมีตัวเลขสุ่ม = N = 1,000,000> 0 ตัวหารที่ไม่ธรรมดาที่พบน้อยที่สุดคือระหว่าง 68,000 ถึง 128,000 โดยที่ส่วนใหญ่วิ่งระหว่าง 100,000 ถึง 120,000 จำนวนแผนกอยู่ระหว่าง 520 ล้านถึง 1,800 ล้านซึ่งน้อยกว่า (N / ln N) ^ 2; กรณีส่วนใหญ่ใช้ระหว่าง 1,000 ถึง 1,500 ล้านดิวิชั่น