2011-09-27 11 views
15

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. संख्या के 1,920 * PRIMEGEN_WORDS = 3,932,160 संख्या (primegen_next.c में primegen_fill समारोह देखें)
  2. PRIMEGEN_WORDS नियंत्रण कितना बड़ा एक भी बैचों में sifted कर रहे हैं sifting है - आप इसे अपने CPU कैश फिट करने के लिए primgen_impl.h में समायोजित कर सकते हैं,
  3. चलनी का कार्यान्वयन स्वयं keygen.c फ़ाइल में है - मुझे लगता है कि यह सही है; आपको जो मिलता है वह पीजी-> buf में प्राइम का बिटमैस्क है (प्राइमजेन_फिल फ़ंक्शन देखें)
  4. बिटमास्क का विश्लेषण किया जाता है और प्राइम को पीजी-> पी सरणी में संग्रहीत किया जाता है।

मुझे कोई बिंदु नहीं दिखता है कि ओवरफ़्लो हो सकता है।

+0

मुझे याद नहीं है, लेकिन डीजेबी ने एसविंग प्राइम (इस प्रकार 32-बिट संख्या) के लिए हस्ताक्षरित पूर्णांक का उपयोग किया है, और चलनी (जैसे 64-बिट संख्या) द्वारा उत्पन्न किए गए प्राइम के लिए हस्ताक्षर किए गए पूर्णांक को एल्गोरिदम पर सीमा मानते हुए वास्तव में 2^64 है। डीजेबी द्वारा टिप्पणी एक _practical_ सीमा हो सकती है, क्योंकि उस सीमा पर बहने से काफी समय लगता है। – user448810

उत्तर

1

मेरी इच्छा है कि मैं अपने कंप्यूटर पर देखने के लिए था, लेकिन मुझे संदेह है कि अगर आप अपनी निचली बाउंड के रूप में 1 से शुरू करते हैं तो आपको अलग सफलता मिलेगी।

+0

इसका मतलब क्या है? "./primes 1 10000000000000099" segfault या कुछ भी के बिना शुरू होता है। यह हमेशा इस सीमा को छुटकारा पाने के लिए ले जाएगा, हालांकि, मैं पुष्टि नहीं कर सकता कि यह इस सीमा के लिए इन तरीकों से काम करता है। फिर भी, यदि यह _would_ दुर्घटनाग्रस्त है, तो चाल ** ** क्यों बताने के लिए है, स्पष्ट तथ्य यह बताने के लिए कि आप अपने कंसोल में "सेगमेंटेशन गलती" देखते हैं ... – thinred

0

बस एल्गोरिदम से, मैं निष्कर्ष निकालूंगा कि ऊपरी सीमा 32 बिट संख्याओं से आती है। पृष्ठ में पेंटियम -3 को सीपीयू के रूप में उल्लेख किया गया है, इसलिए मेरा अनुमान है कि यह बहुत पुराना है और 64 बिट का उपयोग नहीं करता है।

2^32 लगभग 10^9 हैं। एटकिन्स (जो एल्गोरिदम का उपयोग करता है) की चलनी एन^(1/2) बिट्स (यह एक बड़े बिटफील्ड का उपयोग करती है) की आवश्यकता होती है। जिसका अर्थ है 2^32 बड़ी मेमोरी में आप (conservativ) एन लगभग 10^15 बना सकते हैं। चूंकि यह संख्या एक मोटा रूढ़िवादी ऊपरी सीमा है (आपके पास सिस्टम और अन्य कार्यक्रम स्मृति पर कब्जा कर रहे हैं, आईओ के लिए पता श्रेणी आरक्षित है ...) असली ऊपरी सीमा उच्च/हो सकती है।

+0

यह एक अति-अनुमानित होगा: वर्ग (10^15) लगभग 31622776 है। यदि यह एक बिटफील्ड है तो यह आसानी से 4 एमबी में फिट हो सकता है। यह 2 जीबी की सीमा से नीचे है। इस तर्क का समर्थन करने के लिए - यदि आप प्राइमजेन चलाते हैं तो आप देखेंगे कि वास्तव में स्मृति खपत बहुत कम है। – thinred

संबंधित मुद्दे