कम से कम गैर-भाजक


11

SdS∀x∈S, d∤x

Denoteऔर । फ़ंक्शन F (x) पर विचार करें = x को विभाजित करने वाली कम से कम अभाज्य संख्या । यह देखना आसान है कि F (x) \ leq \ log x । और एक सेट S के लिए , F (S) = कम से कम प्राइम दें जो S के किसी भी तत्व को विभाजित नहीं करता है । हमारी ऊपरी सीमा हैn=|S|C=max(S)F(x)=xF(x)≤log⁡xSF(S)=S

F(S)≤F(lcm⁡(S))≤F(Cn)≤nlog⁡C.

इसलिए एक सरल जानवर बल एल्गोरिथ्म, जो 1 से n \ log C तक सभी संख्याओं की गणना nlog⁡Cकरता है और जाँचता है कि क्या यह S के किसी तत्व को विभाजित नहीं करता है S, बहुपद है और इसमें समय जटिलता O(n2log⁡C) ।

समस्या को हल करने का दूसरा तरीका एस के प्रत्येक तत्व के लिए सभी कारकों की गणना करना है Sऔर उन्हें जांचने के लिए ब्रूट-फोर्स एल्गोरिथ्म में उपयोग करना है यदि एक्स ओ (1) समय xमें उत्तर है । इस एल्गोरिथ्म में समय जटिलता O (n \ cdot \ min (\ sqrt {C}, n \ log C) + n \ log C) है और O (n \ log C) मेमोरी का उपयोग करता है , क्योंकि हमें गणना करने की आवश्यकता नहीं है और स्टोर कारक n \ log C से अधिक है । छोटे एन और सी के लिए यह बेहतर प्रदर्शन करता है।O(1)O(n⋅min(C,nlog⁡C)+nlog⁡C)O(nlog⁡C)nlog⁡CnC

विस्तार से, एल्गोरिथ्म में दो भाग होते हैं:

  1. निर्माण एक सेट के सभी तत्वों के सभी कारकों से बना , यानी यह समय और मेमोरी में किया जा सकता है। (यह कहां से आता है? के किसी भी तत्व के लिए , हम इसे सभी कारकों के साथ परीक्षण कारक के रूप में उपयोग कर सकते हैं, जिसमें सभी संख्याएँ या तक सभी primes हैं , जो भी छोटा हो; इस प्रकार का प्रत्येक तत्व समय में फैक्टर किया जा सकता है ।)S^S

    ∀x∈S ∀f≤n⋅log⁡C, (f∣x→f∈S^)
    O(n⋅min(C,nlog⁡C))O(nlog⁡C)SCnlog⁡CSO(min(C,nlog⁡C))
  2. न्यूनतम संख्या । इस चरण के लिए समय की आवश्यकता होती है, अगर जाँच की जाए कि क्या समय में किया जा सकता है ।d∉S^O(|S^|)=O(nlog⁡C)x∈S^O(1)

मेरे दो सवाल हैं जिनमें मेरी दिलचस्पी है:

  1. क्या समस्या को हल करने के लिए एक तेज़ एल्गोरिथम है?
  2. दिए गए और , हम अधिकतम न्यूनतम गैर-भाजक के साथ एक सेट कैसे बना सकते हैं ?nCS

1. पहले से "मैं" जानवर बल एल्गोरिथ्म शुरू करने से पहले था। 2. फैक्टरिंग की जटिलता वास्तव में उप-रूपात्मक है, की निश्चितता देखें । C
— SkyterX

@ 2W बिंदु पर, फैक्टरिंग की जटिलता संख्या का प्रतिनिधित्व करने वाले बिटस्ट्रिंग की लंबाई पर उपसंचाई है, लेकिन स्काईटरएक्स सही कहता है कि यह , जो आकार के वर्गमूल के समानुपाती है। रेखावृत्त। O(C)
— लेउवे विन्खुइजेन

@ LieuweVinkhuijzen, यह मेरे लिए सही नहीं लगता है। GNFS का उपयोग कर फैक्टरिंग की जटिलता जैसी कुछ होगी, जो इससे काफी कम है । En.wikipedia.org/wiki/… देखें । O(exp⁡{1.9(log⁡C)1/3(log⁡log⁡C)2/3})O(C)
— DW

यह कथन कि दूसरी विधि "छोटे और लिए" बेहतर प्रदर्शन करती है, बिल्कुल सही नहीं है। यह तभी बेहतर करता है जब । इस प्रकार को बेहतर प्रदर्शन करने के लिए दूसरी विधि के लिए बड़ा होना चाहिए (छोटा नहीं)। nCn≫C/log⁡(C)n
— डीडब्ल्यू

@ आप सही हैं, मुझे GNFS की जटिलता के बारे में पता नहीं था।
— लेउवे विन्खुइज़ेन

जवाबों:


6

पूर्णांक कारक के लिए बेहतर एल्गोरिदम का उपयोग करके अपने दूसरे एल्गोरिथ्म में सुधार करना संभव है।

पूर्णांक कारक के लिए दो एल्गोरिदम हैं जो यहां प्रासंगिक हैं:

  • GNFS रनिंग टाइम साथ एक पूर्णांक ।≤CO(LC[0.33,1.92])

  • ECM चल समय एक कारक (यदि कोई मौजूद है) ; सभी कारकों को खोजने में समय लगेगा (जो ECM के चलने के समय की तुलना में अपेक्षाकृत छोटा है)।≤nlog⁡CO(Lnlog⁡C[0.5,1.41])O(log⁡C/log⁡(nlog⁡C))

यहाँ ।Ln[α,c]=exp⁡{c(log⁡n)α(log⁡log⁡n)1−α}

दौड़ने के समय के लिए यह एक बहुत ही भयानक दिखने वाली अभिव्यक्ति है, लेकिन महत्वपूर्ण तथ्य यह है कि यह आपके द्वारा बताए गए तरीकों से तेज है। विशेष रूप से, , asymptotically से बहुत छोटा है , अर्थात, GNFS सभी संभावित कारकों कोशिश करने की तुलना में बहुत तेज़ है । इसके अलावा तुलना में रूप से बहुत छोटा , अर्थात, ECM सभी संभावित कारकों कोशिश करने की तुलना में बहुत तेज ।LC[0.33,1.92]C≤CLnlog⁡C[0.5,1.41]nlog⁡C≤nlog⁡C

तो, इस विधि के लिए कुल समय चल रहा है, मोटे तौर पर , और यह asymptotically आपके से बेहतर है पहली विधि और asymptotically आपकी दूसरी विधि से बेहतर है। मुझे नहीं पता कि क्या यह और भी बेहतर करना संभव है।O~(nmin(LC[0.33,1.92],Lnlog⁡C[0.5,1.41]))


मुझे लगता है, कि इस समस्या के लिए किसी भी तेज एल्गोरिथ्म में इनपुट सेट कुछ प्रकार के कारक शामिल होने चाहिए । मैं उन फैक्टराइजेशन एल्गोरिदम की जांच करूंगा, लेकिन अभी भी उन्हें सही तरीके से जांचने की समस्या है, जो एक दूसरी समस्या को बढ़ाता है जिसका मैंने अधिकतम जवाब के साथ सेट के निर्माण में उल्लेख किया है । SS
— स्काईटेरएक्स

ईसीएम आपके द्वारा दिए गए समय में एक कारक ढूंढता है । यदि किसी संख्या के सभी कारक C n लॉग सी हैं, तो आपको एल्गोरिथ्म को दोहराने की आवश्यकता है, लॉग सी / लॉग (एन लॉग सी) बार तक।
— gnasher729 23

3

कम से कम सामान्य गैर-भाजक N लॉग सी जितना बड़ा हो सकता है, लेकिन यदि एन संख्याओं को यादृच्छिक रूप से वितरित किया जाता है, तो कम से कम सामान्य गैर-भाजक संभवतः बहुत छोटा है, शायद एन की तुलना में बहुत कम है। primes किस संख्या के विभाजक हैं।

प्रत्येक अभाज्य संख्या p के लिए हमारे पास एक अनुक्रमणिका जिसका अर्थ है कि उस अनुक्रमणिका तक की सभी संख्याओं की जाँच p द्वारा विभाज्यता के लिए की गई है, और हमारे पास उन सभी नंबरों की एक सूची है, जिनके द्वारा विभाज्य थे।kp

फिर d = 2, 3, 4 के लिए, ... हम d द्वारा किसी संख्या को विभाज्य ज्ञात करने का प्रयास करते हैं, या यह दिखाते हैं कि कोई भी नहीं है। हम d का सबसे बड़ा मुख्य कारक p लेते हैं। फिर हम उन सभी नंबरों की जांच करते हैं जो पी द्वारा विभाज्य थे या नहीं, क्या वे भी डी से विभाज्य हैं। यदि कोई नहीं पाया जाता है, तो हम सूचकांकों> लिए p से विभाज्यता, अद्यतन करने और p द्वारा विभाज्य संख्याओं की सूची के साथ आगे की संख्याओं की जाँच करते हैं, और कि क्या प्रत्येक संख्या d से विभाज्य है।kpkp

यह जांचने के लिए कि क्या पी द्वारा विभाज्य संख्या है, हम औसत पी संख्याओं की जांच करते हैं। बाद में अगर हम जाँचते हैं कि क्या संख्या 2p से विभाज्य है, तो 50% संभावना है कि हमें केवल एक संख्या (जो कि p से विभाज्य है) की जाँच करने की आवश्यकता है, और औसत 2p अधिक संख्या पर जाँच के लिए 50% मौका। 3 पी द्वारा विभाज्य संख्या ज्ञात करना काफी तेजी से और इसी तरह संभव है, और हम कभी भी पी द्वारा विभाज्य के लिए एन संख्या से अधिक की जांच नहीं करते हैं, क्योंकि केवल एन नंबर हैं।

मुझे उम्मीद है कि यह डिवीजबिलिटी चेक के साथ काम करेगा ।N2/logN

पुनश्च। यादृच्छिक संख्या के लिए परिणाम कितना बड़ा होगा?

मान लें कि मेरे पास एन यादृच्छिक संख्या है। संभावना है कि एन संख्याओं में से एक डी द्वारा विभाज्य है - 1 (1 - 1 / डी) ^ एन। मैं इस संभावना को मानता हूं कि प्रत्येक संख्या 1 ≤ d a k यादृच्छिक संख्याओं में से एक का एक कारक है जो इन संभावनाओं को गुणा करके गणना की जाती है (ठीक है, यह थोड़ा विचित्र है, क्योंकि ये संभावनाएं काफी स्वतंत्र नहीं हैं)।

उस धारणा के साथ, N = 1000 के साथ, 50% संभावना है कि संख्या में से एक 1..244 किसी भी संख्या को विभाजित नहीं करता है, और एक अरब में है कि हर संख्या 507 तक संख्याओं में से एक को विभाजित करता है। N = 10,000 के साथ 50% संभावना है कि 1..1726 संख्याओं में से कोई भी संख्या को विभाजित नहीं करता है, और एक अरब में जो प्रत्येक संख्या 2979 तक एक संख्या को विभाजित करती है।

मैं चाहता हूं कि एन यादृच्छिक आदानों के लिए, परिणाम का आकार एन / एलएन एन की तुलना में थोड़ा बड़ा है; शायद N / ln N * (ln ln N) ^ 2 जैसा कुछ। यहाँ पर क्यों:

संभावना है कि एन यादृच्छिक संख्याओं में से कम से कम एक यादृच्छिक डी द्वारा विभाज्य है । यदि d N के चारों ओर है, तो लगभग 1 - exp (-1)। 0.6321 है। यह एक एकल भाजक के लिए है; संभावना है कि कई संख्याओं में से प्रत्येक d is N कम से कम एक N संख्या का भाजक है जो काफी पतला है, इसलिए अधिकतम d, N की तुलना में काफी छोटा होगा।1−(1−1/d)N1−(1−1/d)N

यदि d << N, तो ।1−(1−1/d)N≈1−exp(−N/d)

यदि घ ≈ एन / एन ln तो ।1−exp(−N/d)≈1−exp(−lnN)=1−1/N

हम इन संभावनाओं को N / ln N मान d के लिए जोड़ेंगे, लेकिन अधिकांश d के लिए परिणाम काफी बड़ा होगा, इसलिए सबसे बड़ा d किसी तरह N / ln N से बड़ा होगा, लेकिन N से काफी छोटा होगा।

पुनश्च। डी द्वारा विभाज्य संख्या खोजना:

हम d का सबसे बड़ा अभाज्य गुणनखंड उठाते हैं, और फिर हम पहले उन संख्याओं की जांच करते हैं जिन्हें पहले से ही p से विभाज्य माना जाता था। कह d = के.पी. फिर औसतन हम केवल उन संख्याओं की जाँच करते हैं जो इस विशेष d की जाँच करते समय p द्वारा विभाज्य हैं, और हम p द्वारा विभाज्य के लिए p, समग्र रूप से विभाज्यता के लिए सभी N मानों की जाँच करते हैं। वास्तव में, हम सबसे अधिक संभावना पी के लिए एन मानों की तुलना में कम जांच करते हैं, क्योंकि सभी एन मूल्यों की जांच के बाद एल्गोरिथ्म सबसे अधिक संभावना समाप्त होता है। इसलिए यदि परिणाम R है, तो मुझे उम्मीद है कि N मान से कम प्रत्येक R द्वारा विभाजित किया जा रहा है। R N N की तुलना में कम, यह N ^ 2 / लॉग एन चेक के बारे में है।

पुनश्च। कुछ परीक्षण चल रहे हैं

मैंने इस एल्गोरिथ्म को एन = 1,000,000 यादृच्छिक संख्याओं के साथ कुछ बार चलाया। 0. कम से कम सामान्य गैर-भाजक 68,000 और 128,000 के बीच था, जिसमें 100,000 और 120,000 के बीच अधिकांश रन थे। विभाजनों की संख्या 520 मिलियन और 1800 मिलियन के बीच थी जो कि (N / ln N) ^ 2 से बहुत कम है; 1000 और 1500 मिलियन डिवीजनों के बीच इस्तेमाल होने वाले अधिकांश मामले।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.