http://cr.yp.to/primegen.html पर आप प्रोग्राम के स्रोत ढूंढ सकते हैं जो प्राइम उत्पन्न करने के लिए एटकिन की चलनी का उपयोग करते हैं। जैसा कि लेखक कहते हैं कि उन्हें भेजे गए ई-मेल का जवाब देने में कुछ महीने लग सकते हैं (मैं समझता हूं कि, वह निश्चित रूप से एक कब्जा कर लिया आदमी है!) मैं यह प्रश्न पोस्ट कर रहा हूं।डीजे में 10^15 की सीमा कहां है। बर्नस्टीन का 'प्राइमजेन' कार्यक्रम आया है?
पृष्ठ बताता है कि 'प्राइमजेन 1000000000000000 तक प्राइम उत्पन्न कर सकता है'। मैं समझने की कोशिश कर रहा हूं कि ऐसा क्यों है। निश्चित रूप से 2^64 ~ 2 * 10^1 (लंबे हस्ताक्षर किए गए int का आकार) तक सीमित है क्योंकि इस प्रकार संख्याओं का प्रतिनिधित्व किया जाता है। मुझे यकीन है कि अगर एक बड़ा प्राइम गैप होगा (> 2^31) तो संख्याओं की प्रिंटिंग असफल हो जाएगी। हालांकि इस सीमा में मुझे लगता है कि ऐसा कोई प्रमुख अंतर नहीं है।
या तो लेखक ने बाध्यता (और वास्तव में यह लगभग 10^1 9) है या स्रोत कोड में एक जगह है जहां अंकगणितीय ऑपरेशन ओवरफ्लो या ऐसा कुछ हो सकता है।
अजीब बात यह है कि आप वास्तव में संख्या> 10^15 के लिए यह चला सकते है:
./primes 10000000000000000 10000000000000100
10000000000000061
10000000000000069
10000000000000079
10000000000000099
और यदि आपको लगता है Wolfram Alpha, यह सही है।
कुछ तथ्यों मैं "रिवर्स इंजीनियर" था:
- संख्या के 1,920 * PRIMEGEN_WORDS = 3,932,160 संख्या (primegen_next.c में primegen_fill समारोह देखें)
- PRIMEGEN_WORDS नियंत्रण कितना बड़ा एक भी बैचों में sifted कर रहे हैं sifting है - आप इसे अपने CPU कैश फिट करने के लिए primgen_impl.h में समायोजित कर सकते हैं,
- चलनी का कार्यान्वयन स्वयं keygen.c फ़ाइल में है - मुझे लगता है कि यह सही है; आपको जो मिलता है वह पीजी-> buf में प्राइम का बिटमैस्क है (प्राइमजेन_फिल फ़ंक्शन देखें)
- बिटमास्क का विश्लेषण किया जाता है और प्राइम को पीजी-> पी सरणी में संग्रहीत किया जाता है।
मुझे कोई बिंदु नहीं दिखता है कि ओवरफ़्लो हो सकता है।
मुझे याद नहीं है, लेकिन डीजेबी ने एसविंग प्राइम (इस प्रकार 32-बिट संख्या) के लिए हस्ताक्षरित पूर्णांक का उपयोग किया है, और चलनी (जैसे 64-बिट संख्या) द्वारा उत्पन्न किए गए प्राइम के लिए हस्ताक्षर किए गए पूर्णांक को एल्गोरिदम पर सीमा मानते हुए वास्तव में 2^64 है। डीजेबी द्वारा टिप्पणी एक _practical_ सीमा हो सकती है, क्योंकि उस सीमा पर बहने से काफी समय लगता है। – user448810